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

pwndbg `k` 命令详解:在 GDB 中一键打印调用栈回溯(Backtrace)

pwndbgk命令详解在 GDB 中一键打印调用栈回溯Backtrace【免费下载链接】pwndbgExploit Development and Reverse Engineering with GDB LLDB Made Easy项目地址: https://gitcode.com/GitHub_Trending/pw/pwndbgk是 pwndbg 为习惯 WinDbg 操作风格的逆向/漏洞研究者提供的兼容命令功能与 GDB 原生bt完全等价一条命令即可打印当前线程的调用栈回溯。本文以 docs/commands/windbg/k.md 为骨架结合pwndbg/commands/windbg.py中的真实实现讲解该命令的用法、底层机制、适用边界及其在 pwndbg WinDbg 命令族中的位置读完即可在 GDB 会话中无缝迁移 WinDbg 的k调试习惯。命令概览k命令的手册页由脚本自动生成见 docs/commands/windbg/k.md其核心信息如下usage: k [-h]功能Print a backtrace (alias bt)打印调用栈回溯是 GDBbt命令的别名适用调试器(only in GDB)即该命令仅在 GDB 后端注册LLDB 后端不提供参数无任何位置参数仅有一个可选的帮助参数ShortLongHelp-h--helpshow this help message and exit由于k不接受额外参数需要限制回溯帧数如 WinDbg 中的k 5时应直接改用 GDB 原生bt 5。与 GDB 原生bt的等价关系WinDbg 中k是查看栈回溯的标准命令kb、kp、kn为其变体而 GDB 中对应命令是btbacktrace。pwndbg 的 WinDbg 兼容层用极薄的一层封装完成别名映射源码见 pwndbg/commands/windbg.pypwndbg.commands.Command(Print a backtrace (alias bt)., categoryCommandCategory.WINDBG) pwndbg.commands.OnlyWhenRunning def k() - None: Print a backtrace (alias bt) gdb.execute(bt)关键点命令描述字符串Print a backtrace (alias bt).会被 scripts/_docs/build_command_docs.py 之类的文档生成工具抽取最终渲染为上述自动生成的手册页CommandCategory.WINDBG将k归类到 WinDbg 兼容命令族该枚举定义于 pwndbg/commands/init.py函数体内直接调用gdb.execute(bt)把控制权交给 GDB 的 GDB CLI因此k的输出格式、颜色增强之外的呈现完全等同于原生bt。实际使用示例在 GDB 会话中先启动或附加目标进程使程序处于运行、断点或崩溃状态然后执行pwndbg k #0 0x00007ffff7e2b3f4 in _IO_file_overflow (f0x7ffff7f7f5a0 _IO_2_1_stdout_, ch-1) at ./libio/fileops.c:831 #1 0x00007ffff7e2b620 in __overflow (f0x7ffff7f7f5a0 _IO_2_1_stdout_, ch-1) at ./libio/fileops.c:829 #2 0x0000555555555157 in main (argc1, argv0x7fffffffe4b8) at hello.c:5由于k是bt的直通别名输出中的每一帧都包含帧号、指令地址、函数名或偏移以及对应的源码位置若二进制带符号信息还会显示行号这与 GDB 原生bt完全一致。查看帮助信息pwndbg k --help usage: k [-h] Print a backtrace (alias bt). options: -h, --help show this help message and exit底层实现解析仅在 GDB 注册k的定义被包裹在if pwndbg.dbg.is_gdblib_available():条件块内见 pwndbg/commands/windbg.py因此只有检测到 GDB 后端时该命令才会被注册到命令表。这也解释了为什么文档中标注(only in GDB)pwndbg 同时支持 GDB 与 LLDB 双后端但k作为对 GDB 内建命令的别名只对 GDB 生效。同块内的bl、bd、be、bc、bp、go等 WinDbg 兼容命令也有相同的注册条件。OnlyWhenRunning 守卫pwndbg.commands.OnlyWhenRunning装饰器定义见 pwndbg/commands/init.py会在命令真正执行前检查当前是否存在可调试对象进程或允许的 core 转储场景_pwndbg_only_when_running_allow_core标志控制 core 是否放行相关检查逻辑见 pwndbg/commands/init.py。这意味着在尚未start/run/attach任何目标、且没有 core 文件可分析时执行kpwndbg 会直接拒绝调用bt避免在无上下文的空会话中产生无意义输出。命令注册机制pwndbg.commands.Command装饰器会把k注册进全局命令列表pwndbg.commands.commands并附带CommandCategory.WINDBG分类标记在 GDB 中键入help k或在 pwndbg 内执行pwndbg命令浏览命令列表时都会看到该命令被归入 WinDbg 分组完整的 WinDbg 分组清单见 docs/commands/index.md。在 WinDbg 兼容命令族中的定位k只是 pwndbg WinDbg 兼容层的一员。整个命令族都集中在 pwndbg/commands/windbg.py 中按功能可分成几类与k搭配使用可完整复刻 WinDbg 的日常调试流程类别命令对应 GDB/pwndbg 功能栈回溯kbt打印调用栈继续执行gocontinue的别名见 docs/commands/windbg/go.md单步pcnextcall的别名停在下一个 call 指令断点bl/bd/be/bc/bp列出 / 禁用 / 启用 / 清除 / 设置断点内存读取db/dw/dd/dq/dc/dds/ds/da按字节 / 字 / 双字 / 四字 / hexdump / 指针符号 / 字符串 查看内存内存写入eb/ew/ed/eq/ez/eza按字节 / 字 / 双字 / 四字 / 字符串 写入内存符号ln列出最接近指定地址的符号趣味peb输出 This isnt Windows!提示当前并非 Windows 环境其中dds还注册了kd、dps、dqs三个别名见 pwndbg/commands/windbg.py同样常用于栈上的指针与符号分析。测试与验证仓库中的集成测试对 WinDbg 兼容命令族做了较完整的覆盖tests/library/dbg/tests/test_windbg.py 覆盖了dq/dd/dw/db/dc/ds/dds等内存读取命令与eq/ed/ew/eb等内存写入命令的输入校验、错误地址处理、寄存器表达式如$esp以及端序写入等行为栈回溯本身的正确性由 tests/library/dbg/tests/test_context_commands.py 中的test_context_backtrace_show_proper_symbol_names验证它断言回溯输出能正确解析出A::foo(int, int)、A::call_foo()、main、__libc_start_main等带符号名与偏移的帧信息。由于k直接透传gdb.execute(bt)该测试同样适用于k的预期输出格式。注意事项与最佳实践k不带参数需要限定帧数如只打印前 5 帧时直接使用 GDB 原生bt 5仅在 GDB 生效LLDB 后端不会注册k跨调试器脚本中应改用bt或按调试器类型分支符号信息决定可读性k输出的函数名与行号依赖于可执行文件是否带符号表对 stripped 二进制帧会退化为??与地址偏移此时可结合ln或 pwndbg 的符号解析辅助定位执行前提k在OnlyWhenRunning守卫下仅对运行中的进程或允许分析的 core 转储有效空会话直接执行不会产生回溯输出崩溃现场排查程序崩溃或命中断点后第一时间执行k配合telescope $rsp、dds $rsp等命令查看栈上指针链是复现 WinDbg 下k 栈回溯分析的典型工作流。【免费下载链接】pwndbgExploit Development and Reverse Engineering with GDB LLDB Made Easy项目地址: https://gitcode.com/GitHub_Trending/pw/pwndbg创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
分享:

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

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