对lazy_binding(延迟绑定技术)的一些理解


参考引用:

.dynamic是什么https://www.cnblogs.com/gradyblog/p/8963879.html

lazy_bindinghttps://blog.csdn.net/qq_36963214/article/details/108920861

dl_runtime_resolvehttps://blog.csdn.net/jazrynwong/article/details/89851640


前言

本来这个知识点应该很早就应该写了,一直犯懒,不想写东西。最开始在做一些pwn题(主要是栈溢出的)的时候,就接触到这一知识点了,但是那时候一方面太菜,另一方面是暂时用不到(的确当时,会用就行了),就没有深究这一知识点。后来,知识储备稍微足了一点后,也看《深入理解计算机系统》这本书,结合网上看一些资料,以及别的大佬的理解,勉强还是理解了。但也就此放过了(很不应该的),结果后来时间一长,慢慢地又给忘得差不多了。现在重新来一遍吧,也为下一篇ret2dl_resovle。当然主要还是,抄《深入理解计算机系统》上面的内容,加上网上的一些资料和自己的一些理解。

正片

我们先参考《深入理解计算机系统》书上的一些内容

image-20211122211140605.png

image-20211122211140605

这一部分尽量理解吧,不能的话就尽量去看一下原书

image-20211122213330986.png

image-20211122213330986

动态链接信息.dynamic段中往往保存着多个元素,元素的数据结构为

1
2
3
4
5
6
7
1 typedef struct {
2 Elf32_Sword d_tag;
3 union {
4 Elf32_Word d_val;
5 Elf32_Addr d_ptr;
6 }
7 } Elf32_Dyn

每一个元素代表一个函数的相关信息

image-20211122223154739.png

image-20211122223154739

具体的寻址链接过程有点复杂,可以简化理解为:

.dynamic段中是所需重定位函数的的信息(线索)

reloc entries是库文件即libc的地址(里面有我们要找的函数具体地址)

dynamic Linker是中间动作产生者,根据前两者的信息,找到对应函数地址,并写入相应GOT表(这里就是复杂的部分,后面再讲)

image-20211122230834559.png

到目前为止,大概理解lazy_binding已经没什么问题了(当然暂时,不看链接动作的情况下),我看到别的大师傅有画图的

附上:

以上部分用来了解plt表与got表的关系已经足够了


你以为这就完啦,急什么。下面就是将我们的链接器的具体实现

现在开始讲细节,函数实现

算了,等我先学一会儿…..等我,等我啊

2021-11-22

⬆︎TOP