之前符号都很正常 知道开始做IO_FILE题目,更换glibc版本后一直找不到_IO_FILE的符号
一开始以为是glibc_all_in_one没有下载debug的glibc 然后看了一下download的输出是有的
放在了.debug目录 查了好久都说pwndbg会自己加载 然后看了pwndbg说glibc没有符号
终于找到了解决方案 看到了这位师傅的文章https://www.cnblogs.com/9man/p/17741818.html
脚本获取,配置
执行vim ~/.pwndbg/gdbinit.py
然后复制下方代码到最底下,然后输入:wq回车,保存退出。
我改了一下添加的脚本
import gdb
import os
from pathlib import Path
# ANSI颜色转义码
COLOR_GREEN = "\033[32m" # 绿色
COLOR_RED = "\033[31m" # 红色
COLOR_RESET = "\033[0m" # 重置颜色
# 递归加载符号文件的函数
def load_symbols_recursive(folder_path):
# 获取文件夹下的所有内容,包括子文件夹
items = os.listdir(folder_path)
for item in items:
item_path = os.path.join(folder_path, item)
if os.path.isfile(item_path):
try:
gdb.execute("add-symbol-file {}".format(item_path))
print(COLOR_GREEN + "[+] Loaded symbols " + COLOR_RESET + "from {}".format(item_path))
except gdb.error as e:
print(COLOR_RED + "[-] Failed to load" + COLOR_RESET + " symbols from {}: {}".format(item_path, e))
elif os.path.isdir(item_path):
load_symbols_recursive(item_path) # 递归处理子文件夹
# 创建一个自定义的GDB命令,用于加载libc路径对应的.debug符号
class LoadLibcDebugSymbols(gdb.Command):
def __init__(self):
super(LoadLibcDebugSymbols, self).__init__("loadlibc", gdb.COMMAND_USER)
def invoke(self, arg, from_tty):
# 解析参数为libc路径
libc_path = arg.strip()
if not libc_path:
print("Usage: loadlibc <libc_path>")
print("Example: loadlibc /home/rick/glibc-all-in-one/libs/2.35-0ubuntu3_amd64/libc.so.6")
return
# 检查文件是否存在
if not os.path.exists(libc_path) or not os.path.isfile(libc_path):
print(COLOR_RED + "[-] Libc file does not exist: {}".format(libc_path) + COLOR_RESET)
return
# 获取.debug文件夹路径
libc_dir = os.path.dirname(libc_path)
debug_dir = os.path.join(libc_dir, ".debug")
# 检查.debug文件夹是否存在
if not os.path.exists(debug_dir) or not os.path.isdir(debug_dir):
print(COLOR_RED + "[-] .debug folder does not exist in: {}".format(libc_dir) + COLOR_RESET)
return
# 先加载libc本身的符号
try:
gdb.execute("sharedlibrary libc.so.6")
print(COLOR_GREEN + "[+] Loaded libc.so.6 symbols" + COLOR_RESET)
except gdb.error as e:
print(COLOR_RED + "[-] Failed to load libc.so.6 symbols: {}".format(e) + COLOR_RESET)
# 然后加载.debug文件夹中的符号
print(COLOR_GREEN + "[*] Loading debug symbols from: {}".format(debug_dir) + COLOR_RESET)
load_symbols_recursive(debug_dir)
LoadLibcDebugSymbols()
用法:loadlibc [libc路径]
会自动查找libc路径下的.debug文件夹并且加载符号