Fork me on GitHub
pikachu's Blog

plt&got

  • 学习一些 pwn 的知识,简单记录帮助自己理解

Preview

  • .got

    • GOT(Global Offset Table) 全局偏移表。这是链接器为外部符号填充的实际偏移表。
  • .plt

    • PLT(Procedure Linkage Table) 程序链接表。它有两个功能,要么在 .got.plt 节中拿到地址并跳转,要么当 .got.plt 没有所需地址时,触发链接器去找到所需地址。
  • .got.plt

    • 这个是 GOT 专门为 PLT 专门准备的节。.got.plt 中的值是 GOT 的一部分,它包含上述 PLT 表所需的地址(已经找到的和需要去触发的)
  • .plt.got

    • Unknown

Analyse

  • 下面所有的图片来自于 https://blog.csdn.net/weixin_44681716/article/details/89877497
  • 程序编译时会采用两种表进行辅助,一个为 PLT 表,一个为 GOT 表,这两个表是相对应的。PLT 表中的每一项的数据内容都是对应的 GOT 表中一项的地址,这个是固定不变的,PLT 表中的数据不是函数的真实地址,而是 GOT 表项的地址。

  • 下图是第一次调用函数的流程
    • 第一步,由函数调用跳入到 PLT 表中
    • 第二步,PLT 表跳到 GOT 表中
    • 第三步,GOT 表回跳到 PLT 表中,这时候进行压栈,把代表函数的 ID 压栈
    • 第四步,跳转到公共的 PLT 表项中
    • 第五步,进入到 GOT
    • 第六步,_dl_runtime_resolve 对动态函数进行地址解析和重定位
    • 第七步,把动态函数真实的地址写入到 GOT 表项中
    • 第八步,执行函数并返回

  • 下图是第二次调用函数的流程
    • 第一步,由函数调用调入到 PLT 表中
    • 第二步,跳入到 GOT 表,由于这时候该表项已经是动态函数的真实地址,所以可以直接执行然后返回

Reference
https://blog.csdn.net/weixin_44681716/article/details/89877497
https://systemoverlord.com/2017/03/19/got-and-plt-for-pwning.html

---------------- The End ----------------
谢谢大爷~

Author:pikachu
Link:https://hitcxy.com/2020/plt-got/
Contact:hitcxy.cn@gmail.com
本文基于 知识共享署名-相同方式共享 4.0 国际许可协议发布
转载请注明出处,谢谢!