2011-03-04 11 views
27

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

ओह। ओएस Linux fsttcs1 2.6.32-28-generiC#55-Ubuntu SMP Mon Jan 10 23:42:43 UTC 2011 x86_64 GNU/Linux

+1

क्या ओएस ...... ...... – Orbit

+0

संबंधित http://stackoverflow.com/questions/11238457/disable-and-re-enable-address-space-layout-randomization-only-for-myself –

उत्तर

36

उबंटू पर है, इसके साथ ...

echo 0 > /proc/sys/kernel/randomize_va_space 

Windows पर, इस पोस्ट में कुछ मदद की हो सकता है निष्क्रिय किया जा सकता ...

http://blog.didierstevens.com/2007/11/20/quickpost-another-funny-vista-trick-with-aslr/

+2

धन्यवाद। यह एक जीवन बचतकर्ता एक आवेदन डीबगिंग था इसलिए मैंने आपको अतिरिक्त 50 दिया। – hsanders

20

अस्थायी रूप से निष्क्रिय करने के लिए एक विशेष कार्यक्रम के लिए एएसएलआर आप हमेशा निम्नलिखित जारी कर सकते हैं (सुडो की कोई आवश्यकता नहीं)

setarch `uname -m` -R ./yourProgram 
+2

मैंने पाया कि 'स्टार्च' को एआरएम सिस्टम (जैसे रास्पबेरी पीआई) पर असहनीय 'uname -m' का आउटपुट मिल गया है। लेकिन 'setarch linux32 -R।/YourProgram' बहुत अच्छा काम करता है। –

+4

एक अच्छा संस्करण 'setarch \ 'uname -m \' -R $ SHELL' है। इससे एएसएलआर अक्षम के साथ एक खोल उत्पन्न होता है, और उस शेल से आपके द्वारा चलाए जाने वाले किसी भी कमांड में एएसएलआर अक्षम भी होगा। – ntc2

+0

ओह अच्छा! मुझे वह बहुत पसंद है! – Stephen

2

आप यूनिक्स exec से पहले इस स्रोत से सी स्रोत से प्रोग्रामेटिक रूप से भी कर सकते हैं।

आप setarch के लिए सूत्रों का कहना है (यहाँ है एक स्रोत) पर एक नज़र डालें, तो:

http://code.metager.de/source/xref/linux/utils/util-linux/sys-utils/setarch.c

अगर एक सिस्टम कॉल (syscall) या एक समारोह कॉल करने पर निर्भर करता आप देख सकते हैं (पर निर्भर करता है क्या आपका सिस्टम परिभाषित करता है)। setarch.c से:

#ifndef HAVE_PERSONALITY 
# include <syscall.h> 
# define personality(pers) ((long)syscall(SYS_personality, pers)) 
#endif 

मेरे CentOS 6 64-बिट सिस्टम पर, यह है कि यह एक समारोह (जो शायद ऊपर स्वयं ही syscall कॉल) का उपयोग करता है की तरह लग रहा है। (के रूप में setarch स्रोत कोड में <sys/personality.h> के रूप में संदर्भित) /usr/include/sys/personality.h में शामिल फ़ाइल से इस स्निपेट पर एक नज़र डालें:

/* Set different ABIs (personalities). */ 
extern int personality (unsigned long int __persona) __THROW; 

क्या यह करने पर निर्भर करता है, तो आप कर सकते हैं वह यह है कि, सी कोड से, फोन और सेट व्यक्तित्व ADDR_NO_RANDOMIZE और फिर exec का उपयोग करने के लिए (जैसे setarch करता है)। (: जब तक हो सकता है गतिशील लोड हो रहा है मुस्कराहट), तो यह केवल कांटे और अधिकारियों बाद में प्रभावित करता

#include <sys/personality.com> 

#ifndef HAVE_PERSONALITY 
# include <syscall.h> 
# define personality(pers) ((long)syscall(SYS_personality, pers)) 
#endif 

... 

void mycode() 
{ 
    // If requested, turn off the address rand feature right before execing 
    if (MyGlobalVar_Turn_Address_Randomization_Off) { 
    personality(ADDR_NO_RANDOMIZE); 
    } 
    execvp(argv[0], argv); // ... from set-arch. 
} 

यह बहुत स्पष्ट आप इस प्रक्रिया में हो में पता यादृच्छिकीकरण बंद नहीं कर सकते है। मेरा मानना ​​है कि पता यादृच्छिकता झंडे बच्चे उप-प्रक्रियाओं द्वारा विरासत में हैं?

वैसे भी, इस तरह आप सी स्रोत कोड में पता यादृच्छिकरण को प्रोग्रामेटिक रूप से बंद कर सकते हैं। यह आपका एकमात्र समाधान हो सकता है यदि आप नहीं चाहते कि कोई उपयोगकर्ता मैन्युअल रूप से हस्तक्षेप करे और स्टार्च के साथ स्टार्ट-अप या पहले सूचीबद्ध अन्य समाधानों में से एक हो।

इससे पहले कि आप इसे बंद करने में सुरक्षा समस्याओं के बारे में शिकायत करें, कुछ साझा स्मृति पुस्तकालय/उपकरण (जैसे PickingTools shared memory और कुछ IBM databases) स्मृति पते के यादृच्छिकरण को बंद करने में सक्षम होने की आवश्यकता है।

संबंधित मुद्दे