got, plt

浅析ELF中的GOT与PLT 一、ELF简介 现在PC平台流行的可执行文件格式主要是Windows 下的PE(portable Executable) 和Linux的ELF(Excutable Linkable Format)。   编译器编译源代码后生成的文件叫做目标文件,从目标文件的结构上讲, 它是已经编译后的可执行文件格式,只是还没有链接的过程,其中可能有些符号或有些地址还没有被调整。其实它本身就 阅读详情

GOT, PLT

https://www.yuque.com/hxfqg9/bin/ug9gx5#xfDPU
https://www.bilibili.com/video/BV1a7411p7zK

以防丢失,记录一下

linux 下的动态链接是通过 PLT, GOT 实现。我们考察 test.c, test.o, test 来说明

首先通过 objdump -d test.o 查看反汇编,考察 glibc 的 printf。在 .o 文件 call printf 的时候地址先用 fc ff ff ff (有符号数 -4) 代替,交由链接器处理。

.text 段的权限是 rx,在这里填写的地址运行时无法修改。所以,链接器需要生成一个跳转代码段(即 .plt 的一项),作为中介跳转到动态库(.data)?

.text
call printf_stub; // 调用printf的call指令

printf_stub:
    jmp  [<address stores printf>]; // 获取printf的动态库地址,并跳转

.data
printf: ; // real printf

上述伪代码是不带延迟绑定的 plt 表项,其中,[<address stores printf>] 访问了 GOT 表,GOT 表的每一项保存一个地址(不是 jmp 指令)。plt, got 填写的地址在链接时确定。

延迟绑定

在调用动态函数时进行地址解析和重定位工作,伪代码形如

// 初始化时 printf@got 处填写 lookup_printf 的地址
void printf@plt()
{
address_good:
    jmp *printf@got 
lookup_printf:
  ;// 调用重定位函数查找 printf 地址,并写到 printf@got
	jmp address_good; // 返回执行 address_good
}
graph LR
A[printf@plt] --> |*printf@got| B[printf@plt]
B --> C[common@plt]
C --> D[_dl_runtime_resolve]

GOT 查询并不需要跳转 pc

实际 plt

查看 elf 文件中 .plt 节,.plt 节为每个函数生成了形如下面的代码

08048360 <setbuf@plt-0x10>: # fake symbol using the nearest one
 8048360:     push   0x804a004
 8048366:     jmp    *0x804a008
 804836c:     add    %al,(%eax)
	...

08048370 <setbuf@plt>:
 8048370:     jmp    *0x804a00c
 8048376:     push   $0x0
 804837b:     jmp    8048360 <setbuf@plt-0x10>

其中,每个 plt 表项会先试图跳转到 got 表项

  • got 表项初始值为 plt 表项的下一条指令,即 jmp 回来继续执行
  • 继续执行后将 push 函数标识,进入公共表项跳转到 _dl_runtime_resolve
  • 其中,0x0804a008 保存 _dl_runtime_resolve 的地址,初始为 0,运行后重写为实际函数地址
一些细节

_dl_runtime_resolve 通过访问 elf 的重定位符号表 .rel.plt 来决定应该把函数地址填回哪个 got.entry

使用 readelf -r 查看重定位信息,形如

Relocation section '.rel.plt' at offset 0x2b0 contains 1 entries:
 Offset     Info    Type            Sym.Value  Sym. Name
0804836c  00000107 R_386_JUMP_SLOT  00000000   printf

在 i386 架构下,除了每个函数占用一个 GOT 表项外,GOT 表前三项是 reserved,分别保存:

  • got [0]: 本 ELF 动态段 (.dynamic 段) 的装载地址
  • got [1]:本 ELF 的 link_map 数据结构描述符地址
  • got [2]:_dl_runtime_resolve 函数的地址

动态链接器在加载完 ELF 之后,都会将这3地址写到 GOT 表的前3项

PLT & GOT 表动态链接详解及 pwn 应用   动态链接,是提高程序空间效率的重要方法。通过动态链接, 我们可以调用外部共享库中的函数,而不需要将其编译在可执行文件中。在运行时动态链接的过程中,PLT表和GOT表起到了至关重要的作用。本文,我们就从运行过程的角度探究程序依靠这两个表进行动态链接的原理。   ps: 转眼加入优快云也已经一年了,从一年前的徒有热情却无目的,孤身在计算机的世界中摸索,到现在拥有了组织的归属,获得了许多前辈们的宝贵经验,也逐渐确定了自己在CTF中的方向:二进制安全。希望在接下来的一年中,能朝着既定的方向迈进。接下来我也会. 阅读详情

