我正在使用 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 的程序,可以使用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);
}
如果您查看 的源代码setarch
,它会personality
大致按照这种模式调用两次。主要区别在于setarch
调用exec
其他程序,而我的配方exec
本身。重要的是您使用 的非零性而不是相等性测试:否则,如果您使用 进行编译,& ADDR_NO_RANDOMIZE
您可能会陷入无限循环。exec
-z execstack
另请参阅手册页为了personality
。
答案4
您可以使用以下命令暂时禁用 ASLR。
sudo sysctl kernel.randomize_va_space=0