2009-12-17 1 views
6

stavo giocando intorno con un certo codice quando ho notato qualcosa di strano:Puntatore allo stack pseudo-casuale sotto 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% 

La cosa strana per me è la variazione di indirizzo della variabile i.

La mia ipotesi è che il kernel fornisca diversi indirizzi iniziali di stack per cercare di contrastare una sorta di crack. Qual è la vera ragione?

risposta

8

Address space layout randomisation viene utilizzato su diversi sistemi operativi proprio per questo motivo. La tua variazione negli indirizzi del puntatore dello stack potrebbe essere causata da questo, molto probabilmente nelle ultime versioni di Linux e/* BSD. Anche le versioni recenti di IIRC di Windows fanno altrettanto.

+5

Se si desidera testare con ASLR disabilitato, è possibile farlo con 'echo 0>/proc/sys/kernel/randomize_va_space' (come root, ovviamente). – caf

+1

@caf: Grazie per il suggerimento. http://en.wikipedia.org/wiki/Address_space_layout_randomization –