这是困扰我很久的事情。我可以观察到程序的实际执行与gdb
受控程序的执行之间存在差异。
但是,这里有一个例子:
首先,这里是示例代码(我们使用一个自动变量来获取堆栈的位置):
#include <stdio.h> #include <stdlib.h> int main () { char c = 0; printf ("Stack address: %p\n", &c); return EXIT_SUCCESS; }
然后,我们禁用 ASLR(我们使用进程的个性标志,而不是通过系统范围的方法
/proc/sys/kernel/randomize_va_space
):$> setarch `uname -m` -R /bin/bash
然后,在真实的内存环境中运行:
Stack address: 0x7fffffffe1df
并且,同样通过
gdb
:(gdb) r Starting program: ./gdb-against-reality Stack address: 0x7fffffffe17f [Inferior 1 (process 5374) exited normally] (gdb)
所以,这里我们在两次运行之间有 96 个字节的差异。但是,如何在不让它在实际内存布局中运行的情况下预测给定程序的这种差异(仅通过了解gdb
内存布局)?
而且,这种差异从何而来/从何而来?