glibc更换综合方案
by肖哥
此方法只适用于glibc2.31之前的版本
-
前置工具安装 elfutils
sudo aptitude install elfutils
-
获取libc
wget http://launchpadlibrarian.net/497108893/libc6_2.27-3ubuntu1.3_amd64.deb wget http://launchpadlibrarian.net/497108885/libc6-dbg_2.27-3ubuntu1.3_amd64.deb
-
解压
dpkg-deb -x libc6_2.27-3ubuntu1.3_amd64.deb ./libc dpkg-deb -x libc6-dbg_2.27-3ubuntu1.3_amd64.deb ./sym
-
结合libc与libc_debug文件
sudo eu-unstrip libc-2.27.so libc-2.27_sym.so
-
注意这里可能需要给libc和ld加一下执行权限
看雪的另一篇文章
-
这里使用
glibc-all-in-one
来下载,然后可以使用大佬的自动化脚本来完成#chlibs.sh set -x libc_path=$1 elf_path=$2 patchelf_bin_path="/path/to/patchelf" if [ -f ${libc_path}/ld-[2].[0-9][0-9].so ]; then $patchelf_bin_path --set-interpreter $libc_path/ld-[2].[0-9][0-9].so $elf_path fi if [ -f $libc_path/libc-[2].[0-9][0-9].so ]; then $patchelf_bin_path --replace-needed libc.so.6 $libc_path/libc-[2].[0-9][0-9].so $elf_path fi set +x
使用格式:
./chlibs.sh [我的libc所在目录] [目标文件]
-
这里有一个问题,glibc-all-in-one有时候不能下载,那么这时候就通过寻找它下载的路径通过
wget
手动下载,这样后续的方法就参照前一个方案(从获取libc开始)
glibc2.31以上的版本
-
通过
glibc-all-in-one
下载好对应的glibc,此时调试符号被保存为一个debug
文件,要加载调试符号就需要在gdb当中手动加载 -
单次调试可以直接在gdb中更改寻找调试信息的路径
- 查看当前调试信息的路径
show debug-file-directory
- 设置调试信息路径(仅单次有用,下次启动gdb时还是默认的)
set debug-file-directory [directories]
-
还有是直接替换掉gdb的调试信息文件,这样就不用去设置了,且在附加调试时只能用这种方法
# 这里是替换.build-id文件夹(主要参考命令) cd /usr/lib/debug sudo mv .build-id/ .build-id.bak cd ~ sudo mv ~/.build-id/ /usr/lib/debug
更换libc步骤
直接更换
-
替换libc
patchelf --replace-needed libc.so.6 ./libc-2.27.so ./pwn -------------------------原本的libc----要替换的libc-----pwn文件
-
替换ld文件
patchelf --set-interpreter ./ld-2.27.so ./pwn ---------------------------对应的ld文件----pwn文件
exp运行时更换
p = process(['/2.27-3ubuntu1_amd64/ld-2.27.so', './pwn'], env={"LD_PRELOAD":'/2.27-3ubuntu1_amd64/libc.so.6'})