资讯详情

pwndbg 的 eza 命令详解:在指定内存地址写入字符串(WinDbg 兼容)

📅 2026/9/16 16:11:59 | 华诺云谱 👁 阅读
pwndbg 的 eza 命令详解:在指定内存地址写入字符串(WinDbg 兼容)
pwndbg 的 eza 命令详解在指定内存地址写入字符串WinDbg 兼容【免费下载链接】pwndbgExploit Development and Reverse Engineering with GDB LLDB Made Easy项目地址: https://gitcode.com/GitHub_Trending/pw/pwndbgeza是 pwndbg 为 WinDbg 用户提供的内存编辑命令其作用是在指定的内存地址写入一个字符串。本文以 docs/commands/windbg/eza.md 为核心骨架结合 pwndbg/commands/windbg.py 的源码实现完整讲解 eza 的语法、参数、底层写入原理以及与ez、eb/ew/ed/eq、da/ds等兄弟命令的分工与配合。读完本文你将掌握如何在 GDB/LLDB 调试会话中快速向目标进程内存写入字符串例如伪造 shellcode 参数、覆盖缓冲区数据或构造 payload并理解其与 WinDbg 原生语义的对应关系。eza 是什么WinDbg 兼容层中的字符串写入命令pwndbg 在 pwndbg/commands/windbg.py 中实现了一整套 WinDbg 兼容命令供习惯使用 WinDbg 的逆向与漏洞利用工程师在 GDB / LLDB 环境中无缝迁移。这套命令按CommandCategory.WINDBG分类注册涵盖断点操作bp/bl/bd/be/bc、内存读写db/dw/dd/dq/dc/eb/ew/ed/eq/eza、反汇编与步进k/go/pc/ln/peb等。eza属于其中的内存写入edit命令族。与eb/ew/ed/eq以十六进制字节、字、双字、四字为单位写入不同eza专门用于一次性写入一整段字符串对应 WinDbg 中ezaEdit string, ASCII的语义。语法与参数根据 docs/commands/windbg/eza.md 的自动生成文档命令用法为usage: eza [-h] address data其参数定义如下表所示参数类型必填说明address位置参数是要写入的目标内存地址data位置参数是要写入的字符串内容-h/--help可选参数否显示帮助信息并退出两点值得注意与eb等命令不同eb [-h] address [data ...]data使用nargs*可传多个值eza的data是单个必填字符串源码中声明为parser.add_argument(data, typestr, helpThe string to write.)见 pwndbg/commands/windbg.py。address使用pwndbg.commands.HexOrAddressExpr类型解析见 pwndbg/commands/windbg.py。从 pwndbg/commands/init.py 的实现看该解析器优先把参数当作十六进制数处理——例如输入1234会被解释为0x1234而不是十进制 1234若按十六进制解析失败则回退为 GDB 表达式求值因此也可以直接传$rax、buf这类寄存器或符号表达式。实战用法向内存写入字符串以 GDB 调试一个目标程序为例先查看某段可写内存例如.bss段中的全局缓冲区pwndbg db 0x404000 32 0x404000 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 0x404010 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................然后使用eza向该地址写入字符串pwndbg eza 0x404000 /bin/sh再用db或ds验证写入结果pwndbg ds 0x404000 0x404000 /bin/sh也可配合寄存器与符号使用依赖HexOrAddressExpr的表达式回退能力pwndbg eza $rsi cat /flag注意eza带有pwndbg.commands.OnlyWhenRunning装饰器见 pwndbg/commands/windbg.py即只有在调试会话正在运行存在被调试进程时才可用未启动或已退出的程序无法执行写入。源码实现eza → ez → eX 的调用链eza的真正实现非常精简——它在源码中直接复用了ez命令pwndbg.commands.Command(parser, categoryCommandCategory.WINDBG) pwndbg.commands.OnlyWhenRunning def eza(address, data): Write a string at the specified address. return ez(address, data)见 pwndbg/commands/windbg.py而ez调用公共写入函数eX并显式传入hexFalsedef ez(address, data): Write a character at the specified address. return eX(1, address, data, hexFalse)见 pwndbg/commands/windbg.pyeX是 WinDbg 内存写入命令族eb/ew/ed/eq/ez/eza共用的底层实现见 pwndbg/commands/windbg.py其关键逻辑如下空数据防护if not data:时直接打印Cannot write empty data into memory.并返回。十六进制分支hexTrueeb等命令时会对每个值做十六进制格式校验、按宽度size补零并用codecs.decode(string, hex)解码为字节eza走hexFalse分支跳过该校验直接把字符串原样作为待写入字节data string。字节序处理若目标架构为小端pwndbg.aglib.arch.endian little写入前会将字节序反转data data[::-1]。实际写入调用pwndbg.aglib.memory.write(address (i * size), data)完成内存写入size为 1因此eza按字节连续写入字符串的每个字符。错误处理若目标地址不可访问抛出pwndbg.dbg_mod.DebuggerError打印Cannot access memory at address 0x...若此前已成功写入部分数据还会提示(Made N writes to memory; skipping further writes)并停止后续写入。由此可见eza的语义是将整个字符串视为按字节序列写入先写地址address处的第一个字符随后依次写入address1、address2……源码中的注释也印证了这一点——eX开头的说明写道This relies on windbgs default hex encoding being enforced而eza正是通过hexFalse绕过了 hex 编码约束。与 ez、eb/ew/ed/eq、da/ds 的分工在 pwndbg/commands/windbg.py 的编辑命令族中ezEdit Zero-terminated stringusage: ez [-h] address data功能描述与eza完全一致Write a string at the specified address.且实现上也仅是多包了一层eX(1, address, data, hexFalse)。源码中还留有一条开发者注释见 pwndbg/commands/windbg.py# TODO Is eza just ez? If so just alias. I had trouble finding windbg documentation defining ez——即 pwndbg 开发者认为eza与ez功能等价eza在实现上直接调用ez。也就是说在当前版本中eza与ez可以互换使用。eb/ew/ed/eq分别以 1/2/4/8 字节宽度写入十六进制数据usage: eb [-h] address [data ...]适合精确控制单个字节/字/双字/四字的数值而eza一次性写入整段字符串更适合覆盖字符串内容。da/ds与eza方向相反用于读取指定地址处的字符串da [-h] address [max]、ds [-h] address [max]其中ds默认最大读取 256 字节。实践中常用eza写入、用ds/db验证形成写—读闭环。此外完整的 WinDbg 兼容命令清单可在 docs/commands/windbg/ 目录下查阅每个命令均有同名的自动生成文档页生成逻辑见 scripts/_docs/ 与 scripts/generate-docs.sheza的参数表正是由argparse解析结果自动生成的。典型应用场景eza在 Exploit Development 中的典型用途包括构造参数串在ret2libc/ret2syscall利用链中先向可写内存写入/bin/sh再让execve的第一个参数指向该地址。伪造内存数据覆盖全局缓冲区、堆上的字符串字段或在 ROP 链中预置需要被strcpy等函数读取的内容。调试辅助在不重新编译程序的情况下临时修改运行时的字符串常量或配置文件路径快速验证假设。注意事项与限制仅在程序运行时可执行eza受OnlyWhenRunning约束静态分析无 inferior阶段不可用。地址解析语义address默认按十六进制解析1234等价于0x1234若需要十进制或表达式可传入 GDB 表达式如$rdi8。不可写地址会报错对只读段如.text或未映射地址写入时会打印Cannot access memory at address ...且已写入部分不会回滚仅提示跳过后续写入。eza与ez等价当前源码中eza直接委托给ez功能与报错行为一致二者可互换。小结eza是 pwndbg WinDbg 兼容层中按字符串写入内存的入口语法简单eza address data底层通过eX(1, address, data, hexFalse)按字节连续写入并处理好小端字节序与不可访问内存的报错。它和ez等价与eb/ew/ed/eq写十六进制值、da/ds读字符串共同构成了完整的内存编辑工具集是 GDB/LLDB 环境下延续 WinDbg 操作习惯的实用命令之一。【免费下载链接】pwndbgExploit Development and Reverse Engineering with GDB LLDB Made Easy项目地址: https://gitcode.com/GitHub_Trending/pw/pwndbg创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
📝

华诺云谱内容团队

资深建站顾问 · 行业研究员

10年+企业数字化服务经验,专注智能建站、SEO优化与品牌营销,持续输出建站技巧、行业洞察与营销干货,已帮助5000+企业实现数字化增长。

你可能需要的服务

订阅华诺云谱资讯周报

每周一封,精选建站技巧、SEO与营销干货,直达邮箱。已有 8,000+ 企业主订阅,助你少走弯路。