linux 地址随机化 vdso,如何暂时禁用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_code.c

参考资料

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值