BF Addresses in the Stack
Last updated
Last updated
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
यदि आप एक बाइनरी का सामना कर रहे हैं जो एक कैनरी और PIE (पोजीशन इंडिपेंडेंट एक्सीक्यूटेबल) द्वारा सुरक्षित है, तो आपको शायद उन्हें बायपास करने का एक तरीका खोजने की आवश्यकता है।
ध्यान दें कि checksec
यह नहीं पहचान सकता है कि एक बाइनरी कैनरी द्वारा सुरक्षित है यदि इसे स्थिर रूप से संकलित किया गया है और यह फ़ंक्शन की पहचान करने में असमर्थ है।
हालांकि, आप इसे मैन्युअल रूप से देख सकते हैं यदि आप पाते हैं कि एक मान फ़ंक्शन कॉल की शुरुआत में स्टैक में सहेजा गया है और इस मान की जांच बाहर निकलने से पहले की जाती है।
PIE को बायपास करने के लिए आपको कुछ पते लीक करने की आवश्यकता है। और यदि बाइनरी कोई पते लीक नहीं कर रही है, तो इसे करने का सबसे अच्छा तरीका है कमजोर फ़ंक्शन में स्टैक में सहेजे गए RBP और RIP को ब्रूट-फोर्स करना। उदाहरण के लिए, यदि एक बाइनरी को कैनरी और PIE दोनों का उपयोग करके सुरक्षित किया गया है, तो आप कैनरी को ब्रूट-फोर्स करना शुरू कर सकते हैं, फिर अगले 8 बाइट्स (x64) सहेजे गए RBP होंगे और अगले 8 बाइट्स सहेजे गए RIP होंगे।
यह माना जाता है कि स्टैक के अंदर लौटने वाला पता मुख्य बाइनरी कोड से संबंधित है, जो, यदि कमजोर बिंदु बाइनरी कोड में स्थित है, तो आमतौर पर ऐसा ही होगा।
बाइनरी से RBP और RIP को ब्रूट-फोर्स करने के लिए, आप यह पता लगा सकते हैं कि एक मान्य अनुमानित बाइट सही है यदि प्रोग्राम कुछ आउटपुट करता है या यह बस क्रैश नहीं होता है। कैनरी को ब्रूट-फोर्स करने के लिए प्रदान की गई समान फ़ंक्शन का उपयोग RBP और RIP को ब्रूट-फोर्स करने के लिए किया जा सकता है:
आपको PIE को हराने के लिए अंतिम चीज़ यह है कि लीक किए गए पते से उपयोगी पते की गणना करें: RBP और RIP।
RBP से आप यह गणना कर सकते हैं कि आप स्टैक में अपना शेल कहाँ लिख रहे हैं। यह जानना बहुत उपयोगी हो सकता है कि आप स्टैक के अंदर स्ट्रिंग "/bin/sh\x00" कहाँ लिखने जा रहे हैं। लीक किए गए RBP और आपके शेलकोड के बीच की दूरी की गणना करने के लिए, आप बस RBP लीक करने के बाद एक ब्रेकपॉइंट डाल सकते हैं और चेक कर सकते हैं कि आपका शेलकोड कहाँ स्थित है, फिर, आप शेलकोड और RBP के बीच की दूरी की गणना कर सकते हैं:
From the RIP you can calculate the base address of the PIE binary which is what you are going to need to create a valid ROP chain.
To calculate the base address just do objdump -d vunbinary
and check the disassemble latest addresses:
इस उदाहरण में आप देख सकते हैं कि सभी कोड को स्थानांतरित करने के लिए केवल 1 बाइट और आधा आवश्यक है, फिर, इस स्थिति में आधार पता लीक किए गए RIP पर होगा लेकिन "000" पर समाप्त होगा। उदाहरण के लिए, यदि आपने 0x562002970ecf
लीक किया है तो आधार पता 0x562002970000
है।
इस पोस्ट से कुछ अवलोकनों के अनुसार, यह संभव है कि जब RBP और RIP मानों को लीक किया जाता है, तो कुछ मानों के साथ सर्वर क्रैश नहीं होगा जो सही नहीं हैं और BF स्क्रिप्ट सोचती है कि उसे अच्छे मान मिल गए हैं। इसका कारण यह है कि कुछ पते बस इसे तोड़ नहीं पाएंगे भले ही वे बिल्कुल सही न हों।
उस ब्लॉग पोस्ट के अनुसार, सर्वर के लिए अनुरोधों के बीच एक छोटा विलंब जोड़ने की सिफारिश की गई है।
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)