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