我正在运行以下简单的C程序:
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char** argv){
void *p = malloc(4);
fprintf (stderr, "p==%p\n", p);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
不同的运行给出不同的结果
p == 0x101c010
那么:p == 0x1ad9010
那么:p == 0xe77010
所以.
我记得,过去malloc是完全确定的.所以可能从某个版本开始,malloc会添加一些随机性.我现在在Ubuntu上使用gcc-4.6.3.
有没有办法消除这种随机性?
如果变化是由地址空间布局随机化引起的,那么,根据此页面,您可以使用以下命令禁用它:
echo 0 | sudo tee /proc/sys/kernel/randomize_va_space
Run Code Online (Sandbox Code Playgroud)
这只应暂时用于调试目的.
这是一篇关于插入函数的好文章:在 Daniel S. Myers和Adam L. Bazinet的Windows,UNIX和Macintosh OS X平台上拦截任意函数.这将允许您malloc使用完全受控的实现替换行为.
首先,绝对不能保证C中的内存管理器确定性.即使你看到它,也不能依赖它.
其次,现在许多环境主要使用地址布局随机化来确保各种缓冲区溢出的利用不能依赖于确定性地址,从而使用它们来执行任意代码.