资讯动态

pwndbg dumpargs 命令详解:在 GDB/LLDB 中一键解析 call/syscall 指令的函数参数

发布时间:2026/9/15 23:10:48 来源:尧图企业网站定制
pwndbg dumpargs 命令详解在 GDB/LLDB 中一键解析 call/syscall 指令的函数参数【免费下载链接】pwndbgExploit Development and Reverse Engineering with GDB LLDB Made Easy项目地址: https://gitcode.com/GitHub_Trending/pw/pwndbgdumpargs别名args是 pwndbg 提供的一个命令用于在程序停在调用指令call或系统调用指令syscall上时自动解析并打印该调用将传入的参数。本文基于 docs/commands/misc/dumpargs.md 展开结合 命令实现 与 参数解析核心逻辑完整讲解命令用法、底层原理、参数增强显示标志位合并、文件描述符解析、变参函数推断以及它与反汇编输出nearpc的联动帮助你在逆向与漏洞利用调试中快速确认函数签名与参数值。命令概览用法、别名与可选参数dumpargs的命令行接口非常精简完整用法如下usage: dumpargs [-h] [-f]功能描述Prints determined arguments for call/syscall instruction.打印已确定的调用/系统调用指令参数别名args即args与dumpargs完全等价见 注册代码所属分类Misc杂项注册于pwndbg.commands.Command(parser, aliases[args], categoryCommandCategory.MISC)前置条件命令装饰了OnlyWhenRunning即程序必须处于运行/挂起状态才能执行可选参数如下继承自 argparse 生成的帮助文本与原文档一致ShortLongHelp-h--helpshow this help message and exit-f--forceForce displaying of all arguments.其中-f/--force是唯一的行为开关默认情况下dumpargs只在当前 PC 位于call/syscall指令上时才尝试解析参数加上-f后则跳过该判断直接按当前 ABI 把寄存器中可用的参数位全部打印出来。其语义在源码中对应得非常直白def dumpargs(force: bool False) - None: args (not force and call_args()) or all_args()即-f为真时走all_args()路径否则先尝试call_args()若解析不到再回退到all_args()见 pwndbg/commands/dumpargs.py。工作原理如何判定当前正是一条调用指令dumpargs能否工作取决于 pwndbg 是否能把当前指令识别为一条call/syscall。这一判断在 pwndbg/arguments.py 的get()中完成核心分支如下指令必须恰好位于当前 PCinstruction.address pwndbg.aglib.regs.pc否则直接返回空若指令是call-like则取当前架构的函数调用 ABIpwndbg.aglib.arch.function_abi若未定义则放弃解析调用目标地址instruction.target并解析符号名pwndbg.aglib.symbol.resolve_addr(target)解析不出名字就放弃若指令属于中断/系统调用组Capstone 的CS_GRP_INT则走系统调用分支从指令对象取系统调用名instruction.syscall_name例如openat、read见 instruction.py改用系统调用 ABIpwndbg.aglib.arch.syscall_abi确定寄存器传参顺序其余情况既非调用也非系统调用直接返回空此时命令会回退到显示全部寄存器参数路径。关于call_like的判定值得注意的一点是它并不仅仅检查 Capstone 的CS_GRP_CALL分组还涵盖了各种 branch and link跳转并链接类指令因为很多此类指令并不会被 Capstone 标记为call见 instruction.pyproperty def call_like(self) - bool: return ( CS_GRP_CALL in self.groups or self.id in BRANCH_AND_LINK_INSTRUCTIONS[self.cs_insn._cs.arch] )因此无论你停在 x86 的call、ARM 的bl上还是各类系统调用指令上dumpargs都能识别出这是一次带参数的调用。参数从哪来ABI、寄存器与栈的协同确定这是调用指令之后pwndbg 需要回答参数放在哪。答案由 ABIApplication Binary Interface给出。寄存器参数argument(n)是取值核心见 pwndbg/arguments.pydef argument(n: int, abi: pwndbg.lib.abi.ABI | None None) - int: abi abi or pwndbg.aglib.arch.function_abi regs abi.register_arguments if n len(regs): return pwndbg.aglib.regs.read_reg_uncached(regs[n]) n - len(regs) sp pwndbg.aglib.regs.sp (n * pwndbg.aglib.arch.ptrsize) return pwndbg.aglib.memory.read_pointer_width(sp)对于前len(regs)个参数直接按abi.register_arguments定义的寄存器顺序读取例如 x86-64 的rdi, rsi, rdx, rcx, r8, r9ARM64 的x0..x7超出寄存器数量的参数则按寄存器已用完、余下走栈的通用约定从sp n * ptrsize处读取指针宽度的栈值。参数名由argname()生成前几个直接用寄存器名超出部分显示为arg[n]见 pwndbg/arguments.py。参数个数从哪来参数的个数与类型主要来自 pwndbg 内置的函数签名数据库pwndbg.lib.functions.functions见 pwndbg/lib/functions.py。在查库之前源码会对符号名做必要的清洗去掉isoc99_前缀对应__isoc99_sscanf这类 glibc 强符号别名去掉plt后缀PLT 桩名若数据库中不存在精确名则尝试去掉_chk后缀并去掉前导下划线对应__printf_chk→printf这类安全检查版本函数即优先使用XXX_chk的签名没有则退到未检查版本见 pwndbg/arguments.py。若数据库没有该函数pwndbg 会退而求其次默认假设 4 个参数n_args_default 4同时尝试通过调试器的调试符号pwndbg.aglib.symbol.lookup_frame_symbol解析目标函数的类型若其类型是FUNC则直接用符号信息里的真实参数个数覆盖默认值见 pwndbg/arguments.py。macOS/Objective-C 特殊路径在 Darwin 平台上pwndbg 会优先尝试把当前调用解析为 Objective-C 方法调用pwndbg.aglib.objc.try_resolve_call_at_current_pc而不是简单地当作对objc_msgSend的普通调用——后者在语义上几乎不含参数信息见 pwndbg/arguments.py。两种显示模式默认精确解析 vs-f全量展示dumpargs的实际输出行为在 pwndbg/commands/dumpargs.py 中定义call_args()调用pwndbg.arguments.format_args(...)只针对当前指令是一条调用/系统调用这一情形输出解析结果且每条参数前带 8 个空格缩进与反汇编视图保持对齐all_args()遍历 ABI 定义的全部寄存器参数逐条输出名称 值值经pwndbg.chain.format美化即-f强制显示所有参数时的路径若两条路径都拿不到任何参数命令会打印提示信息并说明当前架构的 ABI 可能不通过寄存器传参例如某些参数完全走栈的架构原文为Couldnt resolve call arguments from registers. Detected ABI: {arch} ({ptrbits} bit) either doesnt pass arguments through registers or is not implemented. Maybe they are passed on the stack?参数值的增强显示标志位合并与文件描述符解析dumpargs的另一个亮点是参数值的人类可读增强这部分由 format_args() 完成。标志位参数合并为位或表达式当参数类型带flags定义例如mmap的prot/flags、open的flags时pwndbg 使用format_flags_argument(flags, value)见 pwndbg/lib/functions.py把整数值展开成|连接的符号表达式。这一点在测试用例中得到了精确验证——tests/library/dbg/tests/test_commands_dumpargs.py断言mmap的flags参数输出为flags: 0x32 (MAP_PRIVATE|MAP_ANONYMOUS|MAP_FIXED)即同时给出了原始数值与展开后的语义无需再去查头文件换算。文件描述符自动解析为真实路径对于参数名命中FILE_DESCRIPTOR_ARG_NAMES集合fd、in_fd、oldfd、newfd、epfd、dirfd、mountdirfd等见 pwndbg/arguments.py的整型参数pwndbg 会尝试通过/proc/{pid}/fd/{value}读取符号链接把裸数字补充为括号内的真实文件路径见 pwndbg/arguments.py。这在调试open、read、write、mmap等涉及文件的操作时尤其有用。源码注释也指出了该特性的一个限制如果目标进程运行在 QEMU 用户态模拟下或处于不同的 PID 命名空间 / 无权限读取/proc则无法解析出路径此时会安静地跳过增强。与反汇编视图的联动nearpc-show-argsdumpargs使用的参数格式化逻辑并不只服务于这一个命令——反汇编显示模块nearpc在渲染call指令时会在指令下方顺带打印参数行且是否显示由配置项nearpc-show-args控制show_args pwndbg.config.add_param( nearpc-show-args, True, whether to show call arguments below instruction )见 pwndbg/aglib/nearpc.py在 pwndbg/aglib/nearpc.py 中反汇编渲染对每条调用指令都会调用pwndbg.arguments.format_args(instructioninstruction)并把结果追加到指令行下方# For call instructions, attempt to resolve the target and # determine the number of arguments. if show_args and not linear: result.extend( f{:8}{arg} for arg in pwndbg.arguments.format_args(instructioninstruction) )这意味着在context/nearpc输出中你看到的调用参数行与dumpargs走的是同一套解析与增强逻辑若觉得反汇编里的参数行太占版面可通过set nearpc-show-args off关闭而dumpargs命令本身不受该配置影响随时可以单独调用。实战验证以 mmap 系统调用为例仓库自带的集成测试 tests/library/dbg/tests/test_commands_dumpargs.py 演示了完整的典型用法启动mmap_gaps.native.out测试二进制断在main使用nextcall推进到xmmap(...)调用再step_instruction单步进入随后再次nextcall停在mmap(...)处执行dumpargs期望输出恰好 6 行参数addr: 0xcafe0000 len: 0x1000 prot: 1 flags: 0x32 (MAP_PRIVATE|MAP_ANONYMOUS|MAP_FIXED) fd: 0xffffffff offset: 0这段测试同时覆盖了前文讲到的多个特性参数按 ABI 顺序从寄存器解析addr、len、prot、flags、fd、offset、标志位展开MAP_PRIVATE|MAP_ANONYMOUS|MAP_FIXED、以及文件描述符语义fd字段按名字被识别并尝试解析路径。你可以在自己的调试会话中复现同样的流程停在任意call/syscall指令上输入dumpargs或args即可得到与测试一致的格式化输出。小结dumpargs是 pwndbg 中一条短小但实用的命令它把当前 ABI 如何传参、目标符号的签名是什么、参数值该如何美化三件事封装成一次按键级操作默认模式仅在 PC 位于call/syscall指令上时依据 ABI 函数签名数据库必要时回退到调试符号解析参数-f模式强制按 ABI 把全部寄存器参数打印出来适合参数走寄存器但符号未解析成功的场景增强输出标志位合并为MAP_PRIVATE|...形式、文件描述符补充真实路径、变参函数根据格式化字符串推断参数个数见 pwndbg/arguments.py 对 vararg 的处理与nearpc/context共享同一套格式化管线nearpc-show-args控制反汇编中的自动显示dumpargs则提供随时手动的精确输出。对于逆向分析、CTF 与漏洞利用调试而言停在调用点输入args即可在一行行参数与语义化取值中快速还原函数调用意图是配合nextcall、nearpc等命令使用的高频调试技巧。【免费下载链接】pwndbgExploit Development and Reverse Engineering with GDB LLDB Made Easy项目地址: https://gitcode.com/GitHub_Trending/pw/pwndbg创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

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

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

免费获取报价