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