相关推荐

linux动态链接中的PLT和GOT,Linux中的GOT和PLT到底是个啥?

*本文原创作者:PhyzX,本文属FreeBuf原创奖励计划,未经许可禁止转载0x00 Intro本文以Ian Wienand的博客 为蓝本,我在必要的地方予以增补、解释以及再实验,希望读者对PLT和GOT有一个初步的、相对完整的认识。0x01The Simplest Example原文的标题是“PLT and GOT - the key to code sharing and dynamic l...

weixin_35126480的博客 1143

c语言密码字符串比较的漏洞,格式化字符串漏洞小结

格式化字符串漏洞的原理网上资料较多这里就不再进行过多的描述,我们知道在c语言中printf的正确使用方法类似是这种printf("%s",buf);但是现实情况下或许有人偷懒懒便这么写:printf(buf);这便造成了格式化字符串漏洞,这篇文章重点讲在不同的情况下格式化字符串漏洞的利用办法,大致分为以下几种:格式化字符串漏洞在栈上的利用格式化字符串在非栈上的利用以上两种情况又可以分成以下的三种情...

weixin_39708854的博客 423

动态链接——GOT和PLT

动态链接,地址无关代码,GOT表和PLT表

Shall#的博客 1766

GOT表和PLT表知识详解

GOTGOT表和PLTPLT表在程序中的作用非常巨大,接下来的讲解希望大家可以仔细看看我们用一个非常简单的例子来讲解,代码如下: 图1然后我们编译我们直接gdb./a.outgdb ./a.out来进行反编译处理,然后通过disasmaindisas main查看mainmain函数中的反编译代码如下:图3我们可以观察到gets@pltgets@plt和puts@pltputs@plt这两个函数,

qq_18661257的专栏 3万+

中科蓝讯蓝牙耳机SDK实战:从目录解析到消息处理框架

本文深入解析中科蓝讯蓝牙耳机SDK的目录结构与消息处理框架,提供从硬件驱动到蓝牙功能定制的实战指南。重点剖析SDK核心模块如消息队列机制、按键事件处理及电量报告优化,并分享二次开发中的调试技巧与避坑经验,助力开发者高效完成TWS耳机功能定制。

weixin_30335575的博客 387

lvgl 实现表格table,并且固定表头

嵌入式实现table,lvgl 实现原生表格table组件

m0_61704502的博客 1271

从elf文件动态加载的过程解释got,plt及got.plt,plt.sec

1. 概念定义 2. 测试源码 3. 外部函数调用对应着 .plt.sec 中的一小段代码, 4. .got.plt 将来存储实际的外部函数地址, 开始存储.plt中对应地址 5. plt 节对应一小段代码,即以槽号为参数,调用地址解析函数.把真实外部地址存入.got.plt表

hjjdebug的专栏 1354

【学习笔记】《基于φ-OTDR的分布式扰动传感系统定位算法研究-北交-通信与信息系统-吴》重点笔记

一、绪论 1.1 引言 光纤传感器的优点:跟电子传感器相比较,光纤传感器有诸多独特的优势:对电磁干扰免疫;具有很好的绝缘性和耐腐蚀性;灵敏度高,可测量微弱信息;可实现大范围监测和分布式传感,仅需一根传感光纤,更为经济便捷;传感光纤体积小、重量轻、可形变,适用于一些特殊应用场所;还有无需供电、耐高温、便于组网等等优点 光纤传感器的感知信号的方法:当探测光入射到光纤中时会发生散射并产生各种散射光...

qq_36045093的博客 2万+

结合延迟绑定分析ELF中的.plt .plt.got .got以及.got.plt

在逆向分析ELF文件的时候,常常会看到.plt .plt.got .got以及.got.plt这几个长得很像的节区,如下: readelf -S test 如果ELF文件中还使用了静态或者动态链接文件中的符号,还会包含一个.rel.plt节 关于这些节各自的作用,可以参考如下链接: https://www.codeleading.com/article/37234101170/ https://stackoverflow.com/questions/58076539/plt-plt-got-what-i

