newstar2023 week3 - dlresolve
文件分析
NX on, PIE off, Canary off, RELRO partial
ghidra分析为64位程序
解题思路
题目提示了使用ret2dlresolve,我们可以直接使用pwntools的工具生成
官方题解用了比较复杂的方式,而且与脚本实现也有很多不同,所以我就想弄清楚 pwntools 与官方题解有什么区别,因此下文只解析pwntools的实现,文末我也会把官方题解放上
EXPLOIT
1 | # copy from official sample |
Ret2Dlresolve对象详解
相比起官方脚本,用工具生成不但简单,而且payload也短,以下是我的研究结果
使用rop.dump(),我们得以窥见rop攻击的具体含义:
1 | 0x0000: 0x40116b pop rsi; ret |
ps: 复盘的时候忘记加
context.arch = 'amd64'了,dump结果都变了,一定要注意!
到read都不必我说,接下来pop的rdi,是指向伪造出来的"/bin/sh"字符串的指针,
这样就能在解析完成后指定参数打开shell;然后0x401020是plt_init的地址,
这个“函数”做两件事:将link_map压到栈上,然后执行dl_runtime_resolve函数进行加载
栈上还有一个index,是下图中的reloc_arg,可以由此指向伪造的ElfRel
那么这里为什么reloc_arg是0x30b呢?查了以下pwntools的源码,计算可推出如下关系:
reloc_arg * ElfRel.size + __DT_JMPREL -> &fakeRel
因为64位下ElfRel的大小是24字节,计算中可以将24带入;__DT_JMPREL是指__DT_JMPREL这个标签的地址;
这里使用'->'是因为这两边并不一定相等,而是存在对齐调整的
至此,rop部分已经分析完毕
接下来是dlresolve.payload部分:这一部分没有dump函数,只有bytes,
不过动调以后也逐渐搞明白了其结构,接下来用伪c代码,按结构展开各个字节对应的内容
(前面的标号是字段在payload中的起始地址)
1 | 0: "system\0a" // 'a' for padding |
共计64字节,无关的条目全部填0,需要伪造的条目已经在后面写上了注释,具体dlresolve的执行流程见下图:
可以看到,所生成的结构在函数解析中一次次被使用,没有任何多余
如果到这里还觉得迷迷糊糊的话,建议动调步进观察dl_fixup函数的运行情况;
此外我在研究的时候也离不开这篇知乎文章的深入讲解,
搭配两者一起使用,是能理解其中奥秘的根本
另外,作者还提到了其他文章所没有介绍的Full Relro的利用方法,也可以学习一下
参考
Done.
- 标题: newstar2023 week3 - dlresolve
- 作者: RocketDev
- 创建于 : 2023-10-10 12:00:00
- 更新于 : 2024-08-26 17:18:00
- 链接: https://rocketma.dev/2023/10/10/W3_dlresolve/
- 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。