使用patchelf修改程序依赖的libc库
一开始并不了解需要更改程序libc库使之与本机适配,在b00ks那题耽误了非常多时间,这里记录一下修改libc过程中学到的一些东西和过程。
0.首先需要理解好关于动态链接依赖库的认识https://zhuanlan.zhihu.com/p/59590848、《程序员的自我修养》第八章。
1.为什么要修改libc库
这里的libc.so.6是一个软连接,表示该程序依赖于libc.so.2.x.x版本的libc,后面的路径指向本地该版本libc的地址,ld则是链接器的地址,但由于本地使用的libc与靶机libc版本不一样,导致脚本在不同系统上运行时会造成某些地址变化,然后出错,因此需要下载一个与靶机相同的libc版本,使该程序的软链接指向适配靶机的libc版本,这样在本地调试与远程调试时才能有正确的结果。
2、应该修改为什么libc版本
修改为靶机使用的libc版本,或题目给出的libc文件版本。
3、操作
①本题在buuctf上进行,题目原文件并没有给出libc版本,而在buuctf上使用的靶机为ubuntu16,对应使用的libc文件可在网站上下载,查看libc文件的版本号,由于有libc版本还不够,还需要相对应的ld进行动态链接,因此需要通过libc-all-in-one来下载该libc版本对应的ld。
②安装glibc-all-in-one
直接看README就ok,这里主要记录一下这个报错和解决方法
直接update失败,报错说不支持py2,用py3运行一下就ok。
③cat list查看所有版本号
找到相同的版本号,这里的amd64是64位系统用的,i386是32位系统用的,根据系统的位数来选。
下载
在该文件夹中就能找到这个版本的所有文件,将其中的ld复制到题目所在文件夹下。
④安装patchelf 可以直接apt install patchelf
⑤使用patchelf
ldd可以查看程序原本依赖的库地址
更改程序libc与ld版本
1 |
|
新的路径
参考资料: