SuperAPI AI 工具集

analyzing-go-binaries

安全与审计

查看项目

更新于 10-16 02:30

技能介绍

用途:针对被 strip 后看似“无符号”的 Go 二进制进行逆向分析。Go 自带供运行时反射和 panic 回溯使用的符号表,strip 不会移除 pclntab,恢复后函数名与类型即可读。

适用判断:strings 中出现 runtime.main、go:buildid、go.buildinfo、runtime.gopanic;约 5–50 MB 且几乎无动态导入;反汇编显示大量未命名函数。不适用于 Rust 二进制、.NET 程序集、未隔离的可疑恶意样本或通用原生逆向,应改用对应技能。

识别与版本:strings -n 6 target | rg -m5 'go1.[0-9]+|go:buildid|runtime.main|GOROOT';go version target;go version -m target 可输出模块依赖图与构建设置。pclntab 布局在 1.2、1.16、1.18、1.20 有变化,工具失败通常是版本不匹配。

恢复符号:GoReSym -t -d -p target > syms.json;redress info target、redress symbols target、redress types target。随后载入 IDA(AlphaGolang、golang_loader_assist 或 GoReSym 脚本)、Ghidra(GolangAnalyzerExtension、gotools)或 Binja 的 Golang loader 插件,过滤 main.* 与第三方模块路径。

阅读要点:Go 字符串为指针加长度、无终止符;1.17 前参数与返回值走栈,1.17 起在 amd64/arm64 使用寄存器 ABI;接口调用经 itab;go f() 编译为 runtime.newproc,defer 变为 runtime.deferproc/deferreturn。类型恢复可还原结构体字段名与布局,包括 json 标签,从而直接得到 API 或 C2 协议字段名。

安全审查关注:被忽略的 error、用 math/rand 生成安全值、InsecureSkipVerify: true、fmt.Sprintf 拼接 SQL/命令/URL、共享 map 与结构体的数据竞争、os/exec 拼接输入。有源码时改用审计与 govulncheck。

恶意样本:go version -m 的模块列表可识别所用框架,符号表中的构建路径会泄露用户名与目录结构;若 GoReSym 与 redress 均失败而样本明显是 Go,可作为规避迹象,转为直接扫描类型描述符。IOC 与检测输出交由恶意分析与检测工程处理。

限制:具体工具版本支持范围、安装步骤与效果未在资料中完整给出,暂未提供。