小小鱼的博客 2000

工商银行软件开发中心数据安全监测溯源防护体系建设成果及展望

结合业界先进溯源理念和我行管理要求,依托大数据、分布式搜索分析引擎等技术,构建PB级海量数据加工分析和小时级快速核验、检索、溯源手段(如图6所示),支撑6种客户敏感信息关键要素的单一或组合溯源,形成行之有效的数据安全溯源流程,配套落地自动化快速泄露样本真实性核验和灵活高效的溯源能力,通过数据相关属性的自动化分析,实现追踪泄露源头、明确泄露路径的目标,为有效应对数据安全事件,降低和消除风险与不良影响,开展事后追责处置工作提供体系化解决方案。提高数据排查的自动化程度和排查效率,降低人工成本。

银行信息系统应用架构详解 224

03 Token、Embedding、上下文窗口:开发者必须懂的三个基本概念

Token、Embedding 和上下文窗口是大模型应用开发的三个基础概念。本文从成本、速度、检索和上下文设计四个角度讲清它们的工程意义,帮助开发者理解为什么同一段内容会超限、变贵,为什么 RAG 能做语义检索。

老于的笔记的专栏 408

GOT表和PLT表

GOT表和PLT表 文章目录GOT表和PLT表前言一、GOT表二、PLT表总结 前言 程序对于外部函数的调用需要在生成可执行文件时将外部函数链接到程序中,(C语言应该讲过)链接的方式分为静态链接和动态链接。 静态链接得到的可执行文件包含外部函数的全部代码,动态链接得到的可执行文件中并不包含外部函数的代码,而是运行时将动态链接库(若干外部函数的集合)加载到内存的某个位置,再在发生调用时去链接库定位所需的函数。 怎么理解呢,这里打个比喻,静态链接是给你一件成品武器,调用时直接整个武器都已经组装好了到你手里,动

qq_52126646的博客 4260

【机器学习-17】数据变换---小波变换特征提取及应用案列介绍

小波变换作为一种前沿的数据分析工具,近年来在信号分析领域崭露头角。小波分析的理论和方法凭借其独特优势,在信号处理、图像处理、语音处理、模式识别以及量子物理等多个领域得到了广泛的应用,堪称近年来在工具及方法上的重大突破。小波变换以其多分辨率的特性,在时域和频域均展现出对信号局部特征的强大表征能力。通过伸缩和平移等运算过程,小波变换能够对信号进行多尺度聚焦分析,为非平稳信号的时频分析提供了一种有效手段。它允许我们由粗及细地逐步观察信号,从而精准地提取出有用信息。

qq_38614074的博客 2万+

PLT表和GOT表

GOT表和PLT表在程序中的作用非常巨大,接下来的讲解希望大家可以仔细看看 我们用一个非常简单的例子来讲解,代码如下: 图1 然后我们编译 我们直接 gdb./a.out 来进行反编译处理,然后通过disas main查看main函数中的反编译代码如下: 图3 我们可以观察到 gets@plt 和 puts@plt 这两个函数,为什么后面加了个 @plt ,因为这个为 PLT ...

AlexYoung28的博客 1666

基于UC3842的反激电源的全面深入解析与MATLAB仿真

内置电流检测,可实现电流模式控制,提高系统的动态响应性。多种保护功能,如欠压锁定、过温保护、短路保护等,确保系统的安全可靠运行。宽工作电压范围,适应不同的电源设计需求。简单的外部元件配置,易于实现。UC3842的典型应用包括开关电源、DC-DC转换器和反激式电源等,其稳定性和可靠性在实际应用中得到了广泛验证。

qq_38334677的博客 1086

本文将详细介绍如何在 Qt (C++) 应用程序中集成 osgEarth,加载三维数字地球,并在指定经纬度添加三维模型(如飞机、建筑等)。

