2009-12-17 84 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