WWW2Exec - GOT/PLT
Last updated
Last updated
सीखें और प्रैक्टिस करें AWS हैकिंग: HackTricks प्रशिक्षण AWS रेड टीम एक्सपर्ट (ARTE) सीखें और प्रैक्टिस करें GCP हैकिंग: HackTricks प्रशिक्षण GCP रेड टीम एक्सपर्ट (GRTE)
ग्लोबल ऑफसेट टेबल (GOT) एक तंत्र है जो डायनामिक रूप से लिंक किए गए बाइनरी में बाहरी फ़ंक्शनों के पतों का प्रबंधन करने के लिए उपयोग किया जाता है। क्योंकि ये पते रनटाइम तक नहीं पते होते (डायनामिक लिंकिंग के कारण), GOT एक तरीका प्रदान करता है इन बाहरी प्रतीकों के पतों को डायनामिक रूप से अपडेट करने के लिए एक तरीका।
GOT में प्रत्येक प्रविष्टि एक प्रतीक से मेल खाती है जो बाइनरी द्वारा कॉल किए जा सकते हैं। जब एक फ़ंक्शन पहली बार कॉल होता है, तो उसका वास्तविक पता डायनामिक लिंकर द्वारा सुलझाया जाता है और GOT में संग्रहीत किया जाता है। उसके बाद, उसी फ़ंक्शन के लिए दुबारा कॉल करने पर, GOT में संग्रहीत पते का उपयोग किया जाता है, इस प्रकार पता फिर से सुलझाने के ओवरहेड से बचा जाता है।
प्रोसीजर लिंकेज टेबल (PLT) GOT के साथ मिलकर काम करती है और बाहरी फ़ंक्शनों को कॉल करने के लिए एक ट्रैम्पोलीन के रूप में काम करती है। जब एक बाइनरी एक बाहरी फ़ंक्शन को पहली बार कॉल करता है, तो उस फ़ंक्शन के साथ संबंधित PLT में एक प्रविष्टि में नियंत्रण पास किया जाता है। यह PLT प्रविष्टि डायनामिक लिंकर को आमंत्रित करने के लिए जिम्मेदार होती है कि यदि पता सुलझाया नहीं गया है तो फ़ंक्शन का पता सुलझाए। पता सुलझाने के बाद, यह GOT में संग्रहीत किया जाता है।
इसलिए, बाहरी फ़ंक्शन या चर के पते सुलझाने के बाद GOT प्रविष्टियों का सीधा उपयोग किया जाता है। PLT प्रविष्टियों का उपयोग पहले सुलझाने के द्वारा इन पतों का पता लगाने के लिए किया जाता है डायनामिक लिंकर के माध्यम से।
objdump -s -j .got ./exec
के साथ GOT टेबल का पता प्राप्त करें
GEF में एक्सीक्यूटेबल को लोड करने के बाद आप देख सकते हैं कि GOT में कौन से फ़ंक्शन हैं: gef➤ x/20x 0xADDR_GOT
GEF का उपयोग करके आप डीबगिंग सत्र शुरू कर सकते हैं और got
को निष्पादित करने के लिए गॉट टेबल देख सकते हैं:
एक बाइनरी में GOT में फ़ंक्शनों के पते या PLT **खंड के पते होते हैं जो फ़ंक्शन पता लोड करेगा। इस अर्बिट्रेरी राइट का लक्ष्य है कि एक GOT प्रविष्टि को ओवरराइड करना है जो बाद में system
फ़ंक्शन के पते के साथ।
आदर्शन, आपको एक फ़ंक्शन के GOT को ओवरराइड करना है जो आपके द्वारा नियंत्रित पैरामीटरों के साथ कॉल किया जाने वाला है (इस प्रकार आपको सिस्टम फ़ंक्शन को भेजे गए पैरामीटरों को नियंत्रित करने की क्षमता होगी)।
यदि system
बाइनरी द्वारा उपयोग नहीं किया जाता है, तो सिस्टम फ़ंक्शन PLT में एक प्रविष्टि नहीं होगी। इस स्थिति में, आपको पहले system
फ़ंक्शन का पता लीक करने की आवश्यकता होगी और फिर GOT को इस पते पर पॉइंट करने के लिए ओवरराइट करना होगा।
आप objdump -j .plt -d ./vuln_binary
के साथ PLT पते देख सकते हैं।
libc का GOT आम तौर पर आंशिक RELRO के साथ कॉम्पाइल किया जाता है, इसे एक अच्छा लक्ष्य बनाने के लिए माना जाता है यदि इसका पता लगाना संभव है (ASLR)।
libc के सामान्य फ़ंक्शन अन्य आंतरिक फ़ंक्शनों को कॉल करेंगे जिनका GOT ओवरराइट किया जा सकता है ताकि कोड निष्पादन प्राप्त किया जा सके।
इस तकनीक के बारे में अधिक जानकारी यहाँ मिलेगी।
हीप उत्पीडन CTFs में आम तौर पर चंक की सामग्री को नियंत्रित करने की क्षमता होती है और कभी-कभी GOT टेबल को ओवरराइट करने की संभावना होती है। यदि एक गैजेट उपलब्ध नहीं है तो free
GOT पता को system
को पॉइंट करने के लिए ओवरराइट करने का एक सरल ट्रिक है और चंक में "/bin/sh"
लिखने के लिए। इस प्रकार जब यह चंक मुक्त होता है, तो यह system("/bin/sh")
निष्पादित करेगा।
एक और सामान्य तकनीक है कि strlen
GOT पता को system
को पॉइंट करने के लिए ओवरराइट किया जाए, इसलिए यदि इस फ़ंक्शन को उपयोगकर्ता इनपुट के साथ कॉल किया जाता है तो स्ट्रिंग "/bin/sh"
पास करने की संभावना है और एक शैली प्राप्त करने के लिए शैली प्राप्त करने की संभावना है।
इसके अतिरिक्त, यदि puts
का उपयोग उपयोगकर्ता इनपुट के साथ किया जाता है, तो strlen
GOT पता को system
को पॉइंट करने के लिए ओवरराइट किया जा सकता है और
पूर्ण RELRO सुरक्षा इस प्रकार की तकनीक के खिलाफ सुरक्षा प्रदान करने के लिए है जिसमें बाइनरी शुरू होने पर सभी फ़ंक्शनों के पतों को हल करके और इसके बाद GOT टेबल को केवल पढ़ने योग्य बनाते हैं:
RelroAWS हैकिंग सीखें और प्रैक्टिस करें:HackTricks Training AWS Red Team Expert (ARTE) GCP हैकिंग सीखें और प्रैक्टिस करें: HackTricks Training GCP Red Team Expert (GRTE)