2016-12-08 3 views
5

में एक स्थिर var का प्रिंट पता मैं ओएस पाठ्यपुस्तक पढ़ रहा हूं, यह सत्यापित करने के लिए एक उदाहरण है कि सिस्टम आभासी पते का समर्थन कर रहा है और कहता है कि निम्न प्रोग्राम को हर बार एक ही परिणाम मुद्रित करना चाहिए। मुझे अपने मैकबुक समर्थक पर कुछ अंतर दिखाई देता है।पता यादृच्छिकरण: सी

#include <stdio.h> 

int var = 0; 
int main(void) 
{ 
    var += 1; 
    printf("Address: %x, value: %d\n", &var, var); 
    return 0; 
} 

जब उसे चलने के मैं (हालांकि उन सभी को नहीं) कुछ बाइट्स में पता परिवर्तन देखने:

./main 
Address: e8c6018, value: 1 
./main 
Address: 9032018, value: 1 
./main 
Address: 1bc7018, value: 1 

जब मैं GDB में चलाने के लिए, मैं हमेशा 1018 देखें:

(gdb) r 
Starting program: /Users/xilan/temp/main 
Address: 1018, value: 1 
[Inferior 1 (process 19631) exited normally] 
(gdb) r 
Starting program: /Users/xilan/temp/main 
Address: 1018, value: 1 
[Inferior 1 (process 19636) exited normally] 
(gdb) r 
Starting program: /Users/xilan/temp/main 
Address: 1018, value: 1 
[Inferior 1 (process 19654) exited normally] 

तो इसे सीधे और जीडीबी में चलाने में क्या अलग है? मुझे यह क्यों दिखाई देता है कि यह पता चलता है कि जब यह सीधे चलाता है?

+3

किताब पुरानी हो चुकी है, इसके बारे में [पता अंतरिक्ष लेआउट randomization] (https नहीं सोचा था .wikipedia.org/wiki/Address_space_layout_randomization)। – unwind

+0

यह एएसएलआर का उल्लेख करता है, इसलिए मेरा सिस्टम स्थैतिक चर के स्थानों को भी यादृच्छिक करता है? – user2018791

+0

उस स्तर पर जहां एएसएलआर लागू किया गया है, मुझे नहीं लगता कि ओएस वास्तव में स्मृति के विशेष पृष्ठ में क्या चल रहा है, यह मैपिंग बना रहा है। मूल रूप से "स्थिर चर" केवल "लिखने योग्य स्मृति में कुछ" है। – unwind

उत्तर

2

आपकी पुस्तक पुरानी है। आज कई ऑपरेटिंग सिस्टम यादृच्छिक हैं जहां कुछ हमलों के खिलाफ चीजों को थोड़ा और सुरक्षित बनाने के लिए प्रोग्राम और पुस्तकालय लोड किए जाते हैं।

मैकोज़ यादृच्छिकता जहां प्रोग्राम स्मृति में लोड होते हैं। हालांकि यह gdb के लिए यादृच्छिकरण अक्षम करता है, यही कारण है कि पता हर समय gdb में समान दिखता है।

2

GDB में, हम हमेशा एक ही पते मिलता है, यहां तक ​​कि विभिन्न प्रक्रियाओं के साथ चलाने के लिए, लेकिन अगर लिनक्स

./main 
Address: e8c6018, value: 1 
./main 
Address: 9032018, value: 1 
./main 
Address: 1bc7018, value: 1 

में सीधे चलाने के सामान्य व्यवहार, नीचे की तरह होना चाहिए क्योंकि इस की वजह से है तथ्य यह है कि GDB में, अक्षम-यादृच्छिकीकरण पर डिफ़ॉल्ट द्वारा दिया जाता है। यह बंद कर दिया जाना चाहिए अगर हम नियमित रूप से उत्पादन की उम्मीद:

set disable-randomization off 

संदर्भ लिंक: // एन: http://visualgdb.com/gdbreference/commands/set_disable-randomization

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