PIE
{{#include ../../../../banners/hacktricks-training.md}}
Basic Information
एक बाइनरी जिसे PIE, या Position Independent Executable के रूप में संकलित किया गया है, का मतलब है कि प्रोग्राम हर बार इसे निष्पादित करने पर विभिन्न मेमोरी स्थानों पर लोड हो सकता है, हार्डकोडेड पते को रोकता है।
इन बाइनरीज़ का शोषण करने की चाल सापेक्ष पते का शोषण करना है—प्रोग्राम के भागों के बीच के ऑफसेट समान रहते हैं भले ही निरपेक्ष स्थान बदल जाए। PIE को बायपास करने के लिए, आपको केवल एक पता लीक करने की आवश्यकता है, आमतौर पर स्टैक से, जैसे कि फॉर्मेट स्ट्रिंग हमलों का उपयोग करके। एक बार जब आपके पास एक पता हो, तो आप उनके फिक्स्ड ऑफसेट्स द्वारा अन्य का अनुमान लगा सकते हैं।
PIE बाइनरीज़ का शोषण करने में एक सहायक संकेत यह है कि उनका बेस पता आमतौर पर 000 पर समाप्त होता है क्योंकि मेमोरी पृष्ठ यादृच्छिकता के इकाइयाँ होते हैं, जो 0x1000 बाइट्स के आकार के होते हैं। यह संरेखण एक महत्वपूर्ण जांच हो सकती है यदि कोई शोषण अपेक्षित रूप से काम नहीं कर रहा है, यह संकेत करता है कि क्या सही बेस पता पहचाना गया है।
या आप इसे अपने शोषण के लिए उपयोग कर सकते हैं, यदि आप लीक करते हैं कि एक पता 0x649e1024 पर स्थित है, तो आप जानते हैं कि बेस पता 0x649e1000 है और वहां से आप बस फंक्शंस और स्थानों के ऑफसेट्स की गणना कर सकते हैं।
Bypasses
PIE को बायपास करने के लिए लोड की गई बाइनरी का कुछ पता लीक करना आवश्यक है, इसके लिए कुछ विकल्प हैं:
- ASLR बंद: यदि ASLR बंद है, तो PIE के साथ संकलित बाइनरी हमेशा एक ही पते पर लोड होने वाली है, इसलिए PIE बेकार होने वाली है क्योंकि वस्तुओं के पते हमेशा एक ही स्थान पर होंगे।
- लीक प्राप्त करना (आसान CTF चुनौतियों में सामान्य, इस उदाहरण की जांच करें)
- स्टैक में EBP और EIP मानों को ब्रूट-फोर्स करना जब तक कि आप सही लीक नहीं करते:
{{#ref}} bypassing-canary-and-pie.md {{#endref}}
- एक मनमाना पढ़ने की कमजोरी का उपयोग करें जैसे कि फॉर्मेट स्ट्रिंग बाइनरी का एक पता लीक करने के लिए (जैसे, स्टैक से, पिछले तकनीक की तरह) बाइनरी का बेस प्राप्त करने के लिए और वहां से ऑफसेट्स का उपयोग करें। यहां एक उदाहरण खोजें.
References
{{#include ../../../../banners/hacktricks-training.md}}