elf文件的GOT和PLT
转自个人博客0pt1mus
0x00 写在开始
首先,我是从PE文件开始学习的,之后接触到了Linux下的ELF文件,在本质上来说,无论是Windows下的PE文件,还是Linux下的elf文件,他们本质上都是一个可执行文件,所运行的平台不同,它们的文件格式也有不同,但究其本质,还是会有互通的地方。
0x01 基础知识
首先,elf文件也是由众多的节构成的,可以通过objdump -h
查看。
下面解释.got
、.plt
、.got.plt
三个节。
.got
GOT(Global Offset Table)全局偏移表。这是链接器为外部符号填充的实际偏移票。
.plt
PLT(Procedure Linkage Table)程序链接表。作用是一个跳板,保存了某个符号在重定位表中的偏移量(用来第一次查找某个符号)和对应的.got.plt的对应的地址。它有两个功能,要么在.got.plt
节中拿到地址,并跳转。要么当.got.plt
没有所需地址的时候,触发链接器去找到所需的地址。
.got.plt
这个是GOT专门为PLT准备的节。保存了重定位地址。.got.plt
中的值是GOT的一部分。它包含上述PLT表所需地址(已经找到的和需要去触发的)。
实例
比如printf是一个重定位符号,需要链接该符号时过程是这样:
main函数call .plt段中的一个地址,这里的第一句话就是跳转到.got.plt中的保存的printf的地址,如果是第一次,那么保存的地址就是.plt中的下一句话,这个下一句话就是压入这个符号在.rel.plt中的重定位表的偏移量,然后ld程序就会根据重定位表中的信息加上这个偏移量找到这个地址,保存到重定位表所指向的地址中,这个地址其实就是.got.plt段的一个地址。
第二次调用时就可以直接获取到.got.plt中保存的地址了。
0x02 实践
接下来我们来实践一下,加深对这几个节的认识。
首先要有一个分析的程序,我们用一个helloworld。
//gcc -m32 -no-pie -g -o helloworld_li helloworld.c
//-g 产生有调试符号的程序
#include<stdio.h>
#include<stdlib.h>int main(int argc, char const *argv[])
{puts("Hello World!\n");return 0;
}
用gdb打开该文件,开始分析:
首先反汇编main
找到call puts的地址,用
b *0x804844b
下断点,r
执行到断点处并通过si
单步步入。我们可以看到当前指令是jmp跳转指令,跳转到0x804a00c。
我们之前通过
objdump
查看该文件的各个节,发现0x804a00c是在.got.plt
中。我们使用
x/wx 0x804a00c
查看这个位置的值。发现该地址存着的信息是当前执行指令的下一个位置。所以执行
jmp [0x804a00c]
后会到0x80482e6
的位置。这里就可以理解,在第一次执行时,plt在
.got.plt
中没找到puts函数的地址,然后触发链接器去寻找puts函数的地址。通过
finish
执行完当前函数,然后再查看0x804a00c
位置的内容。可以发现该位置的值已经变了,该地值便是puts函数的地址。
0x03 总结
主要是在学习rop的时候,中间提到了return to libc
,通过调用系统函数,而不是shellcode来实现打开shell。有一种方法是return to PLT
,因为之前学习的是windows下的,对这个PLT很陌生,因此查资料学习了一下。windows下和linux下,有很多共通的地方,比如说这里的.plt
和.got.plt
同windows下的PE文件输入表中的INT
和IAT
很像。
参考链接:https://www.jianshu.com/p/5092d6d5caa3
elf文件的GOT和PLT相关推荐
- ELF文件中的各个节区
版权声明:本文为CSDN博主「ashimida@」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明. 原文链接:https://blog.csdn.net/lidan1 ...
- elf文件中的.plt .rel.dyn .rel.plt .got .got.plt的关系
.plt的作用是一个跳板,保存了某个符号在重定位表中的偏移量(用来第一次查找某个符号)和对应的.got.plt的对应的地址 .rel.dyn重定向表,在程序启动时就需要重定位完成. .rel.plt保 ...
- ELF文件的加载和动态链接过程
本文的目的:大家对于Hello World程序应该非常熟悉,随便使用哪一种语言,即使还不熟悉的语言,写出一个Hello World程序应该毫不费力,但是如果让大家详细的说明这个程序加载和链接的过程,以 ...
- 【Android 逆向】使用 Python 解析 ELF 文件 ( Capstone 反汇编 ELF 文件中的机器码数据 | 完整代码示例 ) ★★★
文章目录 一.完整代码示例 二.执行结果 三.博客资源 一.完整代码示例 使用 Python 解析 ELF 文件完整代码示例 : # coding=utf-8 # 解析 elf 文件需要导入的依赖库 ...
- ELF文件装载链接过程及hook原理
ELF文件格式解析 可执行和可链接格式(Executable and Linkable Format,缩写为ELF),常被称为ELF格式,在计算机科学中,是一种用于执行档.目的档.共享库和核心转储的标 ...
- Linux下的ELF文件、链接、加载与库(含大量图文解析及例程)
Linux下的ELF文件.链接.加载与库 链接是将将各种代码和数据片段收集并组合为一个单一文件的过程,这个文件可以被加载到内存并执行.链接可以执行与编译时,也就是在源代码被翻译成机器代码时:也可以执行 ...
- elf文件格式_Android so(ELF) 文件解析
Android so(ELF) 文件解析 Android so(ELF) 文件解析 前言 生成 so 文件 相关工具 objdump readelf 整体结构图 头部结构 段表结构 字符串表结构 程序 ...
- android游戏基址,Android上可执行ELF文件中的段不能有基址
Android上可执行ELF文件中的段不能有基址 @(Android研究)[android] [TOC] 场景 我使用Android NDK的编译工具交叉编译qemu项目(编译可在Android上运行 ...
- SGX初始化中ELF文件解析
先记 ElfParser::run_parser()函数是SGX初始化<再回顾sgx_create_enclave>慢慢长征路的中间一环.比较独立又有些复杂,单独抽出来讲. ELF文件布局 ...
- elf文件从原理到实现个人总结
总感觉自己什么也没有做,时间就过去了.还是自己慢慢得积累吧. --杰 ELF的前世今生 前言 ELF的结构 设计一个最小的ELF文件 ELF文件的逆向 注明* 前言 什么是elf文件,或许在校园,你听 ...
最新文章
- oracle goldengate技术架构-简单试验(全)
- storyboard或者Xib给View设置边框属性(颜色,宽度,圆角)
- andrew ng machine learning week4 神经网络
- 分布式缓存——一致性哈希算法
- JMS--Queue实战
- 全网最细之static关键字讲解
- Win11控制面板里面怎么找到系统安全?
- python语句块规范_Python基础语法——代码规范判断语句循环语句
- html5复习分类,HTML5考试复习资料.doc
- 《八佰》正式上映不到两天 累计票房破6亿元
- Java查找一个字符串中所有匹配某正则的子串
- SQLSERVER日期时间汇总
- 【Unity】12.3 Off Mesh Link组件
- pp助手苹果版_曾联合盘古团队开发越狱工具的PP助手将在月底关停iOS相关业务...
- 3dmax 使用babylon导出gltf模型异常问题
- 在线培训-虚拟演播室嵌入网页直播
- 防汛可视化:雨季来临,如何做好防汛措施?
- stm32c8t6+dht11+MQ系列环境检测模块+oled显示屏(基于物联网的家庭环境检测系统设计)
- 子集和问题 算法_LeetCode 题解 | 78.子集
- 计算机二级网上哪里学,计算机二级学习网址
热门文章
- EasyTouch5虚拟摇杆(Joystick)中文解析
- python误差修正模型_在Python中实现Johansen Test for Cointegration
- Hdfview安装教程ubuntu
- Matlab图像分割---使用主动轮廓 (snake) 方法进行图像分割
- 小白能读懂的 《手把手教你学DSP(TMS320X281X)》第六章 时钟和系统控制
- java企业员工考勤系统ssm框架
- wav音频文件格式解析【个人笔记】(自用)
- 使用 Hibernate 二级缓存的步骤
- 计算机一级考试广告,2013年计算机一级考试MsOffice备考题及答案(21)
- 需求分析解决方案文案,展示图文结合的文案的视觉感。运用屏幕摄影师Snaglt实现屏幕图像文本捕获与编辑,为技术文案的编写提供素材支持。