问题描述
我正在使用Ubuntu 12.04 32位进行一些实验我需要禁用ASLR我该怎么做?之后我该怎样做再次启用ASLR?
最佳解决方案
根据文章How Effective is ASLR on Linux Systems?,您可以使用/proc/sys/kernel/randomize_va_space接口在Linux中配置ASLR。
The following values are supported:
0 – No randomization. Everything is static.
1 – Conservative randomization. Shared libraries, stack, mmap(), VDSO and heap are randomized.
2 – Full randomization. In addition to elements listed in the previous point, memory managed through brk() is also randomized.
所以,要禁用它,请运行
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
应永久禁用此功能。
次佳解决方案
/proc/sys/kernel/randomize_va_space接口控制ASLR system-wide。
如果您不想更改system-wide,请使用ADDR_NO_RANDOMIZE personality暂时禁用ASLR。控制此个性标志可以使用setarch及其-R选项(manpage),在命令前添加。
我发现使用以下方法打开一个全新的shell非常方便:
setarch `uname -m` -R /bin/bash
这将为您禁用ASLR打开一个新的Bash shell,包括所有子进程(从此shell运行的程序)。
一旦你完成,只需要exit shell。
顺便说一下,在i386上,ulimit -s unlimited可以”disable” ASLR。
编辑(2016年4月):固定ulimit -s unlimited并指定CVE-2016-3672。
第三种解决方案
出于显而易见的原因,应该在VM中保留更永久的禁用ASLR的方法。
要测试覆盖堆栈帧返回地址的能力等,你需要编译没有堆栈的金丝雀-fno-stack-protector,同时允许你在堆栈上执行需要用-z execstack编译的代码,
$ gcc -fno-stack-protector -z execstack -o my_code.c
参考资料