ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

pwndbg asm 命令完全指南:在 GDB/LLDB 中把汇编代码汇编为 shellcode 字节

pwndbg asm 命令完全指南:在 GDB/LLDB 中把汇编代码汇编为 shellcode 字节 pwndbg asm 命令完全指南在 GDB/LLDB 中把汇编代码汇编为 shellcode 字节【免费下载链接】pwndbgExploit Development and Reverse Engineering with GDB LLDB Made Easy项目地址: https://gitcode.com/GitHub_Trending/pw/pwndbgasm是 pwndbg 内置的汇编命令它的职责非常聚焦把一段汇编Assembler code直接汇编成机器码字节并以 hex 或原始字节形式输出。在 Exploit Development 的日常中无论是快速生成 shellcode、验证一段汇编的机器码形态还是为search --asm、stepuntilasm等场景准备原始指令字节asm都是最顺手的那块垫脚石。读完本文你将掌握asm的全部参数语义、基于 pwntools 的底层实现原理以及它与其他 pwndbg 命令的配合用法。命令概览asm命令注册于CommandCategory.MISC分类下帮助信息为 “Assemble shellcode into bytes”把 shellcode 汇编为字节。在 pwndbg 的命令索引 docs/commands/index.md 中它同样被描述为 Assemble shellcode into bytes。完整的命令用法如下usage: asm [-h] [-f {hex,string}] [--arch {powerpc64,aarch64,powerpc,riscv32,riscv64,sparc64,mips64,msp430,alpha,amd64,sparc,thumb,cris,i386,ia64,m68k,mips,s390,none,avr,arm,vax}] [-i INFILE] [shellcode ...]从用法可见asm有两种输入来源命令行直接传汇编代码或通过-i指定输入文件。二者是互斥的且必须提供其一源码中input_group parser.add_mutually_exclusive_group(requiredTrue)保证了这一点。参数详解位置参数Positional ArgumentHelp说明shellcodeAssembler code to assemble (default:[])要汇编的汇编代码可传多个字符串参数命令内部会以空格拼接后再统一汇编可选参数ShortLongHelp补充说明-h--helpshow this help message and exit显示帮助信息-f--formatOutput format (default:hex)输出格式可选hex或string默认hex--archTarget architecture目标架构不指定时使用当前调试目标的架构见下文-i--infileSpecify input file指定包含汇编代码的输入文件与shellcode位置参数互斥架构取值说明--arch的候选值由pwnlib.context.context.architectures.keys()动态生成见 pwndbg/commands/asm.py覆盖了 pwntools 支持的全部架构powerpc64, aarch64, powerpc, riscv32, riscv64, sparc64, mips64, msp430, alpha, amd64, sparc, thumb, cris, i386, ia64, m68k, mips, s390, none, avr, arm, vax涵盖 x86 系amd64、i386、x86别名相关、ARM 系arm、aarch64、thumb、MIPS 系mips、mips64、RISC-Vriscv32、riscv64、PowerPCpowerpc、powerpc64、SPARCsparc、sparc64、Alpha、MSP430、AVR、CRIS、IA64、M68K、S390、VAX 等。也就是说即使当前调试会话的目标架构与目标 shellcode 不一致也可以通过--arch显式指定来交叉汇编。实战用法示例1. 直接汇编并输出 hex最典型的使用方式直接给出汇编语句默认输出 hex 字节串pwndbg asm push rbp; mov rbp, rsp 554889e5多个字符串参数会被拼接成一个整体汇编。例如pwndbg asm mov rax, 59 syscall 48c7c03b0000000f052. 输出原始字节配合-f string输出原始字节不转 hex便于直接落盘或与echo等配合写文件pwndbg asm -f string int3 \xcc在 GDB 交互环境中string格式输出的即汇编后的原始字节序列。3. 指定目标架构交叉汇编当调试会话的当前架构与要汇编的代码架构不一致时用--arch显式指定pwndbg asm --arch thumb mov r0, #1 2001pwndbg asm --arch aarch64 mov x0, #0; ret 000080d2c0035fd64. 从文件读取汇编代码把汇编代码写入文本文件用-i指定。命令会先打印一条提示信息再读取文件内容进行汇编$ cat shellcode.asm xor rax, rax push rax mov rdi, 0x68732f2f6e69622f push rdi mov rsi, rsp mov al, 59 syscall pwndbg asm -i shellcode.asm [!] Going to read from file: shellcode.asm 4831c05048bf2f62696e2f2f73684889e7b03b0f05注意提示信息以 warn 级别黄色[!]标记输出源码实现为message.warn(Going to read from file: infile)见 pwndbg/commands/asm.py。源码级实现原理asm命令的实现非常精简核心逻辑集中在 pwndbg/commands/asm.py 中全部汇编能力都委托给 pwntools 完成if infile: print(message.warn(Going to read from file: infile)) with open(infile) as file: shellcode [file.read()] if arch is None: arch pwnlib.context.context.arch bits_for_arch pwnlib.context.context.architectures.get(arch, {}).get(bits) assembly pwnlib.asm.asm( .join(shellcode), archarch, bitsbits_for_arch) if format hex: print(assembly.hex()) else: print(assembly)关键实现细节可以归纳为以下几点输入归一化位置参数shellcode是nargs*的列表多个参数最终以 .join(shellcode)拼接成一条汇编文本若走-i路径则读取整个文件内容file.read()作为唯一的汇编文本。架构默认值未显式传--arch时取pwnlib.context.context.arch即 pwntools 当前上下文架构。因此如果调试会话已经正确识别目标例如通过set architecture或 pwndbg 的架构检测可以直接省略--arch。位宽推导通过pwnlib.context.context.architectures.get(arch, {}).get(bits)从 pwntools 内置架构表中取出对应的位宽如amd64→ 64、i386→ 32再传给pwnlib.asm.asm从而保证输出的机器码位宽正确。输出格式分支hex模式调用assembly.hex()打印十六进制字符串string模式直接打印原始 bytes。这也是-f两个选项的唯一行为差异。依赖关系命令依赖pwntools即pwnlib项目在 pyproject.toml 中声明依赖为pwntools4.14.1,5。如果你在极简环境中遇到asm命令不可用请先确认该依赖已正确安装。值得区分的是pwndbg 内部还有一个面向 zig 汇编器的pwndbg/aglib/asm.py封装pwndbg.lib.zig.asm用于按当前调试架构汇编并注入 pwntools 的架构头文件它服务于 pwndbg 内部其他功能而本文讨论的命令行asm走的是 pwnlib 路径两者实现与用途不同不要混淆。与其他命令的配合asm生成的机器码字节可以自然地与 pwndbg 的其他能力联动search --asmsearch命令支持--asm参数用于在内存中搜索某条汇编指令对应的机器码见 docs/commands/memory/search.md。你可以先用asm确认目标指令的字节形态再决定搜索的指令写法甚至搜索结果还支持--asmbp直接对命中的指令下断点。stepuntilasmstepuntilasm命令可以单步执行直到命中指定助记符/操作数见 docs/commands/step_next_continue/stepuntilasm.md。理解asm输出不同架构指令的字节表示有助于分析反汇编与单步结果。x/w系列内存命令asm输出的 hex 字节可直接用于ebWindbg 风格写字节等命令写入调试目标内存快速构造内存中的指令片段。cyclic/hexdump在构造 ROP 链、padding 时asm可随时验证一小段指令如pop rdi; ret的字节序列asm pop rdi; ret输出5fc3可直接嵌入 payload。注意事项与边界输入互斥shellcode位置参数与-i互斥且必选其一requiredTrue。不带参数直接执行asm会报参数错误。架构前缀语法汇编文本遵循 pwntools 汇编器语法如 x86 的mov rax, 59、ARM 的mov r0, #1。不同架构的立即数、寄存器写法遵循 pwntools 的汇编规范。多行代码通过命令行传多行汇编不便时优先使用-i文件方式文件内多行代码会被整体读取后交给汇编器。输出均为单行无论汇编内容多长hex输出都是连续的一行十六进制字符串string输出则是原始字节。依赖与可用性asm依赖 pwntools 提供的汇编能力并非基于 GDB/LLDB 的汇编器若 pwntools 未安装或版本低于 4.14命令可能报错。小结asm是 pwndbg 命令集中短小但高频的一个工具一行汇编、一段文件即可得到对应的机器码字节。通过-f切换输出格式、--arch支持跨架构汇编、-i支持文件输入配合search --asm、stepuntilasm等命令它能在 shellcode 构造、指令字节验证、payload 编写等场景中显著提升效率。其实现完全依赖 pwntools 的pwnlib.asm.asm理解这一点有助于在遇到异常输出时快速定位问题根源。【免费下载链接】pwndbgExploit Development and Reverse Engineering with GDB LLDB Made Easy项目地址: https://gitcode.com/GitHub_Trending/pw/pwndbg创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表