ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

pwndbg `patch` 命令完全指南:在 GDB/LLDB 会话中即时改写指令与字节码

pwndbg `patch` 命令完全指南:在 GDB/LLDB 会话中即时改写指令与字节码 pwndbgpatch命令完全指南在 GDB/LLDB 会话中即时改写指令与字节码【免费下载链接】pwndbgExploit Development and Reverse Engineering with GDB LLDB Made Easy项目地址: https://gitcode.com/GitHub_Trending/pw/pwndbg本指南围绕 pwndbg 的patch命令展开介绍如何在调试会话中直接修改指定地址处的指令或原始字节并配套讲解同源实现的patch-revert回滚补丁与patch-list列出补丁命令。读完本文你将掌握借助 pwndbg 内置的 Zig 汇编器跨架构实时改写代码流、安全回滚以及验证补丁结果的方法可用于绕过校验、模拟修复或快速搭建利用原语。patch命令概览patch是 pwndbg 中归类在Misc杂项类别下的调试命令见 pwndbg/commands/patch.py其作用一句话即可概括把给定地址上的指令或字节改写为指定内容。它直接写入调试目标被调试进程或内核镜像的内存因此补丁立即生效无需重新编译或重启目标。命令的完整用法如下usage: patch [-h] [-q] address ins位置参数参数说明address要打补丁的内存地址The address to patchins要写入的指令可多条即instruction[s]可选参数短选项长选项说明-h--help显示帮助信息并退出-q--quiet不打印任何输出静默模式这些参数声明位于源码顶部的argparse解析器中pwndbg/commands/patch.py其中address被解析为intins为字符串-q/--quiet为布尔开关。基础用法示例将当前指令改写为 NOP 雪橇最常见的场景是在逆向与利用开发中抹掉NOP 掉某条指令。比如希望把当前$pc处的指令及其后 4 条指令全部替换为noppatch $pc nop;nop;nop;nop;nop命令执行后pwndbg 会把$pc起的内存改写为 5 个nop并在非静默模式下打印写入的字节数Patched 5 bytes at 0x555555555234地址会按照当前内存着色主题高亮显示源码中使用pwndbg.color.memory.get(address)着色见 pwndbg/commands/patch.py。按地址精确打补丁除了$pc等寄存器表达式也可以直接给绝对地址。例如改写0x401000处的指令patch 0x401000 mov rax, 0静默模式在脚本或自动化流程中不希望有额外输出时加-qpatch -q $pc jmp $rip0x10多条指令使用引号包裹由于ins是一个字符串参数包含多条指令或特殊字符时建议使用单引号包裹避免 shell 或 GDB 解释歧义patch $pc nop; nop; nop仓库的跨架构测试正是采用这种写法验证 AArch64 下的补丁行为见 tests/library/qemu_user/tests/test_aarch64.py。底层实现从指令文本到内存字节patch命令的核心逻辑非常紧凑可以拆解为四个步骤对应 pwndbg/commands/patch.py汇编指令文本new_mem pwndbg.aglib.asm.asm(ins)把用户给的汇编文本编译成机器码字节读取原始字节old_mem pwndbg.aglib.memory.read(address, len(new_mem))在被覆盖前保存该地址的旧内容为回滚做准备登记补丁patches[address] (old_mem, new_mem)把 (旧字节, 新字节) 存入模块级字典patches写入内存pwndbg.aglib.memory.write(address, new_mem)将机器码写入目标内存随后pwndbg.lib.cache.clear_caches()清空相关缓存确保后续 disasm、context 等输出反映最新内容。汇编器内置 Zig而非系统汇编器值得注意的一点是ins的汇编并不是调用外部as/nasm而是经由 pwndbg/aglib/asm.py 委托给 pwndbg 内置的 Zig 汇编器pwndbg/lib/zig.py。Zig 会将ins文本与目标架构对应的汇编头拼接成临时.S文件交叉编译为 freestanding ELF再通过zig objcopy提取.text段字节返回pwndbg/lib/zig.py。由此带来两个直接结论跨架构能力Zig 作为交叉编译工具链天然支持 pwndbg 所支持的绝大多数架构。从 pwndbg/lib/zig.py 的架构映射表可以看到覆盖了x86_64、i386、arm/armeb、aarch64、mips*、riscv32/64、powerpc*、sparc*、loongarch64、s390x等因此即使调试的是嵌入式或远程目标patch也能按目标架构正确汇编语法风格自动适配对x86_64/x86会自动加上.intel_syntax noprefix强制使用 Intel 语法pwndbg/lib/zig.py对 MIPS 自动加.set noreorder以处理延迟槽pwndbg/lib/zig.py对 ARM 则启用.syntax unifiedpwndbg/lib/zig.py。运行前提patch命令带有pwndbg.commands.OnlyWhenRunning装饰器pwndbg/commands/patch.py即只有在调试会话已经 attach 到目标进程或内核时才可用另外 Zig 工具链缺失时会抛出明确的错误提示见 pwndbg/lib/zig.py。配套命令patch-revert与patch-listpatch-revert与patch-list与patch定义在同一个源码文件中pwndbg/commands/patch.py共享同一个patches字典构成完整的打补丁—查看—回滚闭环。patch-revert回滚指定地址的补丁usage: patch-revert [-h] address位置参数说明address要回滚补丁的地址该命令从patches字典中取出先前保存的旧字节并写回内存实现精确还原。其行为分三种情况pwndbg/commands/patch.pyaddress -1回滚所有已登记的补丁并清空补丁表。这是批量还原的便捷方式address在补丁表中仅回滚该地址的补丁并从表中移除address不在补丁表中打印错误信息Address 0x... not found in patch list。每次回滚同样会调用pwndbg.lib.cache.clear_caches()保证后续输出一致。patch-list列出所有补丁usage: patch-list [-h]无参数遍历patches字典对每个补丁用 Capstone 分别反汇编旧字节与新字节并以from / to形式对比展示pwndbg/commands/patch.py────────────────────────── Patches: ────────────────────────── 0x555555555234 (5 bytes) from: mov eax, 0x1; ret to : nop; nop; nop; nop; nop若当前没有补丁则打印提示No patches to list。这为审计调试会话中改过哪些内存提供了直观依据。补丁记录的生命周期补丁记录保存在 Python 模块级字典patches中pwndbg/commands/patch.py仅在当前 GDB/LLDB 会话内有效退出调试器后记录即丢失。回滚操作的依赖前提是该补丁是本会话通过patch命令写入的——如果内存内容被其他方式如set {char}0x... ...修改patch-revert无法感知。实战场景与验证方法场景一绕过条件跳转/校验在破解或逆向分析中遇到必须满足某条件才放行的分支时可以直接改写跳转指令。例如把0x401234处的jne改为无条件跳转patch 0x401234 jmp 0x401280随后用context disasm或nearpc查看反汇编确认改写结果。场景二NOP 掉指令验证程序行为将某条可能触发崩溃或检查的指令替换为nop观察程序行为变化这是补丁驱动逆向的经典手法patch $pc nop场景三跨架构补丁AArch64 示例仓库的测试用例test_aarch64_cross_arch_patchtests/library/qemu_user/tests/test_aarch64.py演示了完整流程先用context disasm确认_start处的三条指令为mov x0, #0; mov x8, #0x5d; svc #0然后执行patch $pc nop; nop; nop再通过context disasm断言前三条指令已全部变为nop。测试还揭示了一个环境限制qemu-user 8.2.2Ubuntu 24.04 自带版本不支持 GDB 向内存写入因此在旧版 qemu 上该测试标记为 xfail升级 qemu 后即可正常通过。这意味着在真实设备或新版 qemu 上使用该命令没有此限制但若遇到写入无效类问题可先排查调试后端对内存写入的支持。验证补丁结果补丁写入后建议按以下方式验证patch-list查看补丁登记情况与新旧指令对比context disasm或disasm $pc确认反汇编输出中的指令是否已更新补丁命令内部已清除相关缓存单步执行如si观察寄存器与程序流是否符合预期。相关命令与文档索引本文主题文档docs/commands/misc/patch.md回滚命令文档docs/commands/misc/patch-revert.md列表命令文档docs/commands/misc/patch-list.md命令源码三个命令的完整实现pwndbg/commands/patch.py汇编入口与架构适配pwndbg/aglib/asm.py、pwndbg/lib/zig.py跨架构补丁测试tests/library/qemu_user/tests/test_aarch64.py命令分类总览其余 Misc 类命令可参考 docs/commands/misc 目录小结patch是 pwndbg 中运行时改代码的高频利器patch address ins一条命令即可把汇编文本经内置 Zig 汇编器转换为目标架构机器码并写入调试目标-q支持静默、patch-revert -1一键回滚、patch-list审计变更。配合context disasm即时验证它能在不重启目标的前提下快速完成校验绕过、指令替换与利用原语搭建是逆向分析与漏洞利用开发流程中值得常备的工具之一。【免费下载链接】pwndbgExploit Development and Reverse Engineering with GDB LLDB Made Easy项目地址: https://gitcode.com/GitHub_Trending/pw/pwndbg创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表