2016-12-02 4 views
7

आज मैं निम्नलिखित स्थिति में आया हूं। मैं कई बार निम्न कार्यक्रम चलाने:कार्यक्रम के प्रत्येक भाग में argc का पता अलग क्यों है?

#include <stdio.h> 
int main(int argc, char **argv) { 
    printf("%p\n", &argc); 
} 

लिनक्स और जीसीसी संकलक के साथ एक इंटेल i7 पर, इस कार्यक्रम के प्रत्येक रन पर विभिन्न उत्पादन देता है:

i7:~/tmp$ gcc t.c 
i7:~/tmp$ ./a.out 
0x7fffc127636c 
i7:~/tmp$ ./a.out 
0x7fffdefed97c 
i7:~/tmp$ ./a.out 
0x7fff7f32454c 

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

मुझे आश्चर्य है कि कार्यक्रम के प्रत्येक आमंत्रण पर स्टैक को अलग-अलग पते पर क्यों मैप किया गया है?

+11

https://en.wikipedia.org/wiki/Address_space_layout_randomization? – dbrank0

+2

ओटी: इसे 'printf ("% p \ n", (शून्य *) &argc); ', बीटीडब्लू होना चाहिए। रूपांतरण विनिर्देशक' पी 'केवल' शून्य 'पॉइंटर्स के लिए परिभाषित किया गया है। – alk

+2

संबंधित: http: // stackoverflow .com/प्रश्न/11238457/अक्षम और पुन: सक्षम-पता-अंतरिक्ष-लेआउट-यादृच्छिकीकरण-केवल के लिए अपने आप को – alk

उत्तर

14

यह, सुरक्षा कारणों से है, इसलिए कि एक हमलावर चर, काम करता है, की सटीक स्मृति लेआउट पर भी कई मान्यताओं करने में सक्षम नहीं हो सकता है ...

मेरे बारे में «बफर अतिप्रवाह बातें पढ़ने के लिए प्रोत्साहित करते हैं हमलों »(संभावित कारणों में से एक) और« एएसएलआर »(पता स्थान लेआउट यादृच्छिकरण) संभावित निवारक आंशिक क्यूरेशन में से एक है।

तो यह मामला है कि संकलक निश्चित पतों को उत्पन्न करता है, लेकिन क्रम चीजों में से कुछ ...

बदलता है आपको लगता है कि व्यवहार बदलने के लिए, उदाहरण के लिए disable ASLR in Linux देखें।

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