问题描述
我正在使用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_program> my_code.c