我正在尝试调试一个使用大量指针的二进制文件。有时,为了快速查看输出以找出错误,我会打印出对象的地址及其相应的值,但是,对象地址是随机的,这违背了快速检查的目的。 有没有办法暂时/永久禁用此功能,以便我每次运行程序时都获得相同的值。
哎呀。操作系统是
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 之前从 C 源代码以编程方式执行此操作
exec
。
如果您查看 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
中的包含文件中的这段代码(在 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.
}
很明显你不能在你所在的进程中关闭地址随机化(咧嘴笑:除非可能是动态加载),所以这只会影响稍后的分叉和执行。 我相信地址随机化标志是由子子进程继承的?
无论如何,这就是您如何以编程方式关闭 C 源代码中的地址随机化。 如果您不希望强制用户手动干预并使用 setarch 或前面列出的其他解决方案之一启动,这可能是您唯一的解决方案。
在您抱怨关闭此功能的安全问题之前,一些共享内存库/工具(例如PickingTools共享内存和一些IBM数据库)需要能够关闭内存地址的随机化。
好吧,我只迟到了 13 年多的时间才得到答案,但由于您在最初的问题中特别提到了“调试”,而且还没有人提到过 gdb,所以我为未来的读者添加了这个答案。
在启用了 ASLR 的系统上,强烈建议使用
set disable-randomization on
运行 gdb(或确保它默认处于活动状态),以便能够重现运行。
(gdb) help set disable-randomization
Set disabling of debuggee's virtual address space randomization.
When this mode is on (which is the default), randomization of the virtual
address space is disabled. Standalone programs run with the randomization
enabled by default on some platforms.
另请参阅我对类似问题的更详细的回答。