使用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
2
3
patchelf --set-interpreter ./ld-2.23.so ./b00ks 
patchelf --replace-needed libc.so.6 ./libc-2.23.so ./b00ks
旧版本 新版本

新的路径

参考资料:

https://blog.csdn.net/huzai9527/article/details/118558784

https://lexsd6.github.io/2021/03/25/%E4%BF%AE%E6%94%B9ELF%E6%96%87%E4%BB%B6libc%E4%B8%BA%E6%8C%87%E5%AE%9A%E7%89%88%E6%9C%AC/


使用patchelf修改程序依赖的libc库
http://example.com/2021/09/27/使用patchelf修改程序依赖的libc库/
作者
Magnesium
发布于
2021年9月27日
许可协议