2009-12-17 80 views
6

我玩弄一些代碼時,我發現了一些奇怪: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% 

奇怪的事情對我來說是變量i的地址的變化。

我的猜測是內核提供了不同的堆棧起始地址來試圖阻止某種破解。真正的原因是什麼?

回答

8

Address space layout randomisation正是出於這個原因在多個操作系統上使用。堆棧指針地址的變化很可能是由此引起的 - 很可能是最近版本的Linux和* BSD中的情況。 IIRC最新版本的Windows也可以做到這一點。

+5

如果你想測試禁用ASLR,你可以用'echo 0>/proc/sys/kernel/randomize_va_space'來做到這一點(當然是root)。 – caf 2009-12-17 13:42:10

+1

@caf:謝謝你的提示。 http://en.wikipedia.org/wiki/Address_space_layout_randomization – 2009-12-17 15:20:19