2016-12-08 2 views
5

Ich lese ein OS-Lehrbuch, gibt es ein Beispiel die überprüfen, ob das System virtuelle Adressen unterstützt und sagt das folgende Programm sollte das gleiche Ergebnis jedes Mal drucken. Ich sehe einen Unterschied auf meinem Macbook Pro.Adresse Randomisierung: Druckadresse einer statischen Var in c

#include <stdio.h> 

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

, wenn es ausgeführt sehe ich die Adressänderungen in einigen Bytes (nicht alle von ihnen jedoch):

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

Als ich in GDB laufen, sehe ich 1018 immer:

(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] 

Also was ist der Unterschied darin, es direkt und in GDB zu betreiben? Warum sehe ich die Adresse variiert, wenn sie direkt ausgeführt wird?

+3

Das Buch ist veraltet, es hat nicht darüber nachdenken, [Address Space Layout Randomisierung] (https: // en .wikipedia.org/wiki/Address_space_layout_randomization). – unwind

+0

Es erwähnt ASLR, also mein System sogar die Standorte von statischen Variablen zufällig? – user2018791

+0

Auf der Ebene, auf der ASLR implementiert ist, glaube ich nicht, dass das OS genau darauf achtet, was in die bestimmte Seite des Speichers hineingeht, für die es ein Mapping erstellt. Eine "statische Variable" ist im Grunde nur "etwas im Schreibspeicher". – unwind

Antwort

2

Ihr Buch ist alt. Viele Betriebssysteme sind heutzutage randomisiert, wo Programme und Bibliotheken geladen werden, um die Dinge nur ein bisschen sicherer gegen bestimmte Angriffe zu machen.

MacOS randomisiert, wo Programme in den Speicher geladen werden. Es deaktiviert diese Randomisierung für gdb, deshalb sieht die Adresse in gdb immer gleich aus.

2

In GDB, erhalten wir die dieselbe Adresse immer, auch bei unterschiedlichen Prozessen laufen, aber das normale Verhalten wie unten sein sollte, wenn in Linux

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

direkt ausführen, da dies zu gebührt die Tatsache, dass in GDB die disable-Randomisierungauf von Standard gedreht wird. Es sollte off gedreht werden, wenn wir regelmäßig Ausgang erwarten:

set disable-randomization off 

Referenz Link: http://visualgdb.com/gdbreference/commands/set_disable-randomization