当前位置: 首页 > news >正文

简单聊聊PLT和GOT

在 Linux 的动态链接中,PLT(Procedure Linkage Table)GOT(Global Offset Table) 是动态链接机制中的两个关键组件,它们一起支持程序动态加载共享库以及在运行时解析符号地址。下面是它们的作用和原理:

PLT(Procedure Linkage Table)

作用:

PLT 是一个跳转表,用于调用共享库中的函数。它在程序运行时动态解析函数地址,从而实现对共享库函数的调用。

工作原理:

当程序第一次调用共享库中的函数时,会通过 PLT 跳转到一个 stub 代码段。这个 stub 会将控制权转移到动态链接器(ld.so),动态链接器会在 GOT 中查找或解析目标函数的实际地址,然后更新 GOT 的对应条目,之后,再次调用同一函数时,PLT 会直接从 GOT 中读取已解析的地址并跳转到目标函数。

特点:

PLT 本质是间接调用函数的“中介”,通过延迟绑定(lazy binding),减少程序启动时的解析开销。这种动态解析机制可以有效支持动态库的更新,而无需重新编译链接主程序。

GOT(Global Offset Table)

作用:

GOT 是一个表,存储程序运行时需要使用的全局变量和函数的实际地址。

工作原理:

程序加载时,GOT 的条目中存储的是共享库函数的默认入口地址(通常指向 PLT 中的 stub),当动态链接器解析了实际的函数地址后,会更新 GOT 对应的条目,使其指向正确的目标函数,之后,主程序对函数的调用直接通过 GOT 获取实际地址,提高效率。

特点:

GOT 是程序的数据段(.got)的一部分,它与延迟绑定相结合,使得程序可以在运行时动态调整符号地址。

PLT 和 GOT协作完成工作

工作流程: 首先主程序中所有对共享库函数的调用,都会经过 PLT 跳转。然后PLT 中的第一跳通常指向 GOT 表中的一项。此时GOT 中的条目在未解析时会指向 PLT 中的 stub 地址,动态链接器负责更新 GOT 条目。解析完成后,GOT 保存目标函数的真实地址,后续调用直接通过 GOT 加快速度。

实例: 假设程序调用printf函数,程序跳转到printf@PLT。printf@PLT中的代码访问printf@GOT条目。如果是第一次调用,printf@GOT指向 PLT 的解析代码。如果已解析,直接跳转到解析后的printf地址。动态链接器解析并填充printf@GOT,更新为printf的实际地址。

安全性问题(pwn): 在二进制漏洞利用中,如果没有启用RELRO(Relocation Read-Only机制,攻击者可能覆盖 GOT 中的条目,将其重定向到恶意代码,或者在动态链接完成之前,攻击者可能利用未解析的函数地址。

最后,如果想深入了解plt和got,可以深入分析一个 ELF 文件,直接观察它相应段的内容。

http://www.lryc.cn/news/499986.html

相关文章:

  • FaRM译文
  • 用vue框架写一个时钟的页面
  • HTML表单-第二部分
  • PyQt5:一个逗号引发的闪退血案
  • AI智能体Prompt预设词指令大全+GPTs应用使用
  • SSM整合原理实战案例《任务列表案例》
  • 在风能市场持续增长的情况下,全球【环氧活性稀释剂】的需求呈现明显上涨的趋势
  • CSS一些小点 —— 12.7
  • [NeurlPS 2022] STaR 开源代码实现解读
  • Android笔记【15】跳转页面返回信息
  • 使用 Qt 打造高效的 .run 软件包管理器
  • python学opencv|读取视频(二)制作gif
  • 19. Three.js案例-创建一个带有纹理映射的旋转平面
  • ASP.NET|日常开发中常用属性详解
  • vscode CMakeLists中对opencv eigen的引用方法
  • 使用Goland对6.5840项目进行go build出现异常
  • Plugin - 插件开发06_开源项目JPom中的插件实现机制
  • 关于成功插入 SQLite 但没有数据的问题
  • 单片机+Qt上位机
  • C++ 类和对象(中)
  • 在做题中学习(79):最小K个数
  • spark3 sql优化:同一个表关联多次,优化方案
  • JavaWeb学习(4)(四大域、HttpSession原理(面试)、SessionAPI、Session实现验证码功能)
  • Ubuntu22.04系统源码编译OpenCV 4.10.0(包含opencv_contrib)
  • 【Unity高级】在编辑器中如何让物体围绕一个点旋转固定角度
  • 2024.11.29——[HCTF 2018]WarmUp 1
  • AGameModeBase和游戏模式方法
  • Swift 扩展
  • 【NebulaGraph】官方查询语言nGQL教程1 (四)
  • 阿里云负载均衡SLB实践