2009-12-17 6 views
6

Je jouais avec un code quand j'ai remarqué quelque chose d'étrange:Pointeur de pile pseudo-aléatoire sous 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 chose étrange pour moi est la variation de l'adresse de la variable i. Je suppose que le noyau fournit différentes adresses de départ de pile pour essayer de contrecarrer une sorte de fissure. Quelle est la vraie raison?

Répondre

8

Address space layout randomisation est utilisé sur plusieurs systèmes d'exploitation pour précisément cette raison. Votre variation dans les adresses de pointeurs de pile peut être causée par ceci - très probablement être le cas sur les versions récentes de Linux et/ou * BSD. Les versions récentes de Windows IIRC le font également.

+5

Si vous voulez tester avec ASLR désactivé, vous pouvez le faire avec 'echo 0>/proc/sys/kernel/randomize_va_space' (en tant que root, bien sûr). – caf

+1

@caf: Merci pour l'indice. http://en.wikipedia.org/wiki/Address_space_layout_randomization –