这几天学习了 return-to-dl-resolve 的知识 在这里做一些总结。
看了两个师傅的博客

l1nk3dHouse
http://pwn4.fun

首先我们要了解到的是在ELF文件中 存在着一种延时绑定机制 叫做 : lazy binding。这种方式会在第一次调用一个函数时启动。

关于 lazy binding

  1. 在第一次调用程序的一个函数时。会去call 一个函数。
  2. 然而这个call 函数指向的地方(0x80483d0)的代码为

    这个时候发现 在 write@plt 的第一个代码是一个 jmp 跳到 (0x804a01c)保存的指针去。

    但是发现这个 地址并不是我们想要去的 wirte 函数的地址 而是指向了 write@plt 的下一行代
  3. 接下来 程序进行了 一个 push 和 一个 jmp指令。跳转到 (0x8048380)而这个地址可以用 readelf -S 文件名来找到 发现这个 地址是.plt的起始地址也就是PLT[0]
  4. 在jmp到这个 地址后发现有 push 了一个值然后跳转到了 _dl_runtime_resolve 函数

    然后 调用这个 函数 实现 延迟绑定。 这个函数的 原型为
    _dl_runtime_resolve(*link_map, rel_offset) rel_offset 是 2.中push的值,link_map为 3.中push的值。

从而执行 找到write函数的真实地址 从而在下一次调用的时候直接跳转到 write函数去。


结合 IDA 反编译

  1. 第一次call 函数会跳转到 .plt
  2. 然后跳转到 0x804a01c的地址保存的地方 这个地方应该为
点击收藏 | 2 关注 | 2
  • 动动手指,沙发就是你的了!
登录 后跟帖