在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% 

对我来说奇怪的是variablesi的地址的变化。

我的猜测是,内核提供了不同的堆栈起始地址来试图阻止某种破解。 真正的原因是什么?

正是出于这个原因,在几个操作系统上使用了地址空间布局随机化 。 堆栈指针地址的变化很可能是由于这个原因导致的 – 很可能是最近版本的Linux和* BSD。 IIRC最新版本的Windows也是这样做的。