我正在使用 Ubuntu 12.04 32 位,对于某些实验,我需要禁用 ASLR;我如何做到这一点?之后我应该怎么做才能再次启用 ASLR?
ger*_*ijk 105
根据一篇文章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
Run Code Online (Sandbox Code Playgroud)
并再次启用它,运行
echo 2 | sudo tee /proc/sys/kernel/randomize_va_space
Run Code Online (Sandbox Code Playgroud)
这不会在重新启动后继续存在,因此您必须在sysctl
. 添加/etc/sysctl.d/01-disable-aslr.conf
包含以下内容的文件:
kernel.randomize_va_space = 0
Run Code Online (Sandbox Code Playgroud)
应该永久禁用此功能。
you*_*ufu 33
该/proc/sys/kernel/randomize_va_space
界面控制 ASLR 系统范围。
如果您不想进行系统范围的更改,请使用ADDR_NO_RANDOMIZE
个性标志暂时禁用 ASLR。可以使用setarch
及其-R
选项来控制此标志,例如
setarch `uname -m` -R /bin/bash
Run Code Online (Sandbox Code Playgroud)
这将在禁用 ASLR 的情况下为您打开一个新的 Bash shell,包括从此 shell 运行的所有子进程。完成后只需exit
外壳。
顺便说一句,在 i386 上,ulimit -s unlimited
可以有效地“禁用”ASLR。
编辑(2016 年 4 月):ulimit -s unlimited
已修复并分配CVE-2016-3672。
小智 8
如果你想构建一个在运行时禁用 ASLR 的程序,你可以personality
在 Linux 上使用系统调用。这是一个食谱:
#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);
}
Run Code Online (Sandbox Code Playgroud)
如果您查看 的源代码setarch
,它会personality
大致以这种模式调用两次。主要区别在于它setarch
调用exec
其他程序,而我的菜谱exec
本身。重要的是,您使用非零性测试而不是相等性测试:否则,如果您使用 进行编译,则& ADDR_NO_RANDOMIZE
可能会进入无限循环。exec
-z execstack
另请参见的手册页personality
。
归档时间: |
|
查看次数: |
178847 次 |
最近记录: |