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

Am1*_*3zA 71 kernel

我正在使用 Ubuntu 12.04 32 位,对于某些实验,我需要禁用 ASLR;我如何做到这一点?之后我应该怎么做才能再次启用 ASLR?

ger*_*ijk 105

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

支持以下值:

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

因此,要禁用它,请运行

echo 0 | sudo tee /proc/sys/kernel/randomize_va_space
Run Code Online (Sandbox Code Playgroud)

并再次启用它,运行

echo 2 | sudo tee /proc/sys/kernel/randomize_va_space
Run Code Online (Sandbox Code Playgroud)

这不会在重新启动后继续存在,因此您必须在sysctl. 添加/etc/sysctl.d/01-disable-aslr.conf包含以下内容的文件:

kernel.randomize_va_space = 0
Run Code Online (Sandbox Code Playgroud)

应该永久禁用此功能。


you*_*ufu 33

/proc/sys/kernel/randomize_va_space界面控制 ASLR 系统范围。

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

setarch `uname -m` -R /bin/bash
Run Code Online (Sandbox Code Playgroud)

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


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

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


小智 8

如果你想构建一个在运行时禁用 ASLR 的程序,你可以personality在 Linux 上使用系统调用。这是一个食谱:

#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);
}
Run Code Online (Sandbox Code Playgroud)

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

另请参见的手册页personality