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
