如何暂时禁用 ASLR(地址空间布局随机化)?

如何暂时禁用 ASLR(地址空间布局随机化)?

我正在使用 Ubuntu 12.04 32 位,为了进行一些实验,我需要禁用 ASLR;我该怎么做?之后我应该怎么做才能再次启用 ASLR?

答案1

根据一篇文章ASLR 在 Linux 系统上的效果如何?,您可以使用界面在Linux中配置ASLR /proc/sys/kernel/randomize_va_space

支持以下值:

  • 0 – 无随机化。一切都是静态的。
  • 1 – 保守随机化。共享库、堆栈、mmap()VDSO 和堆都是随机化的。
  • 2 – 完全随机化。除了上一点列出的元素之外,通过它管理的内存brk()也是随机的。

因此,要禁用它,请运行

echo 0 | sudo tee /proc/sys/kernel/randomize_va_space

要再次启用它,请运行

echo 2 | sudo tee /proc/sys/kernel/randomize_va_space

重启后它将失效,因此你必须在 中进行配置sysctl。添加一个包含以下内容的文件/etc/sysctl.d/01-disable-aslr.conf

kernel.randomize_va_space = 0

应该永久禁用此功能。

答案2

/proc/sys/kernel/randomize_va_space接口控制整个系统的 ASLR。

如果你不想进行系统范围的更改,请使用ADDR_NO_RANDOMIZE 性格标志可暂时禁用 ASLR。可以使用以下方法控制此标志:setarch及其-R选项,例如

setarch `uname -m` -R /bin/bash

这将为您打开一个禁用 ASLR 的新 Bash shell,包括从此 shell 运行的所有子进程。exit完成后,只需打开 shell 即可。


顺便说一句,在 i386 上,ulimit -s unlimited可以有效地“禁用” ASLR。

编辑(2016 年 4 月):ulimit -s unlimited已修复并分配CVE-2016-3672

答案3

如果你想要构建一个在运行时禁用 ASLR 的程序,可以使用personalityLinux 上的系统调用。这里有一个方法:

#include <stdio.h>
#include <sys/personality.h>

int main(int argc, char **argv) {
    const int old_personality = personality(ADDR_NO_RANDOMIZE);
    if (!(old_personality & ADDR_NO_RANDOMIZE)) {
        const int new_personality = personality(ADDR_NO_RANDOMIZE);
        if (new_personality & ADDR_NO_RANDOMIZE) {
            execv(argv[0], argv);
        }
    }
    printf("&argc == %p\n", (void *) &argc);
}

如果您查看 的源代码setarch,它会personality大致按照这种模式调用两次。主要区别在于setarch调用exec其他程序,而我的配方exec本身。重要的是您使用 的非零性而不是相等性测试:否则,如果您使用 进行编译,& ADDR_NO_RANDOMIZE您可能会陷入无限循环。exec-z execstack

另请参阅手册页为了personality

答案4

您可以使用以下命令暂时禁用 ASLR。

sudo sysctl kernel.randomize_va_space=0 

相关内容