我读了InfoSec研究所的这篇文章:
http://resources.infosecinstitute.com/an-introduction-to-returned-oriented-programming-linux/#gref
直到他做了ROP链。
他发现印刷品的偏移量是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@ get的绝对地址,但他将0x138e9ff4加载到ebx中,他说这是因为:
printf@got + 0xb8a0008 = 0x138e9ff4
我只是不知道他是如何计算0x138e9ff4值的,因为ASLR是启用的,而printf@got每次都应该不同,因此加载到ebx中的值也应该是不同的。
如果您有任何意见,我会很感激
发布于 2017-07-31 10:47:46
我同意这篇文章中解释得很差。我读了几本书才明白到底发生了什么事。
关键部分在这里:
我们现在的目标是构建一个链式ROP来执行execve()。正如我们所看到的,对于这个函数,我们没有GOT条目,libc是随机的。所以我们首先要做的是泄漏GOT的libc函数地址,然后做一些琐碎的计算,得到精确的execve地址。
他们假设你有一个信息泄漏,告诉你任何一个libc函数在哪里。在本例中,他们使用printf作为示例。
从那时起,这种利用就更有意义了:
第一步是使用pop; pop; leave小工具,用0x328160填充eax,用0x138e9ff4填充ebx。当执行该add指令时,它计算0x138e9ff4-0xb8a0008= 0x8049fec。这是示例中printf@got的地址。注意,这是printf的全局偏移表(GOT)条目的地址,而不是实际的printf函数本身。GOT的基址在普通Linux中并不是随机的(它可能在grsec硬化的内核中;我还没有研究它)。
现在的指令实质上是:add eax, [0x8049fec]。攻击者知道,对于libc的目标版本,printf和execve之间的距离为0x328160,因此当该指令运行时,它从GOT获取printf函数的地址,并将0x328160添加到它(来自eax,该地址由pop弹出离开预加载),将execve的地址加载到eax中。
然后,call eax执行execve。
https://security.stackexchange.com/questions/166386
复制相似问题