在启用地址 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 暴露的最常见错误类型是:
- 使用未初始化的内存(目前最常见)
- 没有正确的函数声明(仅限 64 位模式;纯 C)
- 对内存中的进程布局做出错误的假设(仅在以某种方式检查其自身内存布局的程序中显示)。
那么未初始化的内存可能是堆栈或(更有可能)堆。
缺少函数原型会导致截断 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'
抱歉,如果这个问题太笼统,但我想知道我应该使用哪种方法来调试程序,当地址 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 暴露的最常见错误类型是:
- 使用未初始化的内存(目前最常见)
- 没有正确的函数声明(仅限 64 位模式;纯 C)
- 对内存中的进程布局做出错误的假设(仅在以某种方式检查其自身内存布局的程序中显示)。
那么未初始化的内存可能是堆栈或(更有可能)堆。
缺少函数原型会导致截断 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'