pwngdb解决更换libc后不加载符号/_IO_FILE等结构没有符号的问题

之前符号都很正常 知道开始做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文件夹并且加载符号