ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

pwndbg stack 命令完全指南:基于 GDB/LLDB 的栈数据解引用与栈帧可视化

pwndbg stack 命令完全指南:基于 GDB/LLDB 的栈数据解引用与栈帧可视化 pwndbg stack 命令完全指南基于 GDB/LLDB 的栈数据解引用与栈帧可视化【免费下载链接】pwndbgExploit Development and Reverse Engineering with GDB LLDB Made Easy项目地址: https://gitcode.com/GitHub_Trending/pw/pwndbgstack是 pwndbg 提供的栈区查看命令用于以指针链解引用recursive dereference的方式展示从栈指针$sp起始的栈上数据并支持数量、偏移、栈帧范围与反向增长等多种显示模式。本文以 stack 命令文档 为骨架结合 telescope.py 的源码实现与仓库测试用例系统讲解其参数语义、输出格式、底层原理与实战用法帮助读者在 GDB 与 LLDB 环境下高效分析栈布局、定位返回地址与局部变量。stack 命令的功能定位stack命令属于CommandCategory.STACK分类见 telescope.py 中的pwndbg.commands.Command(parser, categoryCommandCategory.STACK)装饰器其官方描述为Dereferences on stack data with specified count and offset.即对栈上数据执行解引用读取指针指向的内容并沿指针链递归展开展示的行数与起始偏移由用户指定。默认行为是打印从栈顶$sp开始的若干元素每个元素宽度为一个指针大小如 64 位架构下为 8 字节并自动识别栈上指针所指向的目标内容同时标注哪些寄存器指向了当前显示的地址——这是 pwndbg 栈分析能力中最常用、最基础的一环。适用场景快速查看当前函数栈顶附近的参数、局部变量与返回地址追踪栈上指针链如结构体指针、保存的寄存器值逆向分析或漏洞利用如 ROP 布局、栈溢出 payload时直观确认栈内存的字节分布配合-f参数界定当前栈帧rsp到rbp的范围聚焦于本帧数据。命令语法与参数详解stack的完整用法如下usage: stack [-h] [-f] [-i] [count] [offset]参数定义与解析逻辑位于 telescope.py语义如下位置参数参数说明默认值count要打印的元素个数每个元素为一个指针宽度8offset相对$sp的元素偏移支持负值0count最小为 1源码中通过max(int(count), 1)保证offset以元素为单位而非字节实际起始地址的计算式为address $sp offset * ptrsize见 telescope.py其中ptrsize由pwndbg.aglib.typeinfo.ptrsize提供即当前架构的指针宽度支持负偏移例如stack 8 -2表示从$sp - 2 * ptrsize开始打印 8 个元素用于查看调用者保存在栈上、位于当前$sp之下的数据。可选参数短选项长选项说明-h--help显示帮助信息并退出-f--frame显示整个栈帧即从rsp到rbp-i--inverse反向显示栈的增长方向-f/--frame忽略count自动计算当前栈帧大小(rbp - rsp) / ptrsize 1并把栈帧尾随的一个指针位返回地址也一并打印由配置telescope-frame-print-retaddr控制默认开启-i/--inverse从高地址向低地址打印栈向低地址增长的反向视角即从address (count - 1) * ptrsize开始递减打印到address - ptrsize。底层实现stack 如何调用 telescopestack本身并非独立实现的打印逻辑而是对 pwndbg 的telescope()指针链解引用函数的封装。核心调用链如下telescope.pypwndbg.commands.Command(parser, categoryCommandCategory.STACK) pwndbg.commands.OnlyWhenRunning def stack(count, offset, frame, inverse) - None: ptrsize pwndbg.aglib.typeinfo.ptrsize telescope( addresspwndbg.aglib.regs.sp offset * ptrsize, countcount, frameframe, inverseinverse, repeatstack.repeat, )要点起始地址计算address regs.sp offset * ptrsize。pwndbg.aglib.regs.sp是架构无关的栈指针抽象在regs_mod.py中通过reg_sets[arch].stack按架构映射为rsp/esp/sp等见 regs_mod.py因此stack在 x86、ARM、RISC-V 等架构上均可工作OnlyWhenRunning装饰器命令仅在程序正在运行时可用需要真实的$sp值repeatstack.repeat当用户在 GDB 中直接回车重复执行上一条命令时telescope()会从上次打印的最后一个地址继续向后打印telescope.last_address ptrsizetelescope.offset 1实现连续翻页式的栈浏览参见telescope()中关于repeat的注释 telescope.py。兄弟命令stackf在 telescope.py 中还定义了stackf命令它等价于stack固定开启--frame模式打印整个当前栈帧pwndbg.commands.Command(parser, categoryCommandCategory.STACK) pwndbg.commands.OnlyWhenRunning def stackf(count, offset) - None: ptrsize pwndbg.aglib.typeinfo.ptrsize telescope( addresspwndbg.aglib.regs.sp offset * ptrsize, countcount, frameTrue, )输出格式与指针链解引用stack的输出继承自telescope()的行格式telescope.py。每一行由以下几部分组成序号:相对偏移│寄存器标注 地址 解引用后的内容序号与偏移左侧以十六进制显示元素序号idx_offset:02x与相对起始地址的字节偏移line_offset:04x分隔符与主题可通过telescope-offset-separator、telescope-offset-delimiter配置自定义寄存器标注若某个通用寄存器或其偏移几个字节处恰好指向该地址会标注寄存器名如rax并额外显示相对帧指针rbp的偏移由telescope-framepointer-offset配置控制指针链展开pwndbg.chain.format()会判断当前元素是否为有效指针若是则递归解引用并沿链打印目标内容如→ 0x... ◂ ...帮助一眼识别栈上保存的返回地址、指针参数等关键数据不可读内存处理若目标地址不可读输出Could not read memory at 0x...并终止打印。重复值折叠当栈上连续多个元素值相同时例如未初始化区域默认会折叠为一行省略标记... ↓ N skipped避免刷屏。相关配置telescope-skip-repeating-val是否跳过重复值默认Truetelescope-skip-repeating-val-min触发折叠的最小重复个数默认3telescope-dont-skip-registers若某行被寄存器指向即使值重复也不折叠默认True。与 context 栈段的联动stack的显示能力同时被 pwndbg 的 context 命令复用在 context.py 中context_stack()会调用telescope(addressregs.sp, to_stringTrue, count... )生成名为stack的 context 段落行数由配置context-stack-lines控制默认8见 context.py。也就是说每次断点停下后 context 自动打印的栈区信息与手工执行stack命令看到的内容同源只是count由context-stack-lines决定。实战示例以下命令均在程序运行中断点处执行假设 64 位环境ptrsize 8# 1. 默认打印从 $sp 开始解引用 8 个元素 stack # 2. 打印 20 个元素 stack 20 # 3. 跳过栈顶两个元素如返回地址与保存的 rbp从 $sp 16 开始打印 stack 8 2 # 4. 查看 $sp 之下的内容负偏移例如观察调用者压栈的参数 stack 8 -2 # 5. 打印整个当前栈帧rsp 到 rbp含末尾返回地址 stack -f # 等价写法stack --frame或直接使用 stackf # 6. 反向从高地址向低地址显示栈增长方向 stack -i 16 # 7. 空回车连续翻页从上次末尾继续向后浏览 stack 8 回车重复执行stack -f的实现细节值得注意telescope.py若当前架构未定义帧指针寄存器会提示 The frame register is not defined for this architecture.若rbp rsp如优化后的无帧指针代码提示 Cannot display stack frame because base pointer is below stack pointer若rsp与rbp不在同一 vmmap 页上提示 Cannot display stack frame because base pointer is not on the same page with stack pointer——这些错误分支均有对应的测试用例覆盖见 test_command_telescope.py。相关配置速查stack的行为受 telescope 系列配置影响可通过config/theme命令查看与修改对应源码位于 telescope.py配置项默认值作用telescope-lines8telescope 系列命令默认打印行数telescope-skip-repeating-valTrue是否折叠连续重复值telescope-skip-repeating-val-min3触发折叠的最小重复个数telescope-pad-leading-zeroesFalse是否以 0 前导补齐到指针宽度telescope-framepointer-offsetTrue是否打印相对帧指针的偏移telescope-frame-print-retaddrTrue-f模式下是否多打印栈帧末尾的返回地址telescope-dont-skip-registersTrue被寄存器指向的重复行是否不折叠telescope-offset-separator│行内偏移分隔符主题telescope-offset-delimiter:序号与偏移之间的分隔符主题telescope-repeating-marker... ↓重复值折叠标记主题修改方式示例set telescope-skip-repeating-val off # 关闭重复值折叠 set telescope-lines 16 # 调整默认行数 set telescope-frame-print-retaddr off # -f 模式不再打印返回地址扩展阅读相关命令文档stackf、telescope、context源码实现telescope.pystack/stackf/telescope 三命令共用一套指针链解引用逻辑栈帧可视化stack-vis 及其实现 stackvis.pystack_vis命令按帧着色展示调用栈内存分布测试用例test_command_telescope.py 覆盖了正序、反向、--frame、重复值折叠、地址作为 count 等行为是理解stack边界行为的最佳参考。【免费下载链接】pwndbgExploit Development and Reverse Engineering with GDB LLDB Made Easy项目地址: https://gitcode.com/GitHub_Trending/pw/pwndbg创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表