pwn中libc版本切换编译

一、手动编译

1.下载对应libc的源码:以2.32为例:glibc-2.32.tar.gz

(1)官网:https://ftp.gnu.org/gnu/glibc/

(2)清华镜像源:https://mirrors.tuna.tsinghua.edu.cn/gnu/glibc/

2.解压,然后新建文件夹来存储编译结果:

1
2
3
4
5
#注释头

tar -xvf glibc-2.32.tar.gz
mkdir glibc-2.32_build
mkdir glibc-2.32_out

3.编译:

1
2
3
4
5
#注释头

cd glibc-2.32_build
../glibc-2.32/configure '--prefix=/home/hacker/glibc/2.32/glibc-2.32_out --disable-werror --enable-debug=yes'
make

这里的–prefix=****需要一个绝对路径,不能时相对路径,对于pwn来说就好了,不用再接着往下安装了。不过这是64位的,32位得如下:

1
2
3
4
5
6
#注释头

cd glibc-2.32_build
CC="gcc -m32" CXX="g++ -m32" \
../glibc-2.32/configure '--prefix=/home/hacker/glibc/2.32/glibc-2.32_out --disable-werror --enable-debug=yes --host=i686-linux-gnu --build=i686-lin ux-gnu'
make

基本是差不多的。

4.找libc.so 和 ld.so文件:

(1)libc.so 在glibc-2.32_build目录下
(2)ld.so 在glibc-2.32_build/elf 目录下

5.使用:

1
2
3
#注释头

p = process(['/home/hacker/glibc/2.32/glibc-2.32_build/elf/ld.so', './pwn'], env={"LD_PRELOAD":"/home/hacker/glibc/2.32/glibc-2.32_build/libc.so.6"})

这样就可以gdb调试的时候带符号表,然后还有源码:

img

▲关于ld.so的连接使用,最好还是用编译配套的,不然容易出错。如果不需要源码,只需要按照的libc和ld,就可以make install。然后在glibc-2.32_out/lib/下就能找到这两个文件了。

二、对应docker下载:

1.搜对应版本libc对应的ubuntu,比如libc-2.27就对应ubuntu18.04,然后pull下来。

2.然后将对应版本的docker源sources.list拷贝进去,然后我这边自己总结了一份安装脚本,一键运行,省去很多麻烦。(记得先备份一下,防止出错)

1
2
3
4
docker cp sources.list [dockerName]:/etc/apt/
docker cp install.sh [dockerName]:/
chmod a+x install.sh
./install.sh

装完之后基本的环境就有了,pwndbg,python,pwntools等等,其他的自己慢慢安装吧。

▲有个pwn_docker也挺好使的:

1
2
3
#注释头

docker pull pwn_docker

里面运行也类似不同版本的libc:

1
2
3
#注释头 
p
p = process(['/glibc/2.24/64/lib/ld-linux-x86-64.so.2', './pwn'], env={"LD_PRELOAD":"/glibc/2.24/64/lib/libc-2.24.so"})

三、工具使用:LibcSearcher

这个算是最常用了,很好用,直接去github上找很多,外面也有很多教程。

四、patchelf:直接修改ELF文件加载的libc

1.安装:

1
2
3
4
5
6
7
8
9
#注释头

sudo apt-get install autoconf automake libtool
git clone https://github.com/NixOS/patchelf.git
./bootstrap.sh
./configure
make
make check
sudo make install

编译环境啥的都要有

2.使用:

https://github.com/NixOS/patchelf

1
2
3
#注释头

patchelf --set-interpreter /home/hacker/glibc/2.23/64/lib/ld-2.23.so --set-rpath /home/hacker/glibc/2.23/64/lib/ ./pwn

这个可以直接gdb调试,不用再用python打开指定环境。

五、gdb指定源码级别调试:

▲有时候用Patchelf切换之后,想调试对应版本的glibc源码

1.gdb打开后直接命令输入指定:

1
2
3
#注释头

dir /home/hacker/glibc-src/glibc-2.23/malloc

2.gdb环境配置输入:

1
2
3
4
#注释头

vim ~/.gdbinit
dir /home/hacker/glibc-src/glibc-2.23/malloc

但是这有个问题,如果需要对应版本则没办法,只会加载到最下面的版本,所以一般patchelf之后,指定dir即可。