这几天学习了 return-to-dl-resolve 的知识 在这里做一些总结。
看了两个师傅的博客
首先我们要了解到的是在ELF文件中 存在着一种延时绑定机制 叫做 : lazy binding。这种方式会在第一次调用一个函数时启动。
关于 lazy binding
- 在第一次调用程序的一个函数时。会去call 一个函数。
- 然而这个call 函数指向的地方(0x80483d0)的代码为
这个时候发现 在 write@plt 的第一个代码是一个 jmp 跳到 (0x804a01c)保存的指针去。
但是发现这个 地址并不是我们想要去的 wirte 函数的地址 而是指向了 write@plt 的下一行代
- 接下来 程序进行了 一个 push 和 一个 jmp指令。跳转到 (0x8048380)而这个地址可以用 readelf -S 文件名来找到 发现这个 地址是.plt的起始地址也就是PLT[0]
- 在jmp到这个 地址后发现有 push 了一个值然后跳转到了 _dl_runtime_resolve 函数
然后 调用这个 函数 实现 延迟绑定。 这个函数的 原型为
_dl_runtime_resolve(*link_map, rel_offset)
rel_offset 是 2.中push的值,link_map为 3.中push的值。
从而执行 找到write函数的真实地址 从而在下一次调用的时候直接跳转到 write函数去。
结合 IDA 反编译
- 第一次call 函数会跳转到 .plt
- 然后跳转到 0x804a01c的地址保存的地方 这个地方应该为
点击收藏 | 2
关注 | 2