pwndbg memfrob 命令详解:用 ‘*‘ 密钥对内存区域进行 XOR 加解密

pwndbg memfrob 命令详解:用 ‘*‘ 密钥对内存区域进行 XOR 加解密 pwndbg memfrob 命令详解用 * 密钥对内存区域进行 XOR 加解密【免费下载链接】pwndbgExploit Development and Reverse Engineering with GDB LLDB Made Easy项目地址: https://gitcode.com/GitHub_Trending/pw/pwndbg导读memfrob是 pwndbg 提供的一条内存操作命令用于对调试进程中指定地址、指定长度的内存区域执行逐字节 XOR 异或运算密钥固定为字符*即0x2A。它在功能上是 pwndbg 通用xor命令的一个特化快捷方式常用于逆向调试中对运行时数据做快速混淆/去混淆也可用于模拟 libcmemfrob()函数的运行时行为。阅读本文后你将掌握memfrob的完整语法、参数含义、底层实现原理以及在 GDB/LLDB 会话中的实际调用方式。命令概览memfrob属于 pwndbg 的Memory内存命令类别CommandCategory.MEMORY定义见 pwndbg/commands/init.py官方用法如下usage: memfrob [-h] address count该命令接受两个位置参数address与count无任何可选参数除通用的-h/--help外会在原地修改目标进程内存参数类型含义addressint开始进行 XOR 运算的内存起始地址countint参与 XOR 运算的字节数-h,--help-显示帮助信息并退出与 pwndbg 大多数命令一致memfrob被pwndbg.commands.OnlyWhenRunning装饰器修饰只有在调试会话中存在正在运行或 core 文件的目标程序时才可用。从源码看 memfrob 的本质xor 的固定密钥别名打开 pwndbg/commands/xor.py 可以看到memfrob的实现非常简洁——它本质上是通用xor命令在密钥固定为*时的快捷包装parser argparse.ArgumentParser(descriptionMemfrobs a region of memory (xor with *).) parser.add_argument(address, typeint, helpThe address to start xoring at.) parser.add_argument(count, typeint, helpThe number of bytes to xor.) pwndbg.commands.Command(parser, categoryCommandCategory.MEMORY) pwndbg.commands.OnlyWhenRunning def memfrob(address, count): return xor(address, *, count)而xor命令的核心逻辑则由xor_memory辅助函数完成pwndbg/commands/xor.pydef xor_memory(address, key, count): mem pwndbg.aglib.memory.read(address, count, partialTrue) for index, byte in enumerate(mem): key_index index % len(key) mem[index] byte ^ ord(key[key_index]) return mem完整的调用链为memfrob(address, count)→xor(address, *, count)xor调用xor_memory(address, *, count)通过 pwndbg/aglib/memory.py 的pwndbg.aglib.memory.read(address, count, partialTrue)读取目标内存partialTrue表示允许返回不足count字节的读取结果避免越界报错逐字节执行byte ^ 0x2A*的 ASCII 码即0x2A其低 5 位为01010异或运算可翻转每个字节的多个比特位运算完成后由pwndbg.aglib.memory.write(address, xorred_memory)pwndbg/aglib/memory.py将结果写回原地址因此该操作是就地in-place修改。由于是原地写回执行memfrob后目标内存内容会直接改变——这一行为与 GNU libc 中memfrob(void *s, size_t n)标准库函数将n个字节与42即*异或的行为一致命令描述中的 Memfrobs a region of memory 即源于此。参数解析的细节address 支持 GDB 表达式值得注意的一个实现差异是虽然memfrob自身的 argparse 解析器将address声明为typeint但它在函数体内直接转调xor而xor的address参数使用了pwndbg.commands.sloppy_gdb_parsepwndbg/commands/init.py进行解析。该解析器会先尝试将参数当作 GDB 表达式求值例如$sp、$rip、main、0x7fffffff0000 0x10等只有求值失败时才回退为字符串。因此在实际使用中address位置既可以传入十六进制地址也可以传入寄存器名、符号名或任意可求值的 GDB 表达式这大大增强了命令的灵活性。实战使用方式下面以在 GDB 会话中调试某个目标进程为例演示memfrob的典型用法。1. 查看帮助pwndbg memfrob --help usage: memfrob [-h] address count Memfrobs a region of memory (xor with *). positional arguments: address The address to start xoring at. count The number of bytes to xor. options: -h, --help show this help message and exit2. 对栈上 16 字节执行 XOR假设我们要对$sp指向的 16 个字节做异或处理pwndbg x/16bx $sp 0x7fffffffe3c0: 0x01 0x02 0x03 0x04 0x05 0x06 0x07 0x08 0x7fffffffe3c8: 0x09 0x0a 0x0b 0x0c 0x0d 0x0e 0x0f 0x10 pwndbg memfrob $sp 16 pwndbg x/16bx $sp 0x7fffffffe3c0: 0x2b 0x28 0x29 0x2e 0x2f 0x2c 0x2d 0x22 0x7fffffffe3c8: 0x23 0x20 0x21 0x26 0x27 0x24 0x25 0x3a每个字节均与0x2A异或如0x01 ^ 0x2A 0x2B。由于 XOR 是对称运算再次对同一区域执行memfrob即可恢复原始内容——这正是加密/解密一体化的特性pwndbg memfrob $sp 16 pwndbg x/16bx $sp 0x7fffffffe3c0: 0x01 0x02 0x03 0x04 0x05 0x06 0x07 0x08 0x7fffffffe3c8: 0x09 0x0a 0x0b 0x0c 0x0d 0x0e 0x0f 0x103. 结合 hexdump 或 search 命令使用如需更直观地观察异或前后的字节布局可先用 pwndbg 的hexdump命令见 docs/commands/memory/hexdump.md打印内存再执行memfrob随后再次hexdump对比若内存中混有*0x2A字节使用search命令见 docs/commands/memory/search.md在异或前后搜索目标模式可以快速定位被处理的数据区。注意事项与边界命令仅在进程运行期间有效OnlyWhenRunning装饰器pwndbg/commands/init.py 附近保证命令在程序未运行时会拒绝执行避免无意义的求值错误见源码注释中引用的 issue #1462。读取使用partialTrue当address接近不可读页边界时read允许返回部分数据随后对返回部分执行异或并写回从而尽量规避整段不可读导致的失败。地址必须是可写内存最终write操作要求目标页具备写权限如栈、堆、数据段对只读映射如.text段若页为只读执行会触发调试器错误此时xor命令中的except pwndbg.dbg_mod.DebuggerError分支会打印错误信息pwndbg/commands/xor.py。与xor命令的关系如需使用任意密钥如单字节0xFF或多字节AAAA进行异或应直接使用xor address key count命令memfrob仅是密钥固定为*的便捷别名。两者的实现、权限要求与行为特性完全一致。小结memfrob是 pwndbg Memory 命令族中一个轻量而实用的工具语法简单仅需address与count两个参数、行为可预期逐字节与0x2A异或并就地写回、天然可逆再次执行即可还原。其底层复用了 xor 命令 的完整实现链通过sloppy_gdb_parse支持寄存器/符号/表达式形式的地址输入并借助OnlyWhenRunning与partial读取机制保证了在运行环境中的健壮性。无论是在逆向分析中快速还原被混淆的字符串还是模拟memfrob()函数调用这条命令都能在调试会话中一键完成。【免费下载链接】pwndbgExploit Development and Reverse Engineering with GDB LLDB Made Easy项目地址: https://gitcode.com/GitHub_Trending/pw/pwndbg创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考