关于动态链接和静态链接
打个比方来讲就是我把游戏官方更新公告复制到我的文章,这时候这个复制来的内容属于静态链接,但是我把游戏官网放在这,这时候就属于动态链接了
**,启动
程序设置动态连接的目的是为了让程序运行更快,假如程序全是静态链接,那么这个程序加载就要很久时间,但是是动态连接的话,就可以在需要这个函数的时候再加载它。
#PLT表和GOT表是什么
首先来看一个程序,假如运行到printf函数,它如何在动态链接库里面找到printf函数捏,这时候要用到PLT,链接器这时候会生成一段短的代码来确定printf的位置,所以动态链接每个函数需要俩个东西:
1.存放外部函数地址的数据段
2.有能够对外部函数进行定位的代码
这个存放外部函数的数据段被称为GOT段,存放额外函数的段称为PLT段
运行时有
延迟绑定机制
现在对于gdb调试以及计算机组成原理不太清楚,直接看大佬的图吧(之后补过程)
这个过程大致是xxx@plt->xxx@got->xxx@plt->公共plt->_dl_runtime_resolve
函数_dl_runtime_resolve这里主要作用有执行puts函数和把puts真实地址填入到got表
然后第二次调用
ret2libc思路
当我们遇到libc题就有思路了,我们可以用文件中已经调用过的函数(puts,write等),得到某个函数在got表中真实地址,这时候got表真实地址就是libc里面的地址,我们可以用libcsearcher这个插件或者用libcdata网站找到对应libc版本,得到system地址
(在linux系统下,每个C语言代码转化为可执行文件时系统会自动生成的对应的libc)