受 golang_loader_assist 和 jeb-golang-analyzer 启发,本菜为 IDAPro 写了一个更完备的 Go 二进制文件解析工具。现开源出来:
GitHub Repo:
0x00 核心功能:
- 自动定位 firstmoduledata 的位置并解析;
- 根据 firstmoduledata 中的信息定位到 pclntab(PC Line Table),并从 pclntab 入手解析、恢复函数符号,抽取源码文件列表;
- 解析 strings 和 string pointers;
- 根据 firstmoduledata 中的信息,解析所有 types 并为 types 各种属性打上有意义的 comment 或 dref;
- 解析 itab(Interface Table);
- 以上功能对于 buildmode=pie 类型的 Go binary 文件依然有效。
关于 PIE mode,多说一句。很多人编译 Go 程序时没注意过 go buildmode,其中一个比较特殊的 buildmode=pie,可以生成地址无关的二进制文件,进而结合 ASLR 技术加强自身安全性。这对 Go 自身的内存安全机制来说,是个锦上添花的特性。详情参考:
其实这个 buildmode 还有一个鲜为人知的效果:在用此模式编译出的二进制文件面前,当前业界公开的 Go binary parse script/plugin for disassemblers 就跪了,分析不了。连鄙人眼中曾经最强的 Go 二进制逆向解析工具 redress( hxxps://go-re.tk/redress/ ) 也无能为力:
使用 GoParser 在 IDA 中分析 DDGMiner v5029 (MD5: 95199e8f1ab987cd8179a60834644663) 样本中核心的配置文件 struct 解析结果示例如下:
样本源码文件列表:
0x01 项目文件列表:
- go_parser.py :整套工具的入口文件,在 IDAPro 中 [Alt+F7] 组合键,执行此脚本;
- common.py: 通用变量和函数定义;
- pclntbl.py: 解析 pclntab(PC Line Table);
- strings.py: 解析 strings 和 string pointers;
- moduldata.py: 解析 firstmoduledata;
- types_builder.py: 解析所有 types ;
- itab.py: 解析 itab(Interface Table);.
0x02 Note
- 此工具只在 IDA7.2/IDA7.0 上测试过,其他的 IDA 版本未经测试;
- strings 解析模块从 golang_loader_assist 移植过来,我自己又增加了 string pointers 解析的功能,目前只支持 x86 架构。
0x03 Refer
最后于 2020-8-7 12:14
被无敌甲鱼编辑
,原因: 新增 PIE module 相关的 refer