starrycan的pwn随笔——ELF文件和延迟绑定机制

news/2024/11/16 21:45:29/文章来源:https://www.cnblogs.com/starrycan/p/18549866

一.ELF文件结构

0x01什么是ELF文件

1.linux环境中,二进制可持性文件的类型是ELF(Executable and LinkableFormat)文件。类似windows下的exe

2.elf文件的格式比较简单,我们需要了解的就是elf文件中的各个节、段等概念

3.程序elf的基本信息存在于elf的头部信息中,这些信息包括指令的运行架构入口等等内容,我们可以通过 readelf -h来查看头部信息

0x02ELF文件组成

1.elf文件中包含许多个节(section)各个节中存放不同的数据,:这些节的信息存放在节头表中,readelf-S 查看,这些节主要包括:

我们可以在ida中对节点进行查看

0x04elf文件的存储

1.elf文件平时是放在磁盘上 运行时放至在内存中

2.elf文件进入内存时结构 映射

elf文件在加载进入内存时:
elf文件的节(section)会被映射进内存中的段(segment),而这一映射过程遵循的机制是根据各个节的权限来进行映射的,
换句话说,可读可写的节被映射入一个段,只读的节被映射入一个段。

二.延迟绑定机制

0x01动态链接库

1.我们再写程序的过程中会用到系统函数,比如read write open 等等函数

2.这些函数是前辈开发人员已经在系统中定义好的,虽然我们在使用中仅仅只是输入了read 或者 open这样一个字符,但是其实际上是对系统已经定义好的函数进行调用,存放这些函数的库文件就是动态链接库 比如我们写c语言时的 main math 等等库

3.我们对于pwn题接触到的动态链接库就是libc.so文件

0x02静态编译与动态编译

1.什么是编译?

编译按照我的理解就是将程序转换成可执行文件的过程,大家常用的编译器就是这个意思,大家在写程序实际会出现一个框框就是我们所说的可执行文件,系统也有自己的大型编译器,只是我们以前没有感知罢了

2.什么是静态编译和动态编译

类似于c语言中运行程序需要写出头文件和main函数一样,系统在进行编译时,也需要调用系统中封装好的函数,根据pwn1笔记中的内容,我们可以知道系统的主函数和调用有关的内容都分配在开辟好的堆栈空间中.

下面我给大家举一个我自己学到例子,来理解什么是静态编译和动态编译

