我正在尝试调试一个使用了许多指针的二进制文件。有时为了快速查找错误并查看输出,我会打印对象的地址及其对应的值,然而,对象的地址是随机的,这破坏了这种快速检查的目的。 是否有一种方法可以临时/永久地禁用这个功能,以便每次运行程序时都获得相同的值。
哎呀,操作系统是 Linux fsttcs1 2.6.32-28-generic #55-Ubuntu SMP Mon Jan 10 23:42:43 UTC 2011 x86_64 GNU/Linux
我正在尝试调试一个使用了许多指针的二进制文件。有时为了快速查找错误并查看输出,我会打印对象的地址及其对应的值,然而,对象的地址是随机的,这破坏了这种快速检查的目的。 是否有一种方法可以临时/永久地禁用这个功能,以便每次运行程序时都获得相同的值。
哎呀,操作系统是 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
setarch \
uname -m` -R $SHELL`。这会生成一个禁用了ASLR的shell,从该shell运行的任何命令也将禁用ASLR。 - ntc2exec
之前通过C源代码来进行编程实现。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
/usr/include/sys/personality.h
中的包含文件(在setarch源代码中引用为<sys/personality.h>
):/* Set different ABIs (personalities). */
extern int personality (unsigned long int __persona) __THROW;
#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.
}
很明显,在进程中你无法关闭地址随机化(除非是动态加载),因此这只会影响到后来的forks和execs。我相信地址随机化标志会被子进程继承?
总之,这就是如何在C源代码中以编程方式关闭地址随机化。如果您不想强制用户手动干预并使用setarch或前面列出的其他解决方案启动,则可能只有这种方法是您的唯一解决方案。
在抱怨关闭此功能会带来安全问题之前,请注意某些共享内存库/工具(例如PickingTools shared memory和一些IBM databases)需要能够关闭内存地址的随机化。