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


Answers:


75

根据一篇文章,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

并再次启用它,运行

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

这将在重启后无法幸存,因此您必须在中进行配置sysctl。添加一个/etc/sysctl.d/01-disable-aslr.conf包含以下内容的文件:

kernel.randomize_va_space = 0

应该永久禁用它。


1
什么是“完全随机化”?这包括可执行文件本身吗?那是brk()什么?
蜀正

26

/proc/sys/kernel/randomize_va_space界面控制整个系统的ASLR。

如果您不想在系统范围内进行更改,请使用ADDR_NO_RANDOMIZE 个性临时禁用ASLR。可以在命令前加上setarch及其-R选项(manpage)来控制此个性标志。

我发现使用以下命令打开一个全新的外壳真的很方便:

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

这将为禁用ASLR的您打开一个新的Bash shell,包括所有子进程(程序从该shell运行)。

完成操作后,只exit需要外壳即可。


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


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


遵循util-linux精神的次要细节:uname -m除了可以使用之外arch,还可以使用,而二进制文件实际上可以实现相同的功能。
drumfire'1

1
@drumfire arch不能作为一个busybox的小程序
尤夫

两年后再回来+1,并添加有关CVE的信息。
Multisync

3

出于显而易见的原因,应将更永久的禁用ASLR的方法保留在VM中。

要测试覆盖堆栈帧返回地址等的能力,您需要在不使用堆栈金丝雀的情况下进行编译-fno-stack-protector,同时允许您在需要编译的堆栈上执行代码-z execstack

$ gcc -fno-stack-protector -z execstack -o <my_program> my_code.c

2

您可以使用sudo sysctl kernel.randomize_va_space=0临时禁用ASLR。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.