【问题标题】:Disable randomization of memory addresses禁用内存地址的随机化
【发布时间】:2011-07-08 20:33:24
【问题描述】:

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

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

【问题讨论】:

标签: linux memory-address aslr


【解决方案1】:

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

echo 0 > /proc/sys/kernel/randomize_va_space

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

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

【讨论】:

  • 谢谢。这是调试应用程序的救命稻草,所以我给了你额外的 50。
【解决方案2】:

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

setarch `uname -m` -R ./yourProgram

【讨论】:

  • 我发现 setarch 发现 uname -m 的输出在 ARM 系统(例如 Raspberry Pi)上不合适。但是setarch linux32 -R ./yourProgram 效果很好。
  • 一个不错的变体是setarch `uname -m` -R $SHELL。这会生成一个禁用 ASLR 的 shell,并且您从该 shell 运行的任何命令也将禁用 ASLR。
  • 哦,太好了!我非常喜欢!
【解决方案3】:

您也可以在 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 位系统上,它看起来像使用了一个函数(它可能调用了上面的 self-same 系统调用)。看看 /usr/include/sys/personality.h 中包含文件中的这个 sn-p(在 setarch 源代码中引用为 &lt;sys/personality.h&gt;):

/* 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 shared memory 和一些IBM databases)需要能够关闭内存地址的随机化。

【讨论】:

    猜你喜欢
    • 2015-05-22
    • 2016-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多