如何使用 ROP 绕过 ASLR

信息安全 开发 开发开发 部件 glibc
2021-08-15 23:30:44

我正在阅读 InfoSec 研究所的这篇文章:

http://resources.infosecinstitute.com/an-introduction-to-returned-oriented-programming-linux/#gref

并且能够跟随,直到他完成了 ROP 链。

他发现 printf 和 execve 的偏移量是 328160

然后,他找到以下 ROP 小工具:

0x804886eL: add eax [ebx-0xb8a0008] ; add esp 0x4 ; pop ebx
0x804861fL: call eax ; leave ;;
0x804849cL: pop eax ; pop ebx ; leave ;;

我知道这个想法是将execve的绝对地址加载到eax中然后调用eax,但我迷路的是他这样做的方式。

小工具:

0x804886eL: add eax [ebx-0xb8a0008] ; add esp 0x4 ; pop ebx

添加 eax 和 [ebx - 0xb8a0008],然后将其存储在 eax 中以供下一个小工具调用。

现在的目标似乎是让 ebx 包含 printf@got 的绝对地址,但他将 0x138e9ff4 加载到 ebx 中,他说这是因为:

printf@got + 0xb8a0008 = 0x138e9ff4

我只是不知道他如何计算值 0x138e9ff4,因为启用了 ASLR 并且 printf@got 每次都应该不同,因此加载到 ebx 的值也应该如此。

将不胜感激你有任何意见

1个回答

我同意这篇文章的解释很差。我读了几遍才明白到底发生了什么。

关键部分在这里:

我们现在的目标是构建一个链式 ROP 来执行 execve()。正如我们所见,我们没有这个函数的 GOT 条目,并且 libc 是随机的。

所以我们首先要做的是泄漏 GOT 的 libc 函数地址,然后我们将做一些简单的计算来获得确切的 execve libc 地址。

他们假设您有信息泄漏,告诉您任何单个 libc 函数在哪里。在这种情况下,他们使用 printf 作为示例。

从那里开始,漏洞利用变得更有意义:

第一步是他们使用小工具用 0x328160 填充 eax 和用 0x138e9ff4 填充 ebx pop; pop; leave执行该add指令时,它会计算 0x138e9ff4 - 0xb8a0008 = 0x8049fec。这是示例中 printf@got 的地址。请注意,这是 printf 的全局偏移表 (GOT) 条目的地址,而不是实际的 printf 函数本身。GOT 的基地址在常规 Linux 中不是随机的(它可能在 grsec 加固的内核中;我还没有研究过)

该指令现在基本上是:add eax, [0x8049fec]. 攻击者知道,对于libc的目标版本,printf和execve之间的距离是0x328160,所以当这条指令运行时,它会从GOT中获取printf函数的地址并将0x328160添加到它(来自eax,它是由pop预加载的) pop leave) 将 execve 的地址加载到 eax 中。

然后call eax执行execve。