基本使用
patchelf 修改 elf 文件加载指定版本的libc库
先用 --set-interpreter 这个选项来将旧的 ld.so(加载器) 替换为要加载的 ld.so
patchelf --set-interpreter /opt/libs/2.27-3ubuntu1_amd/ld-2.27.so ./加载的
然后使用 --replace-needed这个选项将旧的 libc库 替换成要加载的 libc库
patchelf --replace-needed libc.so.6 /opt/libs/2.27-3ubuntu1_amd/libc-2.27.so ./patchelf
但是这样挺麻烦的,我们可以通过编写一个shell脚本实现快速使用
脚本调用
将代码保存为sh为后缀名的shell脚本即可。
如果每次通过路径调用脚本也非常麻烦,所以我们可以给脚本路径起一个别名实现快速调用。
如下
利用alias命令给脚本路径起别名,就像自定义了一个patch命令一样
这样我们在使用patch命令(原系统没有这个命令)的时候就是调用脚本的时候
注意:后面应该是你自己脚本存放的路径
接下来演示一下,可以看到 s 文件原来的 libc 路径和 ld 加载器路径
脚本
#!/bin/bash
set -x
libc_path=$1
elf_path=$2
patchelf_bin_path="/usr/local/bin/patchelf"
if [ -z "$libc_path" ] || [ -z "$elf_path" ]; then
echo "Usage: $0 <libc_path> <elf_path>"
exit 1
fi
ld_file=$(ls ${libc_path}/ld-2.*.so 2>/dev/null | head -n 1)
if [ -f "$ld_file" ]; then
$patchelf_bin_path --set-interpreter "$ld_file" "$elf_path"
fi
libc_file=$(ls ${libc_path}/libc-2.*.so 2>/dev/null | head -n 1)
if [ -f "$libc_file" ]; then
$patchelf_bin_path --replace-needed libc.so.6 "$libc_file" "$elf_path"
fi
set +x
后言
这里先给大家道个歉
因为这两天放假回家,导致时间很少,所以这几天会有点水
等后面到家再二开一下