pwn加载不同版本libc调试程序

First Post:

Last Update:

获取所有版本的libc和ld文件

github网站:

1
https://github.com/matrix1001/glibc-all-in-one

将项目打包下载,在目标文件夹内先执行

1
python3 ./update_list

会生成list文件,里面包含了可以下载的libc版本。

我在尝试运行一道pwn题,要用到2.34版本的libc,但是运行发现2.34的源现在没了,不过是道栈溢出,更高版本一个也行。

报错:

1
tar (child): zstd:无法 exec: 没有那个文件或目录

疑似是因为没有zstd

1
sudo apt install zstd

成功了,进入下一步。

patchelf

运用patchelf工具,可以修改程序绑定的libc和ld文件。

关于patchelf的安装,可以直接在github上下载,用make工具安装,相关环境如果没有安装可以百度一下安装教程。

1
https://github.com/NixOS/patchelf/releases/tag/0.12

接下来以我的题目为例,题目名为chal

首先用ldd指令查看当前用到的libc和ld:

1
2
3
4
5
$ ldd ./chal
./chal: /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.34' not found (required by ./chal)
linux-vdso.so.1 (0x00007ffd15def000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fe684267000)
/lib64/ld-linux-x86-64.so.2 (0x00007fe684470000)

可以看到libc版本不匹配,需要通过patchelf修改。

1
2
$ patchelf --replace-needed libc.so.6 ./libc.so.6 ./chal
$ patchelf --set-interpreter ./ld-linux-x86-64.so.2 ./chal

上面第一条指令用来修改绑定libc,第二条用来修改ld,指令用法如下:

1
2
patchelf --replace-needed libc.so.6 修改libc的路径 文件路径
patchelf --set-interpreter 修改ld的路径 文件路径

执行后可以成功运行chal文件。