众所周知,做 pwn 题,特别是堆题,没有调试符号是肥肠难受的。glibc-all-in-one 容纳了主流版本的 libc.so 和 ld,包括 .debug 里面的调试符号。最近在 HGAME 上碰到一道 2.39 版本的题目,却发现平时的基操:
patchelf --replace-needed ... ... ./vuln
patchelf --set-interpreter ... ./vuln
失效了!
在网上找办法,发现可以下载人家配好东西的 docker (如果不嫌臃肿),而且这玩意开箱即用还是很方便的(就是下载可能有点慢):RoderickChan-docker_pwn_env
问学长,学长说 “要把.debug/.build-id这个文件夹复制到 /usr/lib/debug下”,但是每次复制一遍会把系统自带的调试符号覆盖掉,强迫症表示不能接受,遂差遣 ai 写下脚本,搞个自动化更改 .build-id:
#!/bin/bash
# 脚本功能说明
echo "使用方法:"
echo " 正常模式:$0 <path> # 从指定路径复制.build-id目录"
echo " 恢复模式:$0 --recover # 从备份恢复.build-id目录"
echo " 备份模式:$0 --backup # 备份.build-id目录"
# 参数有效性检查
if [ $# -ne 1 ]; then
echo "错误:参数数量不正确"
exit 1
fi
# 恢复模式处理
if [ "$1" = "--recover" ]; then
backup_dir="/usr/lib/debug/.build-id_bak"
target_dir="/usr/lib/debug/.build-id"
if [ ! -d "$backup_dir" ]; then
echo "错误:备份目录不存在 $backup_dir"
exit 1
fi
# 如果存在目标目录,先删除
if [ -d "$target_dir" ]; then
echo "正在删除目标目录..."
sudo rm -r "$target_dir"
echo "删除操作完成"
fi
echo "正在从备份恢复..."
sudo cp -r "$backup_dir" "$target_dir"
echo "恢复操作完成"
exit 0
fi
# 备份模式处理
if [ "$1" = "--backup" ]; then
backup_dir="/usr/lib/debug/.build-id_bak"
if [ -d "$backup_dir" ]; then
echo "已经存在备份,无需重复备份"
exit 0
fi
echo "正在备份..."
sudo cp -r "$source_dir" "$backup_dir"
echo "备份操作完成"
exit 0
fi
# 正常模式处理
path="$1"
source_dir="${path}/.debug/.build-id"
target_dir="/usr/lib/debug"
if [ ! -d "$source_dir" ]; then
echo "错误:源目录不存在 $source_dir"
echo "请检查路径是否包含有效的 .debug/.build-id 目录"
exit 1
fi
echo "正在复制.build-id..."
sudo cp -r "$source_dir" "$target_dir"
echo "复制操作完成"
然后给脚本加上执行权限,再软链接到 /usr/local/bin 就可以随时随地畅用了(虽然这个方法还是有点古怪)
# 给脚本添加执行权限
chmod +x build-id-manager.sh
# 创建全局符号链接(pwd表示要写脚本的绝对路径)
sudo ln -s $(pwd)/build-id-manager.sh /usr/local/bin/build-id-manager