पर्यावरण चर का स्थान इतना भिन्न क्यों होता है?


9

जॉन एरिकसन द्वारा पुस्तक हैकिंग: द आर्ट ऑफ एक्सप्लुइटेशन पढ़ना, मैं SHELLCODEएक प्रोग्राम का फायदा उठाने के लिए एक पर्यावरण चर के पते को अनुमानित करने की कोशिश कर रहा हूं ।

हर बार जब मैं getenv("SHELLCODE");स्थान पाने के लिए दौड़ता हूं , तो परिणाम पूरी तरह से अलग होता है।

मेरे शेल से निकालें:

> for i in $(seq 10); do ./a.out SHELLCODE; done
SHELLCODE is at 0xff9ab3a3
SHELLCODE is at 0xffcdb3a3
SHELLCODE is at 0xffb9a3a3
SHELLCODE is at 0xffa743a3
SHELLCODE is at 0xffdb43a3
SHELLCODE is at 0xfff683a3
SHELLCODE is at 0xffef03a3
SHELLCODE is at 0xffc1c3a3
SHELLCODE is at 0xff85a3a3
SHELLCODE is at 0xff8e03a3

मैं समझता हूं कि यदि कार्यक्रम का नाम संशोधित किया गया है या नए पर्यावरण चर जोड़े गए हैं, तो स्थिति थोड़ी अलग होगी, लेकिन स्थान इतना भिन्न क्यों होता है?


getenvमैनुअल यह एक स्ट्रिंग वेरिएबल का मान युक्त करने के लिए एक सूचक रिटर्न कहते हैं। बाकी सब कुछ अनिर्दिष्ट है, इसलिए आपका कर्नेल और / या कंपाइलर जहां चाहे वहां मान को चिपका सकते हैं, जब तक कि सूचक-वादा सही रहता है। मैं सटीक उत्तर का अनुमान लगा रहा हूं कि यह बहुत भारी हो सकता है और विभिन्न मेमोरी मैपिंग कार्यान्वयन विवरण और चंद्रमा के चरण पर निर्भर करता है। (मैं आपको सटीक जवाब देने के लिए पर्याप्त नहीं हूं।)
अनको

"मैं समझता हूं कि यदि कार्यक्रम का नाम संशोधित किया गया है या नए पर्यावरण चर जोड़े गए हैं, तो स्थिति थोड़ी भिन्न होगी, लेकिन स्थान इतना भिन्न क्यों होता है?" यह सभी संभव कार्यान्वयनों में सबसे सरल है, लेकिन निश्चित रूप से इसकी आवश्यकता नहीं है।
dmckee --- पूर्व-मध्यस्थ ने बिल्ली का बच्चा

जवाबों:


13

आप जो वर्णन करते हैं वह एक एंटी-शोषण सुविधा है जिसे एड्रेस स्पेस लेआउट रैंडमाइजेशन (एएसएलआर) कहा जाता है । मूल रूप से, कर्नेल प्रोग्राम के फ़ंक्शन कॉल स्टैक के बहुत ही शीर्ष पते को थोड़ा अलग ("यादृच्छिक") पते पर रखता है हर बार जब कर्नेल डिस्क से प्रोग्राम की ईएलएफ फ़ाइल को लोड करता है। argvपर्यावरण के चर और पते , जिनमें से आपका शेलकोड एक है, प्रत्येक प्रोग्राम इनवोकेशन के साथ एक अलग पते पर समाप्त होता है।

एएसएलआर माना जाता है कि यह बफर-ओवरफ्लो और अन्य स्टैक-संबंधित कमजोरियों का शोषण करने के लिए कठिन बनाता है। फ़ंक्शन कॉल स्टैक पर चर और मूल्यों के अलग-अलग पते के लिए शोषक को कोड लिखना है या कुछ करना है।

ऐसा लगता है कि आप कुछ ऐसा करके ASLR को निष्क्रिय कर सकते हैं:

echo 0 > /proc/sys/kernel/randomize_va_space

जड़ उपयोगकर्ता के रूप में। चूंकि आपने उबंटू को स्पष्ट रूप से उद्धृत किया है, इसलिए उपरोक्त आदेश अलग है:

echo 0 | sudo tee /proc/sys/kernel/randomize_va_space

हां, यही किया। मैंने देखा है कि पुस्तक लेखक Ubuntu 10.04 का उपयोग करता है, जो अभी तक ASLR नहीं है।
जनमन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.