Ret2dlresolve
基本信息
如GOT/PLT和Relro页面所述,没有Full Relro的二进制文件将在首次使用时解析符号(如外部库的地址)。这种解析是通过调用函数**_dl_runtime_resolve**来实现的。
_dl_runtime_resolve函数从堆栈中获取一些结构的引用,以便解析指定的符号。
因此,可以伪造所有这些结构,使动态链接解析请求的符号(如**system函数)并使用配置的参数(例如system('/bin/sh'))进行调用。
通常,通过创建一个初始ROP链调用read来伪造所有这些结构,然后将结构和字符串**'/bin/sh'传递,以便它们被read存储在已知位置,然后ROP链继续调用_dl_runtime_resolve,使其在伪造的结构中解析system**的地址并使用地址调用此地址到'/bin/sh'。
如果没有系统调用gadgets(用于使用技术,如ret2syscall或SROP)并且没有泄漏libc地址的方法,这种技术特别有用。
在视频的后半部分中查看有关此技术的详细解释:
或查看以下页面以逐步解释:
攻击摘要
在某个位置写入伪造结构
设置
system的第一个参数($rdi = &'/bin/sh')在堆栈上设置要调用**
_dl_runtime_resolve**的结构的地址调用**
_dl_runtime_resolve****
system**将被解析并使用'/bin/sh'作为参数调用
根据pwntools文档,这是**ret2dlresolve**攻击的样子。
示例
纯Pwntools
您可以在这里找到此技术的示例 包含了最终ROP链的非常好的解释,但这里是使用的最终利用:
原始
其他示例和参考资料
32位,无relro,无canary,nx,无pie,基本的小缓冲区溢出和返回。要利用它,使用bof再次调用
read,使用.bss部分和更大的大小,将dlresolve伪造表存储在那里以加载system,返回到主函数并重新滥用初始bof以调用dlresolve,然后system('/bin/sh')。
最后更新于