小明要开一个餐馆(program)餐馆的菜单上有几百种菜肴(函数),小明的餐馆每天都会来很多顾客,每个顾客点的菜都可能不一样。我们知道,每道菜所需要的食材(系统函数)都不一样,这些食材都存放于仓库(动态链接库中。

那么现在问题来了,小明如何保证每个顾客点的菜都能被满足呢?

A.第一种方式:小明把仓库中所有的食材都搬进厨房(静态编译)
这时,小明不需要挪地方(静态)只需要在厨房中就可以工作,但是这会带来冗余,可能厨房中的食材很多都用不上。

B.第二种方式:小明每次遇到新的所需要的食材,才去仓库取(动态编译)
这时,小明可能挪动的比较频繁(动态),但是可以保证厨房里面没那么多可能用不到的东西。

3.实践上的静态和动态编译

A.静态编译的思路就是将所有可能运行到的库函数一同编译到可执行文件中

这一方式的优点就在于在程序运行中不需要依赖动态链接库。适用的场合就是比如你本地编译的程序需要的动态链接库版本比较特殊,如果在别的机器上运行可能对方动态链接库版本和你不一样会出bug,这时候用静态编译。

缺点就是编译过后程序体积很大,编译速度也很慢,

B.动态编译的思路就是逢山开路,遇水架桥,直到遇到需要调用库函数的时候再去动态链接库中寻找。

所以其优点一方面是缩小了执行文件本身的体积,另一方面是加快了编译速度,

缺点是哪怕是很简单的程序,只用到了链接库中的一两条命令,也需要附带一个相对庞大的链接库;二是如果其他计算机上没有安装相应的运行库,则用动态编译的可执行文件就不能运动

0x03延迟绑定机制

1.什么是延迟绑定机制

在学习到这里时我产生了一个疑问,在实际的操作系统底层中采用的是静态还是动态编译,以下是chatgpt的回答

在实际的动态编译过程中,由于每一次编译都要调用系统函数,也就是每一次都要重新寻址,这样就太麻烦了也大大的拖延了计算机的编译效率,回到刚才的例子中

我们可以举出这样一个例子:我们再回去看看小明:小明说我选择第二种方式(动态编译)
但是小明餐馆开业后发现搞不赢,每次都要去仓库找,太麻烦了。于是乎,小明想到:每次我遇到新的食材,我就去仓库找,但是每次找完,我就在小本子(got表)上记录这个食材的地址,这样下一次找就快很多了!

实际上在计算机内部我们采用的也是这样一种方式我们称之为got表

2.什么是got表

这就是linux的延迟绑定机制,而存放这个地址的小本子就是got表。got表全称是Global Offset Table,也就是全局偏移量表。
在程序运行时,got表初始并不保存库函数的地址,只有在第一次调用过后程序才将这一地址保存在got表中。

3.GOT与PLT表

GOT(Global Offset Table,?全局偏移表)
GOT 是数据段用于地址无关代码的 Linux ELF 文件中确定全局变量和外部函数地址的表。ELF 中有 .got 和 .plt.got 两个 GOT 表,.got 表用于全局变量的引用地址,.got.plt 用于保存函数引用的地址,
PLT(Procedure Linkage Table,程序链接表),PLT 是 Linux ELF 文件中用于延迟绑定的表

4.两个表之间的关系以及调用流程

1.got和plt的关系就像兄弟一样,其联系非常紧密 作用大致相同 在正式的了解其的关系之前,我从定义中看到got 是全局变量 plt是函数地址 依据c语言的逻辑 写代码都是先写主函数也就是大家写的 main()猜测应该是先调用plt表 在2中我讲详细说明真正的调用流程

2.真正的调用流程如下图

在开始一次调用之前 PLT表会call 以下动态链接的函数

A.在第一次调用外部函数时,!plt表首先会跳到对应的got表项中。由于并没有被调用过,此时的got表存储的不是目标函数地址,此时的got表中存储的地址是plt表中的一段指令,其作用就是准备一些参数,进行动态解析。

B.跳转回plt表

C.跳转回plt表后,plt表又会跳转回plt的表头,表头内容就是调用动态解析函数,将目标函数地址存放入got表中。

在之后第二次以上的调用后程序已经完成了延迟绑定,got表中已经存储了目标函数地址,直接跳转即可

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/834804.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

达梦数据库DM管理工具如何浏览数据,用条件筛选数据

前言 大家好,我是小徐啊。达梦数据库是我们一款常用的国产数据库,我之前一直在使用它。用起来和mysql和postgresql比起来,还是差不多的。而且它自带了数据库连接工具DM管理工具,使我们很方便的连接它。 今天,小徐就来介绍下如何用DM管理工具浏览数据,并且用条件去筛选数据…

标注图片怎么导出VOC格式和COCO格式

图片怎么标注参考 https://www.cnblogs.com/minseo/p/18549804下载 从github下载代码,或压缩包# git clone https://github.com/LabelMe/labelme转换 示例文件在以下路径# labelme-main\examples\instance_segmentation目录以及各个目录的用途如下打过标签的图片和json文件放以…

vscode Markdown文件如何使代码超出屏幕可视区域不换行

在编写Markdown文件的表格时,单元格内过长的内容会使得行超出可视区域,Markdown处理方式为单行用多行表示,如下图所示:这样会破坏表格的可读性,利用快捷键Alt+Z,可变为如下形式:使得表格每列对齐以增加可读性

20222325 2024-2025-1 《网络与系统攻防技术》实验六实验报告

1.实验内容 本实践目标是掌握metasploit的用法。 指导书参考Rapid7官网的指导教程。 https://docs.rapid7.com/metasploit/metasploitable-2-exploitability-guide/ 下载官方靶机Metasploitable2,完成下面实验内容。 (1)前期渗透 ①主机发现(可用Aux中的arp_sweep,search一…

[Linux]gdb基本使用

gdb基本使用 前提 gcc/g++编译出的程序默认是realease版本,要使用gdb调试,首先要在编译的时候加上-g选项。使用readelf -S [程序名]查看可执行文件的节区信息。使用gdb [程序名]:开始调试。q:退出调试。list/l [行号]:从给定的位置显示程序的源代码,每次十行。break/b [行…

美团商家联系电话采集软件团购外卖信息批量提取器

定义目标:明确需要采集的数据,如商家名称、地址、评分、销量等。 分析页面结构:通过浏览器的开发者工具,分析美团团购或外卖页面的HTML结构,找出包含所需数据的标签。 模拟用户请求:使用requests库模拟用户访问美团页面,可能需要处理登录、反爬虫机制(如Cookies、Heade…

# 团队作业4——项目冲刺-6

团队作业4——项目冲刺-6信息项 内容课程名称 广工计院计科34班软工作业要求位置 作业要求作业目标 在七天敏捷冲刺中,完成工大严选开发,记录每日进展和问题,更新燃尽图、签入代码,并发布集合日志总结成果GitHub链接 GitHub一、团队简介队名:小飞棍队团队成员:姓名 学号罗…

20222427 2024-2025-1 《网络与系统攻防技术》实验五实验报告

1.实验内容 1.1 本周内容总结使用了Metasploit框架,其是一个功能强大的渗透测试框架。在使用的过程当中,Metasploit 提供了种类繁多的攻击模块,涵盖了远程代码执行、服务拒绝、提权等多种攻击方式,支持对多种操作系统和应用程序进行测试。除了漏洞利用,它还具备强大的后渗…

20222306 2024-2025-1《网络与系统攻防技术》实验六实验报告

1.实验内容 1.1内容回顾总结 这周都重点在于Metasploit工具的使用,我深入了解了对其功能和使用流程。Metasploit 是一个功能强大的渗透测试框架,广泛应用于网络安全领域。它为安全专家、渗透测试人员和红队提供了一个全面的工具集,支持漏洞利用、攻击模拟和安全评估。Metaspl…

关于HDFS路径文件夹名称的问题

问题发现 ​ 最开始的需求:修改/origin_data/gmall/db目录下所有以inc结尾的文件夹里的文件夹(名称为2024-11-15)修改为2020-6-14 问gpt写了个脚本: #!/bin/bash# 遍历 /origin_data/gmall/db 下所有以 "inc" 结尾的文件夹 for dir in $(hdfs dfs -ls /origin_da…

2024数据采集与融合技术实践-作业4

作业①: 1)使用Selenium框架+ MySQL数据库存储技术路线爬取“沪深A股”、“上证A股”、“深证A股”3个板块的股票数据信息。 1.核心代码描述 from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDri…

第七章课后习题

习题7.1点击查看代码 import numpy as np from scipy.interpolate import interp1d from scipy.integrate import quad import matplotlib.pyplot as pltg = lambda x: (3 * x ** 2 + 4 * x + 6) * np.sin(x) / (x ** 2 + 8 * x + 6) x0 = np.linspace(0, 10, 1000) y0 = g(x0)…