拓冰建站拓冰建站
首页 / 资讯中心 / 正文

pwndbg argv 命令详解:在 GDB 与 LLDB 中查看程序启动参数与环境变量

pwndbg argv 命令详解在 GDB 与 LLDB 中查看程序启动参数与环境变量【免费下载链接】pwndbgExploit Development and Reverse Engineering with GDB LLDB Made Easy项目地址: https://gitcode.com/GitHub_Trending/pw/pwndbgargv是 pwndbg 提供的 Linux/ELF 调试命令之一用于在断点处直接打印被调试程序启动时传入的argv参数向量内容支持按索引单独查看或一次性列出全部参数。本文以 docs/commands/linux_libc_elf/argv.md 为基础结合 pwndbg/commands/argv.py 与 pwndbg/aglib/argv.py 的源码实现讲解命令用法、底层解析机制以及与其配套的argc、envp命令帮助你快速定位程序入口阶段的关键数据。命令总览与帮助信息argv命令的完整帮助信息如下来自 docs/commands/linux_libc_elf/argv.md 的自动生成部分usage: argv [-h] [i]命令描述为Prints out the contents of argv.打印 argv 的内容。位置参数位置参数帮助说明i要打印的参数索引Index of the argument to print out。可选参数短参数长参数帮助说明-h--help显示帮助信息并退出。从命令行解析的实现来看见 pwndbg/commands/argv.pyi的定义为parser.add_argument( i, nargs?, typeint, defaultNone, helpIndex of the argument to print out. )即i是可选的位置参数类型为整数默认值为None。不带参数调用argv会打印全部参数带参数argv 2则只打印第 2 个参数。两种调用方式与输出效果不带参数打印全部 argv不带参数时命令会从argv[0]开始把参数向量完整地以 pwndbgtelescope的格式展示出来。命令实现pwndbg/commands/argv.py如下start int(pwndbg.aglib.argv.argv(0).address) n pwndbg.aglib.argv.argc() 1 pwndbg.commands.telescope.telescope(start, n)即取出argv[0]的地址作为起始地址打印argc 1个指针槽位多出的 1 个是参数向量末尾的NULL结束符。这也是 pwndbg/gdblib/functions.py 中示例输出所展示的效果pwndbg argv 00:0000│ 0x7fffffffe288 —▸ 0x7fffffffe659 ◂— /usr/bin/cat 01:0008│ 0x7fffffffe290 —▸ 0x7fffffffe666 ◂— gdbinit.py 02:0010│ 0x7fffffffe298 ◂— 0可以看到每行对应argv[0]、argv[1]最后一行0是 NULL 结束符与argc 1的打印数量一致。带参数按索引打印单个参数指定索引i时命令先通过pwndbg.aglib.argv.argv(i)取得对应参数的值若不存在则提示 Argv not found否则用telescope打印该参数地址处的 1 个指针pwndbg/commands/argv.pyif i is not None: val pwndbg.aglib.argv.argv(i) if val is None: print(Argv not found) return pwndbg.commands.telescope.telescope(int(val.address), 1) return例如argv 0会单独打印程序路径字符串。底层实现argc/argv 在栈上的解析argv命令的数据来源是 pwndbg/aglib/argv.py它完全基于Linux 进程启动时的初始栈布局来解析不依赖调试符号。启动时刻的栈快照在START事件程序启动触发时模块会记录当时的栈指针pwndbg/aglib/argv.pypwndbg.dbg.event_handler(pwndbg.dbg_mod.EventType.START) def update() - None: if not pwndbg.dbg.selected_inferior().is_linux(): return _stack_ptr int(pwndbg.dbg.selected_frame().regs().by_name(sp)) _was_updated False这里有个重要细节代码注释明确指出当附加attach到已运行进程时_start早已执行完毕因此无法获得_start时的栈指针数据解析可能不准确。这也意味着argv系列命令最适合在从程序最开始如入口断点启动调试的场景下使用。从 SP 开始逐槽解析update_state()pwndbg/aglib/argv.py按照 Linux 初始栈的标准布局解析内存sp处读取argc参数个数随后sp ptrsize_argv_ptr指向argv向量起始位置从该处起逐个指针读取直到遇到 NULL这段区域即argv[0..argc-1]越过 NULL 后_envp_ptr指向环境变量向量envp的起始位置继续逐指针统计环境变量数量_envc_numbers直到读取到 NULL 或访问非法内存此时通过捕获DebuggerError安全退出。对应解析出的argv指针是通过调试器的类型系统构造的char **pwndbg/aglib/argv.pydef argv(number: int) - pwndbg.dbg_mod.Value | None: update_state() if number _argc_numbers: return None ppchar pwndbg.aglib.typeinfo.pchar.pointer() argv pwndbg.dbg.selected_inferior().create_value(_argv_ptr, ppchar) return (argv number).dereference()注意argv(i)的索引越界检查是number _argc_numbers当索引超出范围时返回None命令层据此打印 Argv not found。配套命令argc 与 envpargv并非孤立命令。在同一个源文件 pwndbg/commands/argv.py 中还定义了与之配合使用的argc和envp命令它们共享同一套pwndbg.aglib.argv栈解析逻辑。argc打印参数个数argc命令描述为 Prints out the number of arguments.无参数直接输出argc()的返回值pwndbg/commands/argv.pypwndbg.commands.Command(Prints out the number of arguments., categoryCommandCategory.LINUX) pwndbg.commands.OnlyWhenRunning def argc() - None: print(pwndbg.aglib.argv.argc())对应文档 docs/commands/linux_libc_elf/argc.mdusage: argc [-h]envp打印环境变量envp命令别名env、environ用于打印环境变量内容支持按名称精确查询单个变量pwndbg/commands/argv.py。对应文档 docs/commands/linux_libc_elf/envp.mdusage: envp [-h] [name]位置参数帮助说明name要查看的环境变量名称。实现上environ(name)会在环境变量向量中逐项匹配name 前缀pwndbg/aglib/argv.py找到后返回对应字符串指针匹配不到则返回None命令层提示 Environ not found。不带参数调用envp则打印整个环境变量向量envc 1个指针槽位。在调试器脚本与 GDB 函数中的使用argv/argc还以GDB 便利函数convenience function的形式暴露给调试脚本定义于 pwndbg/gdblib/functions.py$argc()返回参数个数示例输出$1 2$argv(index)返回第n个参数的值gdb.Value例如$argv(0)会得到类似(signed char *) 0x7fffffffe666 /usr/bin/sh的结果pwndbg/gdblib/functions.py。这意味着你可以在gdb命令行、py脚本或条件断点中直接使用这些函数做自动化判断例如根据$argc()是否大于某个值来决定断点行为。相关的环境变量查询便利函数$environ(name)也在同一文件中提供。使用限制与注意事项综合文档与源码使用argv系列命令时有以下几点需要留意依赖 Linux 初始栈布局解析逻辑基于进程启动时栈顶依次排列argc、argv指针数组、NULL、envp指针数组的经典布局pwndbg/aglib/argv.py只对 Linux 用户态进程有效。attach 场景下数据可能不可靠由于栈快照在START事件时采集若调试器附加到一个已经运行的程序_start早已执行SP 快照不再代表初始栈此时argv输出可能不符合预期。索引越界返回空argv(i)在i超过argc时返回None命令层会打印 Argv not found而不是报错中断。命令仅在有进程运行时可用argv、argc、envp均带有pwndbg.commands.OnlyWhenRunning装饰器未加载/未运行程序时命令不会执行。小结argv命令为逆向与漏洞利用调试提供了一条查看程序启动参数的最短路径一条命令即可还原argc、完整参数向量乃至环境变量。其底层实现pwndbg/aglib/argv.py演示了如何基于 Linux 初始栈布局、借助调试器类型系统手工重建char **结构这对理解 pwndbg 如何绕过调试符号做内存结构解析也很有参考价值。配合argc、envp及$argc()、$argv()便利函数你可以在脚本化调试中系统性地分析程序的入口数据。【免费下载链接】pwndbgExploit Development and Reverse Engineering with GDB LLDB Made Easy项目地址: https://gitcode.com/GitHub_Trending/pw/pwndbg创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门