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

标签 linux debugging gdb

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

最佳答案

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

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

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

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

缺少函数原型(prototype)会导致截断返回值:

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

关于linux - 在启用了地址空间随机化的环境中运行时,程序获得错误结果的可能原因是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27907137/

相关文章:

linux - 你可以在内核模式之外输入 x64 32 位 "long compatibility sub-mode"吗?

Linux 海湾合作委员会 : How to write a quick function to corrupt the stack?

python - 调试Python代码

python - gdb 从哪里获取函数名?

linux - 子进程会发生什么?

Python 断言——改进了失败的自省(introspection)?

java - Eclipse,无法解决

linux - GDB 显示 'Cannot find bounds of current function' 步进

unix - 无法进入系统调用源代码

linux - 我的 '[]' 在哪里?,bash 程序