2009-12-17 24 views
6

Ich war mit einigem Code herumspielen, wenn ich etwas seltsam bemerkt:Pseudozufälliger Stapelzeiger unter Linux?

[~] 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% 

Das Seltsame ist für mich die Veränderung in der Adresse der Variablen i.

Meine Vermutung ist, dass der Kernel verschiedene Stack-Startadressen liefert, um eine Art Crack zu vereiteln. Was ist der wahre Grund?

Antwort

8

Address space layout randomisation wird aus genau diesem Grund auf verschiedenen Betriebssystemen verwendet. Ihre Abweichung in den Stack-Pointer-Adressen kann sehr wohl darauf zurückzuführen sein - sehr wahrscheinlich, dass dies bei neueren Versionen von Linux und/oder * BSD der Fall ist. IIRC neuere Versionen von Windows tun dies auch.

+5

Wenn Sie testen möchten, dass ASLR deaktiviert ist, können Sie das mit 'echo 0>/proc/sys/kernel/randomize_va_space (als root natürlich) tun. – caf

+1

@caf: Danke für den Hinweis. http://en.wikipedia.org/wiki/Address_space_layout_randomization –