在启用地址 Space 随机化的环境中 运行 时,程序获得错误结果的可能原因是什么?

What are the probable causes for a program to get incorrect results when run in an environment with Address Space Randomization enabled?

抱歉,如果这个问题太笼统,但我想知道我应该使用哪种方法来调试程序,当地址 Space 随机化被禁用时 returns 正确的结果,否则不正确的结果。更具体一点,我使用 gdb 作为调试器,当我 运行 我的程序没有附加或附加但使用 set disable-randomization off 时,它 returns 不正确的结果。但是,当我 运行 它在 gdb 下 set disable-randomization on 它按预期 运行s。我想知道我的程序中的哪种类型的错误会使它表现得像那样。

I want to know which type of bugs in my program would make it behave like that.

根据我的经验,ASLR 暴露的最常见错误类型是:

  1. 使用未初始化的内存(目前最常见)
  2. 没有正确的函数声明(仅限 64 位模式;纯 C)
  3. 对内存中的进程布局做出错误的假设(仅在以某种方式检查其自身内存布局的程序中显示)。

那么未初始化的内存可能是堆栈或(更有可能)堆。

缺少函数原型会导致截断 return 值:

void *p = fn();  // If fn is not declared, p could be truncated to lower
                 // 32-bits, because the compiler will think it returns 'int'