PWN题本地更换libc环境攻略

准备工作

下载工具

patchelf

$ git clone https://github.com/NixOS/patchelf

glibc-all-in_one

$ git clone https://github.com/matrix1001/glibc-all-in-one

1.查看题目libc版本

大部分情况下,直接运行libc库即可。

image-20220219181535866

如果不行的话,使用下面这个命令

$ strings libc.so.6 | grep 'Ubuntu GLIBC'

image-20220219181433977


2.下载指定libc

进入下载好的 glibc-all-in-one 文件夹,

image-20220219182903614

输入下面命令:

$ ./update_list             #更新最新版本的glibc
$ cat list #查看可下载的glibc

image-20220219182211011

找到需要的glibc版本,用下面的命令下载到本地

$  ./download 2.31-0ubuntu9.5_amd64

如果在list中没有找到需要的 glibc版本(版本较老)

输入下面的命令打开老版本glibc列表:

$ cat old_list

image-20220219183302198

然后用这个命令下载:

$ ./download_old 2.26-0ubuntu2.1_amd64

这样需要的glibc文件就下载到本地了,在 /glibc-all-in-one/libs

image-20220219183409014

3.利用patchelf修改题目环境

输入下面命令即可, 三个[ ]分别对应 ld文件地址、glibc文件夹、题目文件

patchelf --set-interpreter [~/glibc-all-in-one/libs/2.26-0ubuntu2.1_amd64/ld-2.26.so] --set-rpath [~/glibc-all-in-one/libs/2.26-0ubuntu2.1_amd64] [./gundam]

--set-rpath 后面的地址有时候需要加上 “ / ” 有时候不用,感觉是玄学问题,使用时需要注意一下!!!

原理:

patchelf --set-rpath 的作用是 在ELF文件的 Dynamic section 的中添加一个 RUNPATH 段里面储存着动态链接库的绝对路径,即设置程序的动态链接库

image-20220512161750595

image-20220512164110909

patchelf --set-interpreter 的作用是 在ELF文件的 interp section 设置 interpreter 项的值为 ld加载器绝对路径,即设置程序的动态链接库加载器

image-20220512163826165

image-20220512163704460

如果在 old_list 和 list里都没有找到合适的版本

比如 2.27_1.4版本image-20220512160613840

image-20220512160729505

我们可以选择相近的版本,这里选择 2.27_1.5版本 的。

我们可以将题目给予的libc文件 2.27_1.4版本 放入下载的 2.27_1.5版本 的文件夹里,让它代替文件夹里的libc-2.27.so文件,因为两个版本相差不大所以使用 1.5版本的ld文件 链接时一般不会出现问题,这样1.4版本的libc就能被成功加载