资讯动态

pwndbg 内存 XOR 修改命令深入解析:`xor` 与 `memfrob` 的用法、实现与调试实践

发布时间:2026/9/15 16:12:02 来源:尧图企业网站定制
pwndbg 内存 XOR 修改命令深入解析xor与memfrob的用法、实现与调试实践【免费下载链接】pwndbgExploit Development and Reverse Engineering with GDB LLDB Made Easy项目地址: https://gitcode.com/GitHub_Trending/pw/pwndbgpwndbg 是运行在 GDB 与 LLDB 之上的调试器增强插件内置了大量面向漏洞利用开发与逆向工程的实用命令。其中xor命令可以在目标进程的任意内存地址上以指定密钥对指定数量的字节执行按位异或XOR运算并立即写回内存其孪生命令memfrob则固定使用字符*ASCII 0x2A作为密钥对应 C 标准库中的memfrob(3)语义。本文以 xor.md 为骨架结合仓库内 命令实现 与 单元测试完整讲解这两个命令的语法、参数解析规则、底层执行原理与典型调试场景帮助你直接用一条命令完成内存加密、解密与补丁写入。一、命令概览一条命令完成「读内存 → XOR → 写回」xor与memfrob均属于 pwndbg 的MEMORY内存命令类别在 命令索引 中与search、hexdump、telescope等内存相关命令并列。二者的核心能力都是对目标进程内存进行就地异或修改xor使用用户指定的任意单字节或多字节密钥memfrob固定使用*0x2A作为密钥行为与 GNU C 库中的memfrob(3)一致官方文档描述为 Memfrobs a region of memory (xor with *)见 memfrob.md。由于 XOR 运算具有对称性对同一数据用同一密钥异或两次即可还原这两条命令既能用于「加密」写入也能用于「解密」还原是逆向分析混淆数据、绕过完整性校验、动态补丁时的常用工具。二、命令语法与参数说明根据 xor.md 的自动生成部分xor的完整用法如下usage: xor [-h] address key count位置参数说明address开始进行异或操作的内存地址key用于异或的密钥字符count需要异或的字节数memfrob的语法为usage: memfrob [-h] address count位置参数说明address开始进行异或操作的内存地址count需要异或的字节数两者均支持-h/--help查看帮助。注意memfrob没有key参数密钥被固定为*。2.1 address 参数支持表达式与寄存器引用的sloppy_gdb_parsexor的address参数类型并非简单的整数而是 pwndbg/commands/xor.py 中声明的pwndbg.commands.sloppy_gdb_parse。查看 pwndbg/commands/init.py 中的实现可知该解析器会尝试用pwndbg.aglib.symbol.lookup_symbol解析符号名失败则调用调试器的evaluate_expression求值表达式如$rsp、$rax、var、0x7fff...若求值结果为函数指针则取其address否则转为整数解析失败则回退返回原始字符串。这意味着你可以直接用 GDB 寄存器、符号名或 C 表达式作为address例如xor $rsp 4这与测试 test_command_xor_with_gdb_execute 中的用法完全一致。2.2 key 参数按字符循环异或的多字节密钥key是str类型且支持任意长度的多字节密钥。在xor_memory的实现pwndbg/commands/xor.py中密钥字节通过index % len(key)循环取模因此对于count大于密钥长度的数据密钥会从头开始循环使用等价于经典的重复密钥 XORrepeating-key XOR加密for index, byte in enumerate(mem): key_index index % len(key) mem[index] byte ^ ord(key[key_index])三、底层实现原理read → XOR → write 三步闭环xor命令的完整执行链路在 pwndbg/commands/xor.py 中体现为三步读取内存调用pwndbg.aglib.memory.read(address, count, partialTrue)以partialTrue模式读取指定长度的字节序列返回bytearray。partial参数允许在地址区间跨越不可读页时返回少于count字节的数据见 pwndbg/aglib/memory.py执行异或在xor_memory内对每个字节与密钥字节逐位异或就地修改bytearray写回内存通过pwndbg.aglib.memory.write(address, xorred_memory)将结果写回目标进程。write支持str、bytes、bytearray三种输入内部统一转为bytearray后交给调试器后端见 pwndbg/aglib/memory.py。memfrob则是xor的一个极简封装见 pwndbg/commands/xor.py它直接return xor(address, *, count)把密钥固定为*。此外整个命令注册在CommandCategory.MEMORY类别下并带有OnlyWhenRunning装饰器——意味着只有在程序正在运行时才能执行需要真实进程内存作为操作对象。四、实战用法与典型场景4.1 用密钥修改指定内存对栈顶$rsp处 4 个字节与空格字符 0x20异或。小写字母a0x61与0x20异或后正好变成大写A0x41pwndbg xor $rsp 4这是 test_command_xor_with_gdb_execute 验证过的场景向$rsp写入baaaaaaaa后执行上述命令再读取 8 字节得到bAAAAaaaa——前 4 字节被改写后 4 字节不受影响恰好印证count的精确控制能力。4.2 使用十六进制地址地址同样支持0x前缀的十六进制字面量。测试 test_command_xor_with_hex 展示了直接传hex(before)的用法pwndbg xor 0x7ffffffde000 44.3 使用十进制整数地址对于脚本化场景也可以直接传入十进制整数地址见 test_command_xor_with_int并可在 pwndbg 的 Python 接口中配合pwndbg.aglib.memory.write/read完成读写校验。4.4 memfrob固定密钥快速异或当只需快速翻转数据、不关心密钥强度时使用memfrob更简洁。例如将$rsp处 4 字节与*0x2A异或pwndbg memfrob $rsp 4测试 test_command_memfrob 验证baaaaaaaa0x61与0x2A异或得到 0x4B即大写K因此结果前 4 字节变为bKKKK。4.5 对称性与解密再跑一次即可还原XOR 是对合运算involution同一密钥使用两次即还原原始数据。因此对同一区域再次执行相同命令即可解密这一特性常用于对程序启动时加密、运行时解密的字符串数据进行逆向临时改写校验字节后在关键流程结束后恢复原值分析自定义加壳/混淆代码的原始数据。五、注意事项与边界条件进程必须正在运行命令带有OnlyWhenRunning装饰器pwndbg/commands/xor.py未 attach 到进程时无法执行。跨页读取read使用partialTrue当区间跨越不可读页时仅对可读部分异或并写回需留意部分写回可能产生的副作用。地址表达式求值失败sloppy_gdb_parse解析失败时会回退为原始字符串若该字符串无法被后续处理识别会引发错误此时应使用0x...、整数或调试器可求值的表达式。key 长度与循环多字节密钥按index % len(key)循环密钥长度建议与加密对象保持一致以避免模式泄漏memfrob固定单字节密钥*安全性最弱仅适合快速翻转。错误处理命令捕获pwndbg.dbg_mod.DebuggerError并打印错误信息pwndbg/commands/xor.py不会导致调试会话崩溃。六、相关命令与延伸阅读memfrobxor的固定密钥变体语义对应 C 库memfrob(3)在 pwndbg/lib/functions_data.py 中也以 libc 函数形式被记录hexdump异或前后可用hexdump观察内存变化search定位需要异或的目标数据命令类别索引见 commands/index.md其中 memfrob 条目描述为 Memfrobs a region of memory (xor with *)。掌握xor与memfrob你便可以在 GDB/LLDB 会话内用一条命令完成任意内存区域的加密、解密与动态修补为逆向分析与漏洞利用开发提供即时可用的内存变换能力。【免费下载链接】pwndbgExploit Development and Reverse Engineering with GDB LLDB Made Easy项目地址: https://gitcode.com/GitHub_Trending/pw/pwndbg创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价