Pwn入门系列5——linux延迟绑定机制
动态链接库
①我们程序开发过程中都会用到系统函数,比如read,write,open等。
②这些系统函数不需要我们实现,因为系统已经帮你完成这些工作,只需要调用即可,存放这些函数的库文件就是动态链接库。
③通常情况下,我们对于pwn题接触到的动态链接库就是libc.so文件。
静态编译与动态编译
①静态编译的思路就是将所有可能运行到的库函数一同编译到可执行文件中。
②动态编译的思路就是遇到需要调用的库函数时再去动态链接库中寻找。
延迟绑定
在程序运行时,got表初始并不保存库函数的地址,只有在第一次调用过后,程序才将这一地址保存在got表中。
PLT和GOT
①GOT(Global Offset Tabal,全局偏移表)
GOT是数据段用于地址无关代码的Linux ELF文件中确定全局变量和外部函数地址的表。ELF中有.got和.plt.got两个GOT表,.got表用于全局变量的引用地址,.got.plt用于保存函数引用的地址。
②PLT(Procedure Linkage Table,程序链接表)
PLT是linux ELF文件中用于延迟绑定的表。
PLT与GOT
①不论是第几次调用外部函数,程序真正调用的其实是Plt表。
②plt表其实是一段段汇编指令构成。
PLT与GOT表
①在第一次调用外部函数时,plt表首先会跳到对应的got表项中。
②由于并没有被调用过,此时got表存储的并不是目标函数的地址,此时的got表中存储的地址是plt表中的一段指令,其作用就是准备一些参数,进行动态解析。
③跳转回plt表后,plt表又会跳转回PLT表头,表头内容就是调用动态解析函数,将目标函数地址存放到got表中。
PLT和GOT表
在之后第二次以上的调用后,程序已经完成了延迟绑定,got表中已经存储了目标函数的地址,直接跳转即可。
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!