禁用内存地址的随机化

我试图debugging一个使用了很多指针的二进制文件。 有时,为了快速查看输出以找出错误,我打印出对象的地址及其相应的值,但是对象地址是随机的,这就违反了快速检查的目的。 有没有一种方法来暂时/永久禁用此function,以便每次运行该程序时都能得到相同的值。

哎呀。 OS是Linux fsttcs1 2.6.32-28-generic #55-Ubuntu SMP Mon Jan 10 23:42:43 UTC 2011 x86_64 GNU/Linux

在Ubuntu上,它可以被禁用…

 echo 0 > /proc/sys/kernel/randomize_va_space 

在Windows上,这个帖子可能有一些帮助…

http://blog.didierstevens.com/2007/11/20/quickpost-another-funny-vista-trick-with-aslr/

要暂时禁用特定程序的ASLR,您可以始终发出以下命令(不需要sudo)

 setarch `uname -m` -R ./yourProgram 

你也可以在UNIX exec之前通过C源程序来完成这个任务。

如果你看一下setarch的源代码 (这是一个源代码):

http://code.metager.de/source/xref/linux/utils/util-linux/sys-utils/setarch.c

你可以看看是否归结为一个系统调用( syscall )或函数调用(取决于你的系统定义)。 来自setarch.c:

 #ifndef HAVE_PERSONALITY # include <syscall.h> # define personality(pers) ((long)syscall(SYS_personality, pers)) #endif 

在我的CentOS 6 64位系统上,它看起来像使用了一个函数(可能调用上面的自我同一个系统调用)。 看看/usr/include/sys/personality.h的include文件片段(在setarch源代码中引用为<sys/personality.h> ):

 /* Set different ABIs (personalities). */ extern int personality (unsigned long int __persona) __THROW; 

归结起来,就是你可以从C代码中调用和设置个性来使用ADDR_NO_RANDOMIZE,然后exec (就像setarch一样)。

 #include <sys/personality.com> #ifndef HAVE_PERSONALITY # include <syscall.h> # define personality(pers) ((long)syscall(SYS_personality, pers)) #endif ... void mycode() { // If requested, turn off the address rand feature right before execing if (MyGlobalVar_Turn_Address_Randomization_Off) { personality(ADDR_NO_RANDOMIZE); } execvp(argv[0], argv); // ... from set-arch. } 

很明显你不能在你所在的进程中关闭地址随机化(咧嘴笑,除非是动态加载),所以这只会影响fork和exec。 我相信地址随机化标志是由子子进程继承?

无论如何,这就是你如何以编程方式关闭C源代码中的地址随机化。 如果您不希望用户手动进行干预并使用setarch或之前列出的其他解决方案之一启动,则这可能是您唯一的解决方案。

在关闭安全问题之前,一些共享内存库/工具(如PickingTools共享内存和一些IBM数据库 )需要能够关闭内存地址的随机化。