当前位置: 首页>>技术问答>>正文


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

,

问题描述

我正在使用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

参考资料

本文由Ubuntu问答整理, 博文地址: https://ubuntuqa.com/article/1772.html,未经允许,请勿转载。