pwndbg go-dump 命令详解:在 GDB/LLDB 中原生解析与转储 Go 内存值

发布时间:2026/9/15 19:43:18
pwndbg go-dump 命令详解:在 GDB/LLDB 中原生解析与转储 Go 内存值 pwndbg go-dump 命令详解在 GDB/LLDB 中原生解析与转储 Go 内存值【免费下载链接】pwndbgExploit Development and Reverse Engineering with GDB LLDB Made Easy项目地址: https://gitcode.com/GitHub_Trending/pw/pwndbggo-dump别名god是 pwndbg 内存memory分类下专为 Go 二进制设计的命令它能在调试会话中按 Go 类型语法直接解析指定地址上的内存并以接近 Go 语言字面量的形式输出结构体、切片、map、接口等复合值。读完本文你将掌握go-dump的完整用法、全部可选参数与格式控制配置项理解其底层运行期类型解码runtime type decoding机制并能结合go-type命令对任意 Go 类型地址进行自省与转储。命令概览用法、别名与参数go-dump的完整帮助信息位于 docs/commands/memory/go-dump.md命令实现位于 pwndbg/commands/godbg.py。其用法为usage: go-dump [-h] [-x] [-f [DECIMALS]] [-d] [-p] ty address命令接受两个必选位置参数与若干可选参数详见下表位置参数说明ty要转储值的 Go 类型例如map[int]string也可以是运行期类型对象的地址如0x408860pwndbg 会在运行时解析该地址处的反射类型address要转储的内存地址由pwndbg.commands.AddressExpr解析支持表达式如x、寄存器等短参数长参数说明-h--help显示帮助信息并退出-x--hex以十六进制显示非指针整数-f--decimals配置浮点数显示的小数位数-d--debug显示调试信息例如切片/map 元素的地址、切片容量等-p--pretty启用美化输出pretty printing从命令实现pwndbg/commands/godbg.py可以看到命令处理器会先尝试把ty按整数解析为运行期类型地址并调用pwndbg.aglib.godbg.decode_runtime_type()解码若解析失败ValueError则退化为调用parse_type()按类型字符串语法解析最终统一构造FormatOpts并调用parsed_ty.dump(address, fmt)完成内存转储。支持的 Go 类型语法go-dump的类型语法与 Go 语言本身高度一致可以转储如下类型详见 docs/tutorials/go-debugging.md整数类型int、int8、int16、int32、int64、int128以及对应的uint系列杂项类型bool、rune、uintptr、string浮点类型float32、float64复数类型complex64、complex128接口类型any表示空接口interface{}interface表示所有非空接口函数类型funcptr表示任意函数类型指针*ELEM切片[]ELEM数组[LEN]ELEMmapmap[KEY]VAL。注意Go 中的 map 变量本质上是内部 map 结构的指针因此要转储一个 map 变量时通常需要使用*map[KEY]VAL即先解引用一次。结构体也受支持但语法与 Go 略有不同为了免去用户自行计算字段偏移并支持只提供部分字段信息结构体以偏移:字段名:类型三元组、用分号分隔后包裹在struct(SIZE){}中。例如struct(24){0:foo:string;16:bar:int64}表示 24 字节的 Go 结构体struct { foo string; bar int64 }。在 pwndbg/aglib/godbg.py 中parse_type()依次尝试_parse_runtime_ty、_parse_struct_ty、_parse_map_ty、_parse_array_ty、_parse_pointer_ty、_parse_slice_ty、_parse_basic_ty七种语法解析器全部失败时抛出ValueError。类型名称解析失败时会给出提示例如源码中提示未知类型可改用type hexdump[n]以指定大小的方式查看pwndbg/aglib/godbg.py。实战示例以下示例来自 docs/tutorials/go-debugging.md可直接在 pwndbg 中复现pwndbg go-dump map[string]int 0xc0000b20f0 {a: 1, b: 2, c: 3} pwndbg go-dump any 0xc0000ace40 ([]struct { a int; b string }) [struct {a: 1, b: first}, struct {a: 2, b: second}] pwndbg go-dump struct(24){0:a:int;8:b:string} 0xc000108120 struct {a: 1, b: first}第一个示例直接按map[string]int解析 map 内存第二个示例用any转储一个空接口值——由于接口内部携带运行期类型信息pwndbg 能自动还原出底层类型一个[]struct{...}切片并递归转储第三个示例展示了结构体的struct(SIZE){...}语法。测试用例 tests/library/dbg/tests/test_go.py 验证了go-dump any x输出(map[uint8]uint64) {1: 2, 3: 4, 5: 6}、(map[string]int) {a: 1, b: 2, c: 3}以及go-dump -f 1 any x输出复数数组([3]complex64) [(1.1 2.2i), (-2.5 - 5.0i), (4.2 - 2.1i)]等行为。可选参数与输出格式控制-x / --hex将非指针整数以十六进制显示。对应FormatOpts.fmt_int()pwndbg/aglib/godbg.py开启后str(val)变为hex(val)。-f / --decimals N浮点数含复数实部/虚部保留N位小数对应FormatOpts.fmt_float()中的format(val, f.{N}f)。-d / --debug在转储结果中为每个元素附加内存地址信息——切片元素、map 的 key/val、字符串的数据指针与长度、指针的解引用地址、接口的类型与数据地址等都会以单独颜色标注。该颜色的主题参数为go-dump-debug默认蓝色定义见 pwndbg/aglib/godbg.py。-p / --pretty启用美化输出。当某一行超过软宽度上限时会换行并按缩进量排版相关配置项为go-dump-line-width默认 80软行宽与go-dump-indent-amount默认 4缩进量二者定义于 pwndbg/aglib/godbg.py可在 pwndbg 中通过set命令调整。运行期类型解析Runtime Type Parsing原理Go 编译器会为程序使用到的每一个类型发射类型对象type object这正是go-dump能自动转储接口值、甚至无需用户提供类型名即可转储任意类型的基础。定位类型的一种常用方法是找到传入堆分配函数如runtime.newobject、runtime.makeslice的类型指针。找到类型指针后可以用配套命令go-type别名goty见 docs/commands/memory/go-type.md检查该类型pwndbg go-type 0x49fbc0 Name: struct { a int; b string } Kind: STRUCT Size: 24 (0x18) Align: 8 Parse: struct(24){0:a:int;8:b:string} Field a: Offset: 0 (0x0) Type name: int Type addr: 0x498ce0 Field b: Offset: 8 (0x8) Type name: string Type addr: 0x498aa0go-type输出名称、种类Kind、大小、对齐方式、可直接交给go-dump使用的 Parse 字符串以及每个字段的偏移与类型信息实现见 pwndbg/commands/godbg.py。go-dump同样可以直接接受类型地址作为ty参数pwndbg go-dump 0x49fbc0 0xc000108120 struct {a: 1, b: first}从源码结构看类型解码的核心是decode_runtime_type()pwndbg/aglib/godbg.py它按 Go 官方src/internal/abi/type.go中Type结构体的内存布局读取Size_、PtrBytes、Hash、TFlag、Align_、FieldAlign_、Kind_、Equal、GCData、Str、PtrToThis等字段其中Kind_低 5 位映射到GoTypeKind枚举pwndbg/aglib/godbg.py涵盖BOOL、INT、FLOAT32、ARRAY、CHAN、FUNC、INTERFACE、MAP、POINTER、SLICE、STRING、STRUCT等全部种类。解码过程使用cache配合BackrefType占位符处理递归类型如type a []a最后统一替换回真实类型。几个值得注意的底层细节类型名称读取Go 1.17 之前类型名是 1 字节位标志后跟 2 字节大端长度前缀的字符串1.17 之后改为 varint 长度前缀编码read_type_name()会根据检测到的 Go 版本选择解码路径pwndbg/aglib/godbg.py。Go 版本探测优先读取runtime.buildVersion符号否则回退到.go.buildinfo段解析pwndbg/aglib/godbg.py。版本不仅影响类型名格式还影响结构体字段偏移的移位Go 1.19 前后与 map 的布局。类型区段定位类型名以相对moduledata的偏移存储get_type_start()优先遍历runtime.firstmoduledata符号链表获取types/etypes区间找不到调试符号时退化为用type:*符号或.rodata段启发式猜测pwndbg/aglib/godbg.py。map 的两种布局Go 1.24 之前 map 采用hmap/bucket 结构dump_noswissGo 1.24 起采用新的 Swiss Table 布局dump_swisspwndbg 根据探测到的 Go 版本自动切换解析路径pwndbg/aglib/godbg.py。架构相关字长与对齐word_size()与max_align()依据当前架构返回 Go 的字长与最大对齐值如 x86-64/aarch64/rv64 为 8 字节i386/arm 为 4 字节见 pwndbg/aglib/godbg.py所有布局计算均以此为基础。类型系统的源码对应关系go-dump的类型模型是一个抽象基类Type定义dump()、size()、align()、get_typename()四个抽象方法见 pwndbg/aglib/godbg.py下的具体子类BasicType基本类型。复数按实部虚部两个浮点布局字符串按指针长度布局空接口记为any、带方法接口记为interface、函数指针记为funcptrpwndbg/aglib/godbg.pySliceType切片按指针、长度、容量三个字布局-d时可输出容量信息pwndbg/aglib/godbg.pyPointerType指针空指针输出nil否则解引用并递归转储pwndbg/aglib/godbg.pyArrayType定长数组按连续内存布局逐个转储元素pwndbg/aglib/godbg.pyMapTypemap内部按前述两种布局之一遍历所有桶/组并按键排序输出pwndbg/aglib/godbg.pyStructType结构体按字段偏移定位各字段内存pwndbg/aglib/godbg.pyRuntimeType以runtime(SIZE)ADDRESS表示运行期类型地址 值大小的类型用于序列化循环类型pwndbg/aglib/godbg.py。每种类型都实现了additional_metadata()供go-type命令输出字段偏移、元素/键值类型地址等元数据。使用提示与适用前提go-dump只有在程序运行中才可用命令注册了OnlyWhenRunning装饰器见 pwndbg/commands/godbg.py。类型字符串解析不依赖调试符号但运行期类型解码ty传地址在部分路径上依赖符号如runtime.firstmoduledata缺失时 pwndbg 会打印警告并退化为启发式定位见 pwndbg/aglib/godbg.py。map 转储对 Go 1.24Swiss Table与旧版hmap分别处理且 map 实际为指针语义注意使用*map[KEY]VAL解引用。从源码结构看channelCHAN类型当前尚不支持转储pwndbg/aglib/godbg.py 注释标明 currently channels and functions are unsupported其中函数可通过funcptr处理。若遇到非法或无法解析的类型parse_type会抛出ValueError命令会给出类型解析失败的错误信息。结合配套的 docs/tutorials/go-debugging.md 教程你可以在 pwndbg 调试 Go 程序时用go-type自省任意类型对象、用go-dump直接以 Go 字面量形式读取内存中的复合值显著提升 Go 逆向与漏洞调试效率。【免费下载链接】pwndbgExploit Development and Reverse Engineering with GDB LLDB Made Easy项目地址: https://gitcode.com/GitHub_Trending/pw/pwndbg创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询