PIE
मौलिक जानकारी
एक PIE रूप में कंपाइल किया गया बाइनरी, या स्थिति स्वतंत्र कार्यक्षम, का मतलब है कि प्रोग्राम हर बार विभिन्न मेमोरी स्थानों पर लोड हो सकता है जब भी यह निष्पादित किया जाता है, हार्डकोड किए गए पतों को रोकते हैं।
इन बाइनरी को उत्पीड़ित करने का तरीका संबंधित पतों का शोषण करने में है—प्रोग्राम के भागों के बीच के अंतर समान रहते हैं चाहे अवशेष स्थान बदल जाए। PIE को बाइपास करने के लिए, आपको केवल एक पता लीक करने की आवश्यकता है, सामान्यत: स्टैक से, जैसे कि फॉर्मेट स्ट्रिंग हमलों जैसे दुरुपयोग करके। एक बार जब आपके पास एक पता होता है, तो आप उन्हें उनके निश्चित ऑफसेट के द्वारा हिसाब से कर सकते हैं।
PIE बाइनरी का शोषण करने में एक सहायक संकेत है कि उनका बेस पता सामान्यत: 000 समाप्त होता है क्योंकि मेमोरी पेज यादृच्छिकता की इकाइयाँ होती हैं, जो 0x1000 बाइट के आकार में होती हैं। यह समरूपण एक महत्वपूर्ण जांच हो सकती है यदि एक उत्पीड़न काम नहीं कर रहा जैसा कि अपेक्षित था, यह दर्शाता है कि क्या सही बेस पता पहचाना गया है।
या आप इसे अपने उत्पीड़न के लिए उपयोग कर सकते हैं, यदि आप लीक करते हैं कि एक पता 0x649e1024
पर स्थित है तो आप जानते हैं कि बेस पता 0x649e1000
है और फिर से आप सिर्फ फ़ंक्शन और स्थानों के ऑफसेट हिसाब से हिसाब लगा सकते हैं।
बाइपास
PIE को बाइपास करने के लिए लोड किए गए बाइनरी का कुछ पता लीक करने की आवश्यकता है, इसके लिए कुछ विकल्प हैं:
ASLR अक्षम: यदि ASLR अक्षम है तो PIE के साथ कंपाइल किया गया बाइनरी हमेशा एक ही पते पर लोड होगा, इसलिए PIE बेकार हो जाएगा क्योंकि वस्तुओं के पते हमेशा एक ही स्थान पर होंगे।
लीक को दिया जाता है (आसान CTF चैलेंज में सामान्य, इस उदाहरण की जाँच करें)
स्टैक में सही वैल्यूज को लीक करने तक ब्रूट-फ़ोर्स EBP और EIP मान:
एक ऐच्छिक पठन पढ़ने की कमजोरी का उपयोग करें जैसे फॉर्मेट स्ट्रिंग एक पता लीक करने के लिए बाइनरी का (उदाहरण के लिए स्टैक से, पिछली तकनीक में) उपयोग करने के लिए जैसे कि बाइनरी का बेस प्राप्त करने और वहां से ऑफसेट का उपयोग करने। यहाँ एक उदाहरण खोजें.
संदर्भ
Last updated