5.pwn Linux的延迟绑定机制

动态链接库

我们程序开发过程中都会用到系统函数,比如read,write,open等等

这些系统函数不需要我们实现,因为系统已经帮你完成这些工作,只需要调用即可,存放这些函数的库文件就是动态链接库。

通常情况下,我们对于pwn题接触到的动态链接库就是libc.so文件:

静态编译与动态编译

这里我们举一个例子来类比静态编译与动态编译的概念。

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

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

第一种方式:

小明把仓库中所有的食材都搬进厨房(静态编译)

这时,小明不需要挪地方(静态)只需要在厨房中就可以工作,但是这会带来冗余,可能厨房中的食材很多都用不上。

第二种方式:

小明每次遇到新的所需要的食材,才去仓库取(动态编译)

这时,小明可能挪动的比较频繁(动态),但是可以保证厨房里面没那么多可能用不到的东西。

静态编译

一个程序运行过程中可能会调用许许多多的库函数,这些库函数在一次运行过程中不能保证全部被调用。

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

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

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

动态编译

一个程序运行过程中会调用许许多多的库函数,这些库函数在一次运行过程中不能保证全部被调用。

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

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

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

延迟绑定

我们再回去看看小明:小明说我选择第二种方式(动态编译)

但是小明餐馆开业后发现搞不赢,每次都要去仓库找,太麻烦了

于是乎,小明想到:每次我遇到新的食材,我就去仓库找,但是每次找完,我就在小本子(got表)上记录这个食材的地址,这样下一次找就快很多了!

而存放这个地址的小本子就是got表。

这就是linux的延迟绑定机制,got表全称是Global Offset Table,也就是全局偏移量表。

在程序运行时,got表初始并不保存库函数的地址,只有在第一次调用过后,程序才将这一地址保存在got表中。

PLT与GOT

GOT(Global Offset Table,全局偏移表)

GOT 是数据段用于地址无关代码的 Linux ELF 文件中确定全局变量和外部函数地址的表。ELF 中有 .got 和 .plt.got 两个 GOT 表,.got 表用于全局变量的引用地址,.got.plt 用于保存函数引用的地址。

PLT(Procedure Linkage Table,程序链接表)

PLT 是 Linux ELF 文件中用于延迟绑定的表

不论是第几次调用外部函数,程序真正调用的其实是plt表,

plt表其实是一段段汇编指令构成

在第一次调用外部函数时,plt表首先会跳到对应的got表项中。

由于并没有被调用过,此时的got表存储的不是目标函数地址,此时的got表中存储的地址是plt表中的一段指令,其作用就是准备一些参数,进行动态解析。

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

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

相关推荐
古城小栈8 分钟前
Golang Gin+Gorm :SQL注入 防护
sql·安全·go·gin
云和恩墨17 分钟前
打造数据库安全堡垒:统一自动化监控平台在DBA运维中的价值解析
运维·数据库·安全·自动化·dba
河南互链数安18 分钟前
企业多类型项目验收:渗透测试核心指南
网络·安全·web安全
漏洞文库-Web安全22 分钟前
CTFHub XSS通关:XSS-过滤关键词 - 教程
前端·安全·web安全·okhttp·网络安全·ctf·xss
猫猫的小茶馆31 分钟前
【ARM】eclipse 中创建汇编工程
c语言·汇编·arm开发·stm32·单片机·嵌入式硬件·eclipse
2501_9151063233 分钟前
如何防止资源文件被替换?一套针对 iOS App 的多层资源安全方案
android·安全·ios·小程序·uni-app·iphone·webview
好游科技34 分钟前
开源IM即时通讯软件开发社交系统全解析:安全可控、功能全面的
安全·架构·交友·im即时通讯·社交软件·社交语音视频软件
清水白石00837 分钟前
什么是猴子补丁(Monkey Patch)?生产环境能用吗?——实战导读
python·安全·系统安全
漏洞文库-Web安全41 分钟前
CTFHub 信息泄露通关笔记9:Git泄露 Index - 指南
笔记·git·安全·web安全·elasticsearch·网络安全·ctf
黑客思维者42 分钟前
智能配电系统安全测试体系化设计与实施指南
自动化测试·安全·系统安全·安全测试