WWW2Exec - GOT/PLT
मूल जानकारी
GOT: ग्लोबल ऑफसेट टेबल
ग्लोबल ऑफसेट टेबल (GOT) एक तंत्र है जो डायनामिक लिंक किए गए बाइनरी में बाहरी फ़ंक्शनों के पतों का प्रबंधन करने के लिए उपयोग किया जाता है। क्योंकि ये पते रनटाइम तक नहीं पते होते (डायनामिक लिंकिंग के कारण), GOT एक तरीका प्रदान करता है इन बाहरी प्रतीकों के पतों को डायनामिक रूप से अपडेट करने के लिए जब वे हल हो जाते हैं।
GOT में प्रत्येक प्रविष्टि एक प्रतीक का संदर्भ करती है जो बाइनरी द्वारा कॉल किए जा सकते हैं। जब एक फ़ंक्शन पहली बार कॉल होता है, तो उसका वास्तविक पता डायनामिक लिंकर द्वारा हल किया जाता है और GOT में संग्रहीत किया जाता है। उसके बाद किए गए कॉल्स में वही पता उपयोग किया जाता है जो GOT में संग्रहीत है, इसलिए पता फिर से हल करने के ओवरहेड से बचा जाता है।
PLT: प्रोसीजर लिंकेज टेबल
प्रोसीजर लिंकेज टेबल (PLT) GOT के साथ काम करती है और बाहरी फ़ंक्शनों को कॉल करने के लिए एक ट्रैम्पोलीन के रूप में काम करती है। जब एक बाइनरी पहली बार एक बाहरी फ़ंक्शन को कॉल करता है, तो उस फ़ंक्शन के साथ संबंधित PLT में एक प्रविष्टि में नियंत्रण पास किया जाता है। यह PLT प्रविष्टि डायनामिक लिंकर को आमंत्रित करने के लिए जिम्मेदार होती है ताकि यदि पता हल नहीं किया गया है तो फ़ंक्शन का पता हल किया जा सके। पता हल होने के बाद, यह GOT में संग्रहीत किया जाता है।
इसलिए, GOT प्रविष्टियों का सीधा उपयोग किया जाता है जब बाहरी फ़ंक्शन या प्रतीक का पता हल होता है। PLT प्रविष्टियों का उपयोग पहले हल करने के लिए इन पतों का उपयोग करने के लिए डायनामिक लिंकर के माध्यम से किया जाता है।
निष्पादन प्राप्त करें
GOT की जाँच
objdump -s -j .got ./exec
के साथ GOT टेबल का पता प्राप्त करें
GEF में एक बार executable को लोड करने के बाद आप देख सकते हैं कि GOT में कौन-कौन से फ़ंक्शन हैं: gef➤ x/20x 0xDIR_GOT
GEF का उपयोग करके आप डीबगिंग सत्र शुरू कर सकते हैं और got
को निष्पादित करने के लिए GOT टेबल देख सकते हैं:
GOT2Exec
एक बाइनरी में GOT में फ़ंक्शनों के पते या PLT खंड के पते होते हैं जो फ़ंक्शन पते को लोड करेगा। इस अर्बिट्रेरी राइट का लक्ष्य है किसी ऐसी गोट प्रविष्टि को ओवरराइड करना जो बाद में उचित किया जाएगा system
फ़ंक्शन के PLT का पता।
आदर्शन, आपको एक फ़ंक्शन की GOT को ओवरराइड करना है जिसे आपके द्वारा नियंत्रित पैरामीटर के साथ कॉल किया जाएगा (इसलिए आप सिस्टम फ़ंक्शन को भेजे गए पैरामीटर को नियंत्रित कर सकेंगे)।
यदि system
किसी स्क्रिप्ट द्वारा उपयोग नहीं किया जाता है, तो सिस्टम फ़ंक्शन PLT में एक प्रविष्टि नहीं होगी। इस स्थिति में, आपको पहले system
फ़ंक्शन का पता लीक करने की आवश्यकता होगी और फिर GOT को इस पते पर पॉइंट करने के लिए ओवरराइड करना होगा।
आप objdump -j .plt -d ./vuln_binary
के साथ PLT पतों को देख सकते हैं।
libc GOT प्रविष्टियाँ
libc की GOT आम तौर पर आंशिक RELRO के साथ कॉम्पाइल की जाती है, इसे एक अच्छा लक्ष्य बनाते हैं यदि इसका पता लगाना संभव है (ASLR)।
libc के सामान्य फ़ंक्शन अन्य आंतरिक फ़ंक्शनों को कॉल करेंगे जिनकी GOT को ओवरराइट किया जा सकता है ताकि कोड निष्पादन प्राप्त किया जा सके।
इस तकनीक के बारे में अधिक जानकारी यहाँ पाएं।
वन गैजेट
pageOne Gadgetसुरक्षा उपाय
पूर्ण RELRO सुरक्षा इस प्रकार की तकनीक के खिलाफ सुरक्षा प्रदान करने के लिए है जिसमें बाइनरी शुरू होने पर सभी फ़ंक्शनों के पतों को हल करने और इसके बाद GOT टेबल को केवल पढ़ने योग्य बनाने के लिए:
pageRelroसंदर्भ
Last updated