Linux中进行glibc源码调试的一种方法

在学习linux pwn时,有时候需要进行glibc的源码调试,本文记录了一种源码调试的配置过程

参考: 自选择glibc带符号版本调试

编译glibc

先在 https://ftp.gnu.org/gnu/glibc/ 下载需要版本的源码

新建两个目录,一个目录放编译后的glibc,一个目录放glibc源码

1
2
3
4
5
6
#存放编译后的glibc
mkdir /home/allforyou/local_glibc/
cd /home/allforyou/local_glibc/
mkdir glibc-2.23
#存放glibc源码
mkdir /home/allforyou/local_glibc_source/

将下载好的源码放进/home/allforyou/local_glibc_source/,然后直接解压,就会解压出glibc-2.23文件夹。

进入glibc源码目录,新建两个目录,用于存放build文件。

1
2
3
4
5
6
7
8
cd /home/allforyou/local_glibc_source
#64位
mkdir build
#32位
mkdir build32
#在编译目录里也新建一个32位的文件夹
cd /home/allforyou/local_glibc
mkdir x32

然后在分别在build和build32目录下,执行configure,--prefix=后面是要安装到的目录

1
2
3
4
5
6
7
8
9
10
#64位:
CFLAGS="-g -g3 -ggdb -gdwarf-4 -Og"
CXXFLAGS="-g -g3 -ggdb -gdwarf-4 -Og"
../configure --prefix=/home/allforyou/local_glibc/glibc-2.23

#32位:
CC="gcc -m32" CXX="g++ -m32" \
CFLAGS="-g -g3 -ggdb -gdwarf-4 -Og -Wno-error" \
CXXFLAGS="-g -g3 -ggdb -gdwarf-4 -Og" \
../configure --prefix=/home/allforyou/local_glibc/glibc-2.23/x32 --host=i686-linux-gnu

可能会提示你有些关键工具丢失或过旧,直接用apt-get install安装就行了。比如我这里有提示:

*** These critical programs are missing or too old: gawk,那么直接sudo apt-get install gawk即可。

最后分别在build和build32下,执行make:

1
2
sudo su
make && make install

创建ld的符号链接

1
2
3
4
5
6
#32位 进入/lib目录,创建指向目标ld.so的符号链接
cd /lib
ln -s /home/allforyou/local_glibc/glibc-2.23/x32/lib/ld-2.23.so ./23-linux.so.2

#64位 进入/lib目录,创建指向目标ld.so的符号链接
ln -s /home/allforyou/local_glibc/glibc-2.23/lib/ld-2.23.so ./23-linux-x86-64.so.2

可以用ls -l看看效果:

替换ELF文件的ld

1
vim ./a.out

直接将elf里的ld信息字符串,改成我刚才生成的符号链接就可以了。

然后就可以进行glibc的源码调试了。

这种替换方法比较灵活,可以编译各种版本的glibc,然后强制修改pwn题里的ld,即可更换libc版本了。需要注意的是,不能改变源文件的大小,例如这里,将原来的符号链接/lib/ld-linux.so.2改为/lib/23-linux.so.2刚好不会改变大小,而且目标版本十分直观。

0%