GOT表和PLT表

作者: Linkingg | 来源:发表于2017-05-12 10:39 被阅读786次

GOT是一个存储外部库函数的表

PLT则是由代码片段组成的,每个代码片段都跳转到GOT表中的一个具体的函数调用

重定位

链接时重定位

链接阶段是将一个或多个中间文件(.o文件)通过链接器将它们链接成一个可执行文件,主要做的事情有

对各个中间文件的同名section进行合并

对代码段,数据段等进行地址分配

进行链接时重定位

两种情况:

如果是在其他中间文件中已经定义了的函数,链接阶段可以直接重定位到函数地址

如果是在动态库中定义了的函数,链接阶段无法直接重定位到函数地址,只能生成额外的小片段代码,也就是PLT表,然后重定位到该代码片段

运行时重定位

运行后加载动态库,把动态库中的相应函数地址填入GOT表,由于PLT表是跳转到GOT表的,这就构成了运行时重定位

延迟重定位

只有动态库函数在被调用时,才会进行地址解析和重定位工作,这时候动态库函数的地址才会被写入到GOT表项中

函数第一次被调用过程

第一步由函数调用跳入到PLT表中,然后第二步PLT表跳到GOT表中,可以看到第三步由GOT表回跳到PLT表中,这时候进行压栈,把代表函数的ID压栈,接着第四步跳转到公共的PLT表项中,第5步进入到GOT表中,然后_dl_runtime_resolve对动态函数进行地址解析和重定位,第七步把动态函数真实的地址写入到GOT表项中,然后执行函数并返回。

解释下dynamic段,link_map和_dl_runtime_resolve

dynamic段:提供动态链接的信息,例如动态链接中各个表的位置

link_map:已加载库的链表,由动态库函数的地址构成的链表

_dl_runtime_resolve:在第一次运行时进行地址解析和重定位工作

函数之后被调用过程

可以看到,第一步还是由函数调用跳入到PLT表,但是第二步跳入到GOT表中时,由于这个时候该表项已经是动态函数的真实地址了,所以可以直接执行然后返回。

对于动态函数的调用,第一次要经过地址解析和回写到GOT表项中,第二次直接调用即可

相关文章

  • GOT表和PLT表

    GOT是一个存储外部库函数的表 PLT则是由代码片段组成的,每个代码片段都跳转到GOT表中的一个具体的函数调用 重...

  • pwn6 介绍got plt以及libc.so

    GOT表和PLT表: GOT(Global Offset Table,全局偏移表)是Linux ELF文件中用于定...

  • got表与plt表

    转自:http://blog.csdn.net/linyt/article/details/51635768 在介...

  • 2018-02-24

    PLT的真正实现要更复杂些,ELF将GOT拆分成两个表“.got”和”.got.plt”,前者用来保存全局变量引用...

  • 深入理解GOT表和PLT表

    0x01 前言 操作系统通常使用动态链接的方法来提高程序运行的效率。在动态链接的情况下,程序加载的时候并不会把链接...

  • GOT表与PLT表的作用

    地址无关代码(Position-Independent Code) 如果共享文件(.so文件)需要加载到一个特定的...

  • GOT表 & PLT表 | Global Offset Tabl

    GOT表是程序中的一个section,负责存放动态链接的函数地址,除非被标记为Full RELRO (GCC默认采...

  • Pwnable.kr-5.passcode

    源码: 结合了网上的解释大致了解了1.首先了解got和plt表的大致意思2.进入远程登录平台3.查看源代码4.分析...

  • GOT表覆写技术

    GOT表:概念:每一个外部定义的符号在全局偏移表(Global offset Table)中有相应的条目,GOT位...

  • Android平台导入表Hook方式实现[转载]

    转自游戏安全实验室 本文会介绍Android平台下导入表Hook的实现过程,导入表(.Got表)的Hook实现有很...

网友评论

本文标题:GOT表和PLT表

本文链接:https://www.haomeiwen.com/subject/aukztxtx.html