高版本libc使用调试符号注意事项

众所周知,做 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
上一篇
下一篇