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

13 篇文章 1 订阅

在逆向分析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-is-different

就我在使用过程中遇到的情况,简单区分一下这几个节区的区别:

.rel.plt

.rel.plt节里面记录的是重定位表的信息,所有外部过程调用符号的重定位信息会出现在这个节区中。与之类似的节区还有个.rel.dyn节,这里面的每个表项对应了除了外部过程调用的符号以外的所有重定位对象,比如引用外部的全局变量等。.rel.dyn和.rel.plt节中每个重定位项记录了重定位的操作地址(r_offset),重定位类型的信息和符号的符号表索引(r_info),这两个节区实际上就是Elf32_Rel/Elf64_Rel结构体数组。

.plt

.plt节中存放的是需要重定位的外部调用的符号,.plt[0]存放的是更新GOT表中动态链接符号加载地址的操作——将.got.plt[1]中存放的link_map结构体压入栈作为下一步的函数参数,跳转到.got.plt[2]执行动态链接器符号解析函数_dl_runtime_resolve。在延迟绑定场景,.plt[0]的执行会在外部函数第一次调用的时候进行,在该场景中符号的GOT表内容会被初始化为.plt[0]的地址,在执行过plt[0]的操作后会被更新为符号的加载地址

.plt.got

.plt.got节是用于存放 __cxa_finalize 函数对应的 PLT 条目。

.got

.got节是运行时只读的,可以用于存放全局变量的地址,也可以用于存放不需要延迟绑定的函数的地址。

.got.plt

.got.plt是运行时可读写的,在延迟绑定过程中与 .plt 一起使用,如果关闭了延迟绑定则没有该节。
.got.plt[1]存放了link_map结构体的地址,.gotplt[2]存放了_dl_runtime_resolve函数的地址,后面的各项则用于存放函数的加载地址,在使用延迟绑定的时候这些项里会统一初始化为.plt[0]的地址,用于执行_dl_runtime_resolve函数,在执行完成后会被重新初始化为函数的加载地址,在下一次调用的时候就会直接调用了,因此.got.plt必须是运行时可读写的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值