1

我一直在为故意易受攻击的(我写的)编写基于堆的缓冲区溢出漏洞利用。为了劫持控制流,我在堆栈上覆盖了函数的返回地址。

这些漏洞利用取决于堆栈位于特定(硬编码)位置。

我认为这没问题,因为我禁用了 ASLR(我正在运行 Ubuntu 14.04,x86_64):

我通过添加并重新启动机器kernel.randomize_va_space = 0来禁用 ASLR 。/etc/sysctl.conf我已通过以下命令确认已禁用 ASLR:

$ cat /proc/sys/kernel/randomize_va_space   
0

但是 main 开始时堆栈的地址明显改变。为了测试这一点,我在 gdb 中加载了程序并在第一条 asm 指令上中断并执行了以下操作:

(gdb) p $rsp
$1 = (void *) 0x7fffffffe538

然后我重新启动并做了同样的事情

(gdb) p $rsp
$1 = (void *) 0x7fffffffe558

这种行为是预期的吗?我可以禁用它以使特定的二进制文件始终具有相同的堆栈地址吗?如果不是真正的漏洞利用需要泄漏堆栈的地址来做到这一点?有没有一种通用的技术?

4

0 回答 0