c - Why aren't glibc's function addresses randomized when ASLR is enabled? -


एएसएलआर समझने की कोशिश में, मैंने यह सरल प्रोग्राम बनाया:

  #include & lt; stdio.h & gt; # शामिल करें & lt; stdlib.h & gt; Int main () {printf ("% p \ n", & amp; सिस्टम); वापसी 0; }  

ALSR को सक्षम किया जा रहा है:

  $ cat / proc / sys / kernel / randomize_v_space 2  

और मैंने प्रोग्राम को संकलित करने के लिए जीसीसी का इस्तेमाल किया:

  $ gcc aslrtest.c  

हर बार जब मैं इस कार्यक्रम को चलाता हूं, तो वह उसी पते को प्रिंट करता है ( 0x400450 )।

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

Am मुझे उम्मीद में गलत है कि सिस्टम () का पता यादृच्छिक होना चाहिए? या मेरे कॉन्फ़िगरेशन में कुछ गलत होने की संभावना है?

एक साझा लाइब्रेरी से फ़ंक्शन के लिए कोई भी संदर्भ मुख्य कार्यक्रम में एक गैर-स्थिति-स्वतंत्र वस्तु फ़ाइल से एक पीएलटी प्रविष्टि की आवश्यकता होती है जिसके माध्यम से कॉलर एक कॉल निर्देश के माध्यम से कॉल कर सकता है जो लिंक-टाइम पर एक निश्चित पते पर हल किया जाता है। ऐसा इसलिए है क्योंकि ऑब्जेक्ट फ़ाइल को विशेष कोड (पीआईसी) के साथ एक चर पते पर कॉल करने में सक्षम बनाने के लिए इसे सक्षम नहीं किया गया था।

जब भी ऐसी एक PLT प्रविष्टि किसी पुस्तकालय में किसी फ़ंक्शन के लिए उपयोग की जाती है, इस पीएलटी प्रविष्टि का पता, फ़ंक्शन का मूल पता नहीं, इसका "आधिकारिक" पता (जैसा कि आपके उदाहरण में आपने सिस्टम का पता प्रिंट किया था) हो गया था। यह आवश्यक है क्योंकि किसी फ़ंक्शन के पते को सी प्रोग्राम के सभी भागों से उसी तरह देखा जाना चाहिए; इसे सिस्टम के पते के लिए भाषा के द्वारा अनुमति नहीं दी जाती है, क्योंकि उस कार्यक्रम के उस भाग के आधार पर भिन्नता है, क्योंकि यह नियम को तोड़ता है कि एक ही समारोह में दो बिंदुओं की समानता के बराबर होती है। / P>

यदि आप वास्तव में एएसएलआर के हमलों से लाभ प्राप्त करना चाहते हैं जो ज्ञात निश्चित पते का उपयोग करते हुए फ़ंक्शन कॉल करते हैं, तो आपको मुख्य कार्यक्रम को पीआईई के रूप में बनाने की आवश्यकता है।


Comments

Popular posts from this blog

c++ - C/pp Sockets, recv()/send() works only under gdb -

GO: Serve static pages -

objective c - How to open front/back camera at the same time in iOS developing? -