目录

  1. 1. 动态链接
  2. 2. plt和got表

LOADING

第一次加载文章图片可能会花费较长时间

要不挂个梯子试试?(x

加载过慢请开启缓存 浏览器默认开启

Linux动态链接中的PLT和GOT

2023/6/23 Pwn
  |     |   总文章阅读量:

参考文章:
聊聊Linux动态链接中的PLT和GOT(1)——何谓PLT与GOT
聊聊Linux动态链接中的PLT和GOT(2)——延迟重定位
聊聊Linux动态链接中的PLT和GOT(3)——公共GOT表项

动态链接

在 Linux 中,库(library)是预编译的可重用代码的集合,它可以在不同的程序中使用。

有两种类型的库:静态库和动态库。

静态库在程序编译时被静态链接进可执行文件中,而动态库在程序运行时被动态加载到内存中

plt和got表

以下内容来自chen爷的博客

这里举一个简单的例子

某公司开发了一款软件,实现的代码调用了大量的函数,这些函数的每次实现都需要在文件(这个软件)中对应的前置来实现他

这样子就增大了文件的体积

但是如果将实现这些函数的前置在程序运行时载入到内存中呢?

这样每一款软件都无需额外的内存占用,并且用户也能成功运行

所以这里就出现了plt表和got表的概念

image-20230625213241750

当我们需要调用system函数时,他会去自动寻找system的plt表

其plt表中存储了system函数的got表的地址

其就是system在libc(libc同样在谢师傅的视频中有所介绍)中的地址

但是我们在第一次调用system函数的时候,其got表中的地址并不知道system在libc中的哪里

于是第一次调用无果后,system的plt表便会收到消息,去给got表找到system在libc的位置

经过原定好的代码实现,plt表便查找到了libc中system的地址,并将其填充给了got表

接下来plt表再去got表中,他就得知了地址,就可以成功调用system函数

所以我们可以将整个流程用下图来展示

image-20230625213259459

而在之前程序已经调用了system函数进行echo 字符串,所以我们此时再去system的plt表中就能获取到system在libc中的地址

这里你可能会无法理解,但是在初期的学习我们只需要记住,plt表是调用该函数,got表中存的地址是为了获得真实地址