我正在使用Ubuntu 12.04 32位系统,为了进行一些实验,我需要禁用ASLR;我应该如何做到这一点?在禁用ASLR之后,我应该做什么来重新启用它?
/proc/sys/kernel/randomize_va_space
接口在Linux中配置ASLR。mmap()
、VDSO和堆都会被随机化。
- 2 - 完全随机化。除了前一点列出的元素外,通过brk()
管理的内存也会被随机化。echo 0 | sudo tee /proc/sys/kernel/randomize_va_space
echo 2 | sudo tee /proc/sys/kernel/randomize_va_space
kernel.randomize_va_space = 0
brk()
是什么? - Shuzhengbrk()
是在内存分配过程中的断点地址。详细信息请参考https://stackoverflow.com/questions/6988487/what-does-the-brk-system-call-do - Niklas Rosencrantzrandomize_va_space = 1
下对其文本/数据/BSS进行ASLR。它实际上是一个带有入口点的ELF共享对象;这在历史上是一个愚蠢的计算机技巧,但偶然间起作用;现在它是构建可执行文件的标准方式。 - Peter Cordes/proc/sys/kernel/randomize_va_space
接口用于控制系统范围的ASLR。
如果您不想进行系统范围的更改,请使用 ADDR_NO_RANDOMIZE
personality 标志来临时禁用ASLR。可以使用 setarch
和其 -R
选项来控制该标志,例如:
setarch `uname -m` -R /bin/bash
这将为您打开一个新的 Bash shell,其中 ASLR 被禁用,包括从此 shell 运行的所有子进程。完成后,只需exit
即可退出 shell。
ulimit -s unlimited
可以有效地“禁用”ASLR。ulimit -s unlimited
并分配了CVE-2016-3672。arch
代替uname -m
,因为这个二进制文件本质上也是做同样的事情。 - drumfirearch
在 busybox 中不可用作 applet。 - youfu#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
的非零性而不是相等性测试:否则,如果你使用-z execstack
进行编译,可能会进入无限的exec
循环。
另请参阅personality
的手册页。
-fno-stack-protector
,而要允许在堆栈上执行代码,您需要使用-z execstack
进行编译。$ gcc -fno-stack-protector -z execstack -o <my_program> my_code.c
sudo sysctl kernel.randomize_va_space=0