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),仅供参考

相关新闻

锐捷-GZ073 网络系统管理赛项赛题第1套A模块-S9配置

锐捷-GZ073 网络系统管理赛项赛题第1套A模块-S9配置

S9: S9#sh runBuilding configuration... Current configuration: 1614 bytesversio

2026/11/4 14:37:59 阅读更多 →
电气制图CAD与EPLAN:从绘图工具到设计系统的范式跃迁

电气制图CAD与EPLAN:从绘图工具到设计系统的范式跃迁

1. 这不是选择题,而是职业路径的分水岭“电气制图CAD与EPLAN到底学哪个更好?哪个更实用?”——这句话在知乎、CSDN、电工论坛和校招群聊里,每年至少被问37次。我第一次听到它,是在2014年带实习生时,一个刚毕…

2026/10/25 1:51:18 阅读更多 →
Spring Boot + Vue前后端分离的题库与在线考试系统开发实战

Spring Boot + Vue前后端分离的题库与在线考试系统开发实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/25 7:44:09 阅读更多 →

最新新闻

Electron桌面应用开发实战:从环境搭建到打包发布全流程

Electron桌面应用开发实战:从环境搭建到打包发布全流程

做前端这些年,我大部分时间都在跟浏览器标签页打交道,直到第一次把桌面应用跑起来,才发现原来自己一直被限制在地址栏和刷新按钮围起来的框框里。Electron这个词,最开始是在某段时间频繁出现在同事的讨论里,一个用HTML…

2026/11/4 1:35:24 阅读更多 →
滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

简介:亚太天能T109滑盖智能锁产品说明书是一份PDF格式的官方技术文档,主要面向智能锁安装人员、终端用户及售后维护者,帮助快速掌握产品安装、配置与常见故障处理。全包仅1个PDF文件,大小4.37MB,内容结构清晰&#xff…

2026/11/3 10:57:27 阅读更多 →
PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

上个月我在调试一台高速AGV的驱动系统,整车要求空载跑到8m/s,电机转速已经拉到额定点,驱动器的输出电压也顶到了母线电压极限附近。再往上踩速度指令,转速纹丝不动,三相电流反而开始震荡。那会儿我的第一反应就是&…

2026/11/3 11:35:49 阅读更多 →
C++核心知识点:从内存管理到STL的实战指南

C++核心知识点:从内存管理到STL的实战指南

C 这门语言我前前后后折腾了十几年,用它写过嵌入式驱动、做过游戏服务端,也搭过基础组件库。每次看到新人一头扎进"C 核心知识点"这个搜索词,我其实挺感慨的——这门语言的难点从来不是语法多,而是知识点之间的耦合太深…

2026/11/4 6:23:50 阅读更多 →
T109滑盖智能锁怎么装?安装调试与故障排查全攻略

T109滑盖智能锁怎么装?安装调试与故障排查全攻略

简介:亚太天能T109滑盖智能锁产品说明书以PDF格式发布,适合智能锁用户、安装人员与售后维修人员阅读。内容围绕T109系列指纹密码刷卡锁展开,先介绍前面板、后面板、锁体、机械钥匙、电池盒盖等部件名称与功能,再给出完整安装步骤&…

2026/11/3 10:47:27 阅读更多 →
LLM知识降熵:从信息垄断到理解权下放

LLM知识降熵:从信息垄断到理解权下放

你有没有过这种经历:翻开源码注释、论文摘要或者一份专业报告,每个字都认识,连在一起却像天书。想找人聊聊,身边要么没人懂,要么懂的懒得跟你解释。后来我试着把同一段内容丢给一个大语言模型,几秒钟之后&a…

2026/11/3 10:57:33 阅读更多 →

日新闻

周新闻

月新闻