SuperAPI AI 工具集

analyzing-golang-malware-with-ghidra

安全与审计

查看项目

更新于 10-15 12:32

技能介绍

本技能旨在指导使用 Ghidra 对 Go(Golang)编译的恶意软件进行逆向工程,核心方法是解析 Go 的 buildinfo 与 pclntab 结构,从而恢复被剥离或混淆的函数名。

用途与背景 资料说明,Go 因具备跨平台编译能力、静态链接生成自包含二进制文件,以及对逆向工程带来的复杂性,已成为恶意软件作者常用的语言。Go 二进制文件将整个运行时、标准库和所有依赖静态链接在一起,因此体积较大(常为 5-15MB),包含数千个函数。Ghidra 在处理 Go 特有的字符串格式(非空终止)、被剥离的函数名以及 goroutine 并发模式时存在困难。专用工具 GoResolver(Volexity,2025)利用控制流图相似度,自动对已剥离或混淆的 Go 二进制执行反混淆并恢复函数名。

适用场景 当调查安全事件、需要分析 Golang 恶意软件时;当需要为该领域构建检测规则或威胁狩猎查询时;当 SOC 分析师需要此类分析的结构化流程时;当需要验证相关攻击技术的安全监控覆盖时,可使用本技能。

前置条件 Ghidra 11.0+ 与 JDK 17+;GoResolver 插件(用于恢复函数名);Go Reverse Engineering Tool Kit(go-re.tk);Python 3.9+ 用于辅助脚本;需理解 Go 运行时内部机制(goroutine、channel、interface);需熟悉 Go 二进制结构(pclntab、moduledata、itab)。

关键概念 Go 二进制结构:Go 二进制在 pclntab(PC Line Table)结构中嵌入丰富的元数据,将程序计数器映射到函数名、源文件和行号;即使符号表被剥离,这些元数据仍会保留。moduledata 结构包含指向类型信息、itab(接口表)以及 pclntab 本身的指针。Go 字符串以指针-长度对的形式存储,而不是以空字符结尾的 C 字符串。

被剥离二进制中的函数恢复:尽管符号表被剥离,Go 二进制仍将函数名保留在 pclntab 中;但 garble 等混淆工具会把函数重命名为随机字符串。GoResolver 通过计算被混淆函数的控制流图签名,并与已知 Go 标准库及第三方包函数数据库匹配来解决此问题。

依赖提取:Go 的依赖管理会在二进制中嵌入模块路径和版本字符串,提取这些信息可揭示恶意软件的第三方依赖(HTTP 库、加密包、C2 框架),从而无需完整逆向工程即可了解其能力。

工作流程要点 资料提供了三个步骤。步骤 1 为 Python 初始二进制分析脚本:查找 Go buildinfo 魔术字节 \xff Go buildinf:,提取 Go 版本;通过各版本的 pclntab 魔术字节定位 pclntab;从 pclntab 提取函数名并按网络、加密、OS 执行、文件 IO、main、第三方等类别归类;提取 Go 模块依赖(如 github.com、golang.org 等路径);提取可疑字符串(http、cmd、encrypt、c2、beacon 等关键词)。步骤 2 为 Ghidra 内运行的脚本(AnalyzeGoBinary.py),用于在内存中查找各版本 pclntab 魔术字节、创建 go_pclntab 标签,并统计包含包路径前缀的 Go 函数符号。

验证标准 从二进制中提取出 Go 版本和构建信息;定位并解析 pclntab 以恢复函数名;识别第三方依赖以揭示恶意软件能力;枚举 main 包函数用于针对性分析;对网络、加密和 OS 执行函数进行分类;Ghidra 分析能正确标注 Go 运行时结构。

限制 资料未提供该技能的收费、价格、平台支持范围、实际效果或具体安装命令之外的更多信息;部分细节(如各版本魔术字节覆盖情况、工具兼容性)以资料为准,未提及内容暂未提供。