首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何利用ROP绕过ASLR

如何利用ROP绕过ASLR
EN

Security用户
提问于 2017-07-30 20:47:14
回答 1查看 6.4K关注 0票数 5

我读了InfoSec研究所的这篇文章:

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

直到他做了ROP链。

他发现印刷品的偏移量是328160。

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

代码语言:javascript
复制
0x804886eL: add eax [ebx-0xb8a0008] ; add esp 0x4 ; pop ebx
0x804861fL: call eax ; leave ;;
0x804849cL: pop eax ; pop ebx ; leave ;;

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

这个小玩意:

代码语言:javascript
复制
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中的值也应该是不同的。

如果您有任何意见,我会很感激

EN

回答 1

Security用户

发布于 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。

票数 4
EN
页面原文内容由Security提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://security.stackexchange.com/questions/166386

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档