权当给自己看的记录了,ret2dl-resolve有点难
分析
测试程序如下
1 |
|
got表plt表什么的就不提了,反正就看一下puts函数内部咋执行的
具体细节参考:https://bbs.pediy.com/thread-227034.html
我只不过是看一下64位是个什么情况,顺便加深一下理解
我们打断点到puts函数调用时的jmp处
可以看到resolve,这个函数的目的,是根据2个参数获取到导出函数(这里是puts)的地址,然后放到相应的GOT表,并且调用它,两个参数0,0x601008,先看一下0x601008
可以看到0x600e20,就是我们的_DYNAMIC的指针
至于我们一开始的push 0 是我们puts函数的索引,可以在如下看到的确是第一个
基本就是靠着索引拿到rel table的偏移量,然后移位操作,在sym table 拿到对应的符号表信息,然后再去对应的字符串表里再找出来,然后差这个函数的地址,放到got表里面去
大概就是这样的吧……
例题
跟着大神的思路做一遍RCTF的RNote4,一个堆题
这题还挺坑的,打开输啥反应都没有,只能直接分析,no relro,no pie,开始查找漏洞
各个函数的功能我们也只能自己猜,不过有以下calloc,free什么的稍微好猜些
1 | unsigned __int64 edit() |
note一开始就在bss字段上,编辑的时候size也是我们说了算了,可以溢出
1 | unsigned __int64 add() |
可以分析一下结构体了
1 | struct note |
我们创建两个chunk之后看一下也蛮清楚的
exp其实原文写的已经很清楚了,就跟着调试一波就好了,贴一下大神的exp
1 | from pwn import * |
我个人觉得这题最难的是分析吧,一开始,一方面是我堆接触的少,但是这个add note 之后chunk的嵌套我觉得还蛮坑的,以后看的多了应该就好了
这里后面的edit中的p64(33)+p64(0x18)只是为了尽可能的保持堆块不被破坏,维持add时的size大小,然后把数据改为了dynamic的字符串表指针
这样我们再编辑chunk1的时候,编辑的就是dynamic的字符串表指针了,如下
改成了bss字段上的数据,但是我们虽然可以控制bss字段上的数据,但是字段上的数据我们还没改,所以我们需要再overflow一次,来吧chunk1的数据改成我们可控的bss字段地址,然后再往里面写上我们的payload,然后就可以执行我们想要的了
这一切都是基于.dynamic可写,直接改string table 从而把写入got表的内容改为我们所需要的
例题2
可总有我们修改不了.dynamic,有时候一个简单的partial relro就足以让人感到头大
我们也都知道上文中那个0(puts)其实是我们的rel table 的参数,我们可以操纵第二个参数,使其指向我们所构造的Elf32_Rel
例题还是拿原博主的吧,写的真的很适合小白看
1 | int __cdecl main(int a1) |
函数流程超级简单,就是一个栈溢出,没开canary保护,但是我们无法修改.dynamic
先直接上exp,慢慢调试
1 | from pwn import * |
本文链接: http://woaixiaoyuyu.github.io/2019/02/18/Pwn-ret2dl-resolve/
版权声明: 本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。转载请注明出处!