禁用内存地址的随机化

0fn*_*fnt 31 linux memory-address aslr

我正在尝试调试使用大量指针的二进制文件.有时为了快速查看输出以找出错误,我打印出对象的地址及其相应的值,但是,对象地址是随机的,这违背了快速检查的目的.有没有办法临时/永久禁用它,以便每次运行程序时都得到相同的值.

哎呀.操作系统是Linux fsttcs1 2.6.32-28-generic #55-Ubuntu SMP Mon Jan 10 23:42:43 UTC 2011 x86_64 GNU/Linux

Orb*_*bit 39

在Ubuntu上,它可以被禁用...

echo 0 > /proc/sys/kernel/randomize_va_space
Run Code Online (Sandbox Code Playgroud)

在Windows上,这篇文章可能会有所帮助......

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

  • 谢谢.这是一个救命的调试应用程序,所以我给了你额外的50. (2认同)

Ste*_*hen 28

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

setarch `uname -m` -R ./yourProgram
Run Code Online (Sandbox Code Playgroud)

  • 一个不错的变体是`setarch \`uname -m \`-R $ SHELL`.这会生成一个禁用ASLR的shell,并且从该shell运行的任何命令也将禁用ASLR. (9认同)
  • 我发现`setarch`在ARM系统(例如Raspberry Pi)上发现`uname -m`的输出不合适.但是`setarch linux32 -R./ yourProgram`效果很好. (2认同)

rts*_*ts1 5

您也可以在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
Run Code Online (Sandbox Code Playgroud)

在我的CentOS 6 64位系统上,它似乎使用了一个函数(可能调用了上面的同一个syscall)。看一下包含文件中的以下代码片段/usr/include/sys/personality.h(如<sys/personality.h>setarch源代码中所引用 ):

/* Set different ABIs (personalities).  */
extern int personality (unsigned long int __persona) __THROW;
Run Code Online (Sandbox Code Playgroud)

归结为,您可以使用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.
}
Run Code Online (Sandbox Code Playgroud)

很明显,您不能在您正在执行的过程中关闭地址随机化(咧嘴笑:除非是动态加载),所以这只会在以后影响派生和执行。我相信地址随机化标志是由子进程继承的吗?

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

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