SuperAPI AI 工具集

re-go

安全与审计

查看项目

更新于 10-16 05:06

技能介绍

用途:在确认样本为 Go 编译二进制(file 输出含 Go BuildID,或节表含 .gopclntab/.go.buildinfo)后,利用 Go 默认保留符号的特性还原逻辑;识别 Go 版本与构建信息;分析多 goroutine 程序控制流;恢复 strip 后的 Go 符号;也可用于 Go 恶意样本的静态还原。非 Go 原生程序(C/C++、Rust)不适用;带壳样本需先脱壳,pclntab 偏移失效后本技能才有效。动态步骤默认在沙箱内进行,Go 二进制体积大,建议静态优先。

主要能力与工具:Go 工具链(go version、go tool buildid、go version -m)用于版本与 buildinfo 指纹;Ghidra 11.2+ 内置 Go 分析器可从 pclntab 恢复符号;GoReSym 用于 strip 后符号恢复,命令为 go install github.com/mandiant/GoReSym@latest,用法 GoReSym -t -d -p sample > gosyms.json,配合 goresym_rename.py 导入反编译器;redress 用于元数据与类型,命令 go install github.com/goretk/redress@latest,用法 redress info sample、redress types struct sample --methods;bloaty 用于体积分析;dlv 用于 goroutine 感知调试。

使用方式:先识别 Go 二进制并确认符号保留状态,再取 Go 版本指纹(go tool buildid、go version -m、strings 兜底),随后按目标选择符号恢复或类型恢复工具,最后结合 Ghidra/IDA 反编译 main.main 与 main.* 调用链。goroutine 入口可从 runtime.newproc 的 funcval 参数定位,调度相关调用(gopark/gosched/schedule)与函数序言的 morestack 属噪声。

限制与常见坑:strip 后符号全丢需依赖 pclntab 恢复;runtime 占体积大头,需过滤 main.* 缩小范围;逃逸分析使局部变量转为堆对象;buildinfo 自 Go 1.18 才默认嵌入;garble 混淆会 hash 函数名并惰性解密字符串;纯 Go 产物 LD_PRELOAD 通常无效;cgo 混合产物中 C 符号需另行处理;Windows PE Go 样本可在 Linux 侧静态分析。