关于切换libc版本

关于切换libc版本

五月 12, 2021

修改LD_PRELOAD

1
export LD_PRELOAD="./libc.so.6"
1
p =  process(["file_name"],env={"LD_PRELOAD":"./libc.so.6"})

通过修改LD_PRELOAD可以使程序加载指定的libc,一般用于加载题目提供的libc,但这种状况是没有debug symbol的。

glibc-all-in-one+patchelf

调试程序时不需要加载目标libc只需要某特定版本可用这个组合,带有debug symbol。

自动化下载libc:

glibc-all-in-one

下载想要的libc版本后用patchelf修改文件硬编码中的libc和ld路径

安装patchelf:

1
apt install patchelf

使用:

1
2
patchelf --set-interpreter ~/glibc-all-in-one/libs/2.23-0ubuntu11.2_amd64/ld-2.23.so elffile
patchelf --replace-needed libc.so.6 ~/glibc-all-in-one/libs/2.23-0ubuntu11.2_amd64/libc-2.23.so elffile

简化sh脚本:

1
2
3
4
5
6
7
8
9
10
11
12
set -e
set -u
libc_path=$1
elf_path=$2
if [ -f $libc_path/ld-[2].[0-9][0-9].so ]; then
patchelf --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 --replace-needed libc.so.6 $libc_path/libc-[2].[0-9][0-9].so $elf_path
fi
set +e
set +u