2009-12-17 16 views
6

मैं कुछ कोड के साथ चारों ओर खेल रहा था जब मैं कुछ अजीब देखा:लिनक्स के तहत छद्म-यादृच्छिक ढेर सूचक?

[~] main% cat test.cc 
#include <stdio.h> 

void f() 
{ 
    int i; 
    fprintf(stderr, "&i = 0x%08X\n", (long)&i); 
} 

int main(int argc, char**argv) 
{ 
    f(); 
} 
[~] main% g++ test.cc 
[~] main% ./a.out 
&i = 0xBFA27AB4 
[~] main% ./a.out 
&i = 0xBFAD7E24 
[~] main% ./a.out 
&i = 0xBFCA3464 
[~] main% ./a.out 
&i = 0xBF96C064 
[~] main% 

अजीब बात मेरे लिए चर मैं का संबोधन में भिन्नता है।

मेरा अनुमान है कि कर्नेल किसी प्रकार की दरार को रोकने की कोशिश करने के लिए अलग-अलग स्टैक स्टार्ट पते की आपूर्ति करता है। असली कारण क्या है?

उत्तर

8

Address space layout randomisation इस कारण से कई ऑपरेटिंग सिस्टम पर उपयोग किया जाता है। स्टैक पॉइंटर पते में आपकी भिन्नता इस वजह से हो सकती है - लिनक्स के हाल के संस्करणों और * बीएसडी पर होने की संभावना है। आईआईआरसी विंडोज के हाल के संस्करण भी ऐसा करते हैं।

+5

यदि आप एएसएलआर अक्षम के साथ परीक्षण करना चाहते हैं, तो आप इसे 'echo 0>/proc/sys/kernel/randomize_va_space' (रूट के रूप में) के साथ कर सकते हैं। – caf

+1

@ कैफ: संकेत के लिए धन्यवाद। http://en.wikipedia.org/wiki/Address_space_layout_randomization –

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