返回

Pwntools GDB脚本加载故障的优雅解决方案

见解分享

在 Kali 环境下运行 Pwntools 时,我们经常会遇到 gdb.attach() 在传递 GDB 脚本时出现故障的问题,提示“No such file or directory”错误。尽管脚本文件实际存在,但此错误仍会令人困惑。

原因探索:一个恼人的 Bug

通过进一步调查,我们发现这是一个 Pwntools 中的错误,仅影响 Kali 环境。与 Ubuntu 相比,它在处理 GDB 脚本文件时存在差异。

优雅的解决方案:避免错误

为了解决这个令人头疼的错误,我们提出了一种优雅的解决方案:

步骤 1:复制 GDB 脚本到当前目录

使用 cp 命令将 GDB 脚本文件从其原始位置复制到当前工作目录。这将确保 GDB 可以轻松找到脚本文件,从而消除“No such file or directory”错误。

步骤 2:使用绝对路径

在调用 gdb.attach() 时,指定脚本文件的绝对路径。这将防止 Pwntools 相对路径查找机制中的任何歧义。

代码示例:

import pwntools

# 复制脚本到当前目录
pwntools.cp("/path/to/script.gdb", ".")

# 使用绝对路径传递脚本
pwntools.gdb.attach(proc.pid, gdbscript="/path/to/script.gdb")

替代方法:修改 Pwntools 源代码

如果您愿意对 Pwntools 源代码进行一些小修改,还可以通过以下步骤永久解决此问题:

步骤 1:克隆 Pwntools 仓库

git clone https://github.com/Gallopsled/pwntools.git

步骤 2:编辑 gdb.py 文件

导航到 pwntools/gdb/gdb.py 文件,并找到以下代码块:

def attach(pid, gdbscript=None, wait_for_debugger=None):
    """Attach GDB to a process."""

    # ... 省略其他代码 ...

    if gdbscript and os.path.isfile(gdbscript):
        cmd = 'source %s' % os.path.abspath(gdbscript)
    elif gdbscript:
        raise PwnlibException("'%s' not found, check path" % gdbscript)

步骤 3:添加绝对路径

if gdbscript and os.path.isfile(gdbscript): 条件之后,添加以下代码行:

        gdbscript = os.path.abspath(gdbscript)

这将强制 Pwntools 在传递 GDB 脚本时始终使用绝对路径。

步骤 4:构建和安装 Pwntools

运行以下命令来构建和安装修改后的 Pwntools:

cd pwntools
sudo python3 setup.py install

结语

通过使用绝对路径或修改 Pwntools 源代码,我们可以优雅地解决在 Kali 环境下运行 Pwntools 时 GDB 脚本加载故障的问题。希望本指南能为您提供一个全面的解决方案,让您在使用 Pwntools 时不再为脚本加载问题而苦恼。

附言:如果您希望进一步了解 Pwntools,我们强烈推荐查阅官方文档,网址为 https://pwntools.readthedocs.io/en/latest/