OSG 与 Qt 的交互通常需要处理 OpenGL 上下文。osgEarth 3.x 提供了对 Qt 的较好支持,或者可以使用。在普通 OSG 程序中,你需要手动处理坐标系转换将经纬度转为笛卡尔坐标 (XYZ)。这是实现的关键,将 OSG 的渲染循环集成到 Qt 的事件循环中。第三方库,但在本教程中,我们将展示一种通过继承。,将 Qt 的输入事件转换为 OSG 理解的。事件,这是实现交互(旋转地球、缩放)的基础。来嵌入 OSG 视图的标准方法。在这里我们初始化地球并添加模型。节点简化了这一过程。

qq_45859163的博客 1045

GOT和PLT原理简析

GOT(Global Offset Table)和PLT(Procedure Linkage Table)是Linux系统下面ELF格式的可执行文件中,用于定位全局变量和过程的数据信息。以C程序为例,一个程序可能会包含多个文件,可执行文件的生成过程通常由以下几步组成。 1. 编译器把每个.c文件编译成汇编(.s)文件。 2. 汇编器把每个(.s)文件转换为(.o)文件。 3. 链接器把多个.

softee的专栏 1万+

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

【逆向学习记录】GOT表与PLT表

1.概述 在漏洞利用的时候,有几个表需要搞清楚,其中最重要的就是搞清楚PLT表,和Got表,学习的过程中主要参考的是以下文章,同时根据下面的这个表格进行调试工作,为了记录简单,本次采用的是32位程序,系统为ubuntu 16.04,重点参考一下博客,画的很漂亮 Got表和PLT表 2.调试分析 2.1 源代码 #include&amp;lt;stdio.h&amp;gt; int sum(int a,int b...

卦星的专栏 4852

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

PLT表和GOT表学习

GOT表和PLT表在程序中的作用非常巨大,接下来的讲解希望大家可以仔细看看 我们用一个非常简单的例子来讲解,代码如下:图1 然后我们编译 我们直接 gdb./a.out 来进行反编译处理,然后通过disas main查看main函数中的反编译代码如下: 图3 我们可以观察到 gets@plt 和 puts@plt 这两个函数,为什么后面加了个 @plt ,因为这个为 PLT 表...

至臻求学,胸怀云月 790

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

elf文件的GOT和PLT

转自个人博客0pt1mus 0x00 写在开始 首先,我是从PE文件开始学习的,之后接触到了Linux下的ELF文件,在本质上来说,无论是Windows下的PE文件,还是Linux下的elf文件,他们本质上都是一个可执行文件,所运行的平台不同,它们的文件格式也有不同,但究其本质,还是会有互通的地方。 0x01 基础知识 首先,elf文件也是由众多的节构成的,可以通过objdump -h查看。 下...

0pt1mus 1779

got、plt表介绍

1. GOT表和PLT表 GOT(Global Offset Table,全局偏移表)是Linux ELF文件中用于定位全局变量和函数的一个表。PLT(Procedure Linkage Table,过程链接表)是Linux ELF文件中用于延迟绑定的表,即函数第一次被调用的时候才进行绑定。 2. 延迟绑定 所谓延迟绑定,就是当函数第一次被调用的时候才进行绑定(包括符号查找、重定位等),如果...

Android系统攻城狮 2368

PWN基础15:GOT表 和 PLT表

今天来学习GOT表和PLT表 操作系统通常使用动态链接的方法来提高程序运行的效率。在动态链接的情况下,程序加载的时候并不会把链接库中所有函数都一起加载进来,而是程序执行的时候按需加载,如果有函数并没有被调用,那么就不会再程序中被加载进来。 现代操作系统不允许修改代码段,只能修改数据段,那么GOT表与PLT表就应运而生。 参考 https://zhuanlan.zhihu.com/p/130271689 ...

prettyX的博客 3065

PWN got表跟plt表

为了更好的用户体验和内存CPUCPU的利用率,程序编译时会采用两种表进行辅助,一个为PLTPLT表,一个为GOTGOT表,PLTPLT表可以称为内部函数表,GOTGOT表为全局函数表。 PLTPLT表中的每一项的数据内容都是对应的GOTGOT表中一项的地址这个是固定不变的,到这里大家也知道了PLTPLT表中的数据根本不是函数的真实地址,而是GOTGOT表项的地址。 ...

weixin_43225801的博客 2058
上一篇: android 动态库加载机制
下一篇: Attanger: Zotfile 插件在 Zotero7 的平替
dilvx
博客等级 码龄5年 892粉丝 73原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值