Pwndbg 的ipi命令:在 GDB 中启动交互式 IPython 进行内存与寄存器操作
【免费下载链接】pwndbgExploit Development and Reverse Engineering with GDB & LLDB Made Easy项目地址: https://gitcode.com/GitHub_Trending/pw/pwndbg
ipi是 Pwndbg 提供的一条 Misc 类命令(仅在 GDB 后端下可用),用于在调试会话中直接嵌入一个完整的交互式 IPython 提示符,从而把 Python 生态(jedi 补全、pwn 库等)与 Pwndbg 的内存、寄存器、vmmap 辅助函数打通。读完本文你将掌握ipi的启动方式、依赖要求,以及它在内存读写、字节模式搜索、寄存器读写和虚拟内存查看上的全部内置快捷函数,并能结合源码理解其实现原理与适用边界。
命令概览:用法与参数
ipi命令没有任何位置参数,唯一可选参数是标准的帮助选项:
usage: ipi [-h]| Short | Long | Help |
|---|---|---|
| -h | --help | show this help message and exit |
命令的正式说明为 "Start an interactive IPython prompt."(启动一个交互式 IPython 提示符)。由于文档由 scripts/generate-docs.sh 自动生成,上述 usage 与参数表与 docs/commands/index.md 中对ipi的索引描述("Start an interactive IPython prompt")保持一致。
使用前提:GDB 后端与 IPython 依赖
ipi有两个明确的使用前提,均可在源码中得到印证:
仅限 GDB 后端:文档头部明确标注
(only in GDB)。Pwndbg 同时支持 GDB 与 LLDB 两种调试器后端,而 pwndbg/commands/ipython_interactive.py 中的命令注册直接依赖import gdb,因此该命令只存在于 GDB 环境下。需要安装 IPython:命令实现中首先通过
gdb.execute("pi import IPython")尝试导入 IPython,若导入失败,会打印一条黄色警告并直接返回:
Cannot import IPython. You need to install IPython if you want to use this command. Maybe you can try `pip install ipython` first.也就是说,在 GDB 的 Python 环境中执行pip install ipython是使用ipi的前提;缺少该依赖时命令不会崩溃,而是给出明确提示后优雅退出(见 pwndbg/commands/ipython_interactive.py)。
进入 IPython:执行方式与内部流程
在 GDB 提示符下直接输入ipi即可进入交互式 IPython。从源码看,其内部执行流程分为三步:
保存并切换 Python 交互环境:借助
switch_to_ipython_env()上下文管理器(pwndbg/commands/ipython_interactive.py),临时保存sys.ps1、sys.ps2与sys.excepthook,确保退出 IPython 后 GDB 自身的 REPL 提示符和异常钩子行为不被破坏。通过
gdb.execute嵌入 IPython:命令使用 GDB 的py内建命令执行一段嵌入脚本,核心调用是IPython.embed(colors='neutral', banner1='', confirm_exit=False, simple_prompt=False, user_ns=_user_ns)。其中user_ns由get_ipi_namespace()返回的 Pwndbg 辅助函数与当前全局命名空间合并而来,也就是说在 IPython 里你不仅能使用 Python 内置对象,还能直接访问调试上下文中已有的变量。注入补全与安全设置:嵌入脚本中还执行了
import jedi并设置jedi.Interpreter._allow_descriptor_getattr_default = False,为 IPython 提供基于 Jedi 的补全能力;同时import pwn,将 pwntools 一并带入会话,方便直接进行二进制分析与利用开发。
注意:ipi是一条需要持续交互的命令,因此在 Pwndbg 的命令回归测试中,它被显式列入disallowed_commands集合而跳过自动化执行(见 tests/library/gdb/tests/test_commands.py),原因是 "requires user input"(需要用户输入)。
内置快捷函数:命名空间与速查表
进入ipi后,Pwndbg 会在命名空间中注入一组便捷函数,全部定义在 pwndbg/aglib/ipi_helpers.py 中。它们对应四类常见调试操作:
内存操作
mr(addr, count=0x40):读取内存,返回字节序列(底层为pwndbg.aglib.memory.read)。mw(addr, data):写入内存(底层为pwndbg.aglib.memory.write)。hd(addr, count=0x40):以十六进制转储(hexdump)形式打印指定地址的内存,默认转储 0x40 字节,hd(0x400000, 0x100)可指定更长范围(见 pwndbg/aglib/ipi_helpers.py)。ms(pattern, start=None, end=None, limit=100, show=True):在整个可读地址空间(或start/end限定区间)内搜索字节模式,最多返回limit(默认 100)个结果,返回地址列表;show=False时只返回数据不打印(见 pwndbg/aglib/ipi_helpers.py)。
寄存器操作
regs.<name>:以属性方式读取寄存器值(如regs.rax)。rr(name):按名称读取寄存器(read register)。rw(name, value):按名称写入寄存器(write register)。
虚拟内存
vm(show=True):打印当前进程的虚拟内存映射(等价于vmmap命令的摘要输出),返回页面元组;pages = vm(show=False)可拿到原始数据用于脚本化处理(见 pwndbg/aglib/ipi_helpers.py)。
辅助信息
aliases():打印上述全部快捷函数的速查表(见 pwndbg/aglib/ipi_helpers.py),也可在 IPython 内用help(mr)等查看单个函数的 docstring。
进入ipi时,顶部会打印一段由get_banner()生成的提示(pwndbg/aglib/ipi_helpers.py),内容大致如下:
Shortcuts: read/write regs: `rr(name)`, `rw(name, val)` | memory: `mr(addr, count)`, `wr(addr, count)` hexdump: `hd(addr, count)` | vmmap: `vm()` Use `aliases()` for help如果当前没有正在运行/挂接的调试进程,banner 还会追加一行Note: process is not alive now提示——这也说明ipi并不强制要求进程存活,纯粹基于内存/寄存器的辅助函数在无进程时亦可使用。顺带一提,banner 中内存写入一项显示为wr(addr, count),与aliases()速查表里的mw(addr, data)存在笔误差异,实际生效的函数名以速查表与源码为准(mw)。
典型用法示例
# 1. 读取并转储栈顶附近 64 字节 hd($sp if False else 0x7fffffffe000, 0x40) # 或更简单地: hd(0x7fffffffe000) # 2. 在全部可读内存中搜索 "ELF" 魔数 ms(b"ELF") # 3. 限定区间搜索 NOP 滑板,最多返回 10 个 ms(b"\x90\x90", start=0x400000, end=0x600000, limit=10) # 4. 读写寄存器 rr("rsp") # 读取 rw("rax", 0xdeadbeef) # 写入 # 5. 获取 vmmap 原始数据做脚本处理 pages = vm(show=False)与 Pwndbg 整体架构的关系
从实现归属看,ipi注册在CommandCategory.MISC(Misc 类别)下(pwndbg/commands/ipython_interactive.py),与asm、checksec、cyclic、dt、patch等命令同级。它依赖的辅助层是pwndbg.aglib(架构无关的调试抽象层):mr/mw走 pwndbg/aglib/memory.py 的内存读写,vm走 pwndbg/aglib/vmmap.py 的映射获取,ms走 pwndbg/search.py 的模式搜索——这意味着你在 IPython 里调用的每个快捷函数,本质上都是 Pwndbg 内部 API 的薄封装,结果与对应命令行命令保持一致,适合用来编写一次性分析脚本或快速验证想法。
如果希望获得比 IPython 更深的 GDB Python 交互,可对比参考 docs/commands/developer/reinit-pwndbg.md(重新初始化)与 docs/commands/pwndbg/config.md(配置项)等命令文档;而若想在 LLDB 下获得类似体验,可关注 pwndbg/dbg_mod/lldb/repl/init.py 中 Pwndbg 自研的 LLDB REPL——ipi本身仅面向 GDB。
小结
ipi在 GDB 下无参数启动,依赖pip install ipython;- 进入后可使用的快捷函数:
mr/mw/hd/ms(内存)、rr/rw/regs(寄存器)、vm(vmmap)、aliases(速查); - 命令通过
gdb.execute调用IPython.embed实现进程内嵌入,并在退出时恢复 GDB 自身的 REPL 环境; - 所有快捷函数均可在 pwndbg/aglib/ipi_helpers.py 中查看源码与 docstring,方便按需扩展。
【免费下载链接】pwndbgExploit Development and Reverse Engineering with GDB & LLDB Made Easy项目地址: https://gitcode.com/GitHub_Trending/pw/pwndbg
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考