golang解析

原始样本MD5:c54eb668cf76a37bf28f95c173770adf

IDA加载原始样本,根据入口点cpu判断代码可以得知该样本由golang编写
image.png

字符串表也有golang runtime相关的关键字:
image.png

由于golang语言的特殊性,在不还原符号的情况下无法对其进行有效的分析,所以需要先对样本进行符号还原。

IDA7.0符号还原

对于7.0的的IDA可以使用IDAGolangHelper(https://github.com/sibears/IDAGolangHelper)插件还原符号,使用方法很简单,将github上下载的脚本解压到IDA的plugins文件夹下:
image.png

IDA加载目标程序之后,ALT + F7组合键打开脚本,进入到plugins路径下,打开go_entry.py文件,然后选择golang版本,默认情况下是1.2,然后单击Rename Functions
image.png

重命名之后,在函数窗口中就重命名完成了,最下面的main_main就是此程序的入口点:
image.png

注意,如果在执行脚本时出现以下错误
image.png

可以打开plugins\GOUtils目录下的_init.py文件并将第16行的self.bt_obj = Utils.get_bitness(ida_ida.inf_get_min_ea())修改为self.bt_obj = Utils.get_bitness(idc.BeginEA())
小记-golang恶意样本分析 - 图7

保存之后重新加载脚本即可正常解析,有时候重命名函数名之后,函数窗口中没有main_main,此时关闭IDA,重新加载这个文件即可,由于IDA已经识别样本是golang编写的,再次加载的时候会自动加载golang解析插件。
image.png

IDA7.5符号还原

7.5的IDA可在吾爱下载:https://www.52pojie.cn/thread-1345176-1-1.html
吾爱的IDA提供了绿色插件,使用起来较为方便。

下载并解压之后,直接运行根目录下的绿化工具即可,绿化完成会关闭IDA的自动更新并创建桌面的快捷方式。
image.png

WIn+R打开运行窗口,出入 shell:sendto 并将IDA的快捷方式复制到该目录下将其添加到右键菜单
image.png

接下来准备7.5版本的golang解析工具

7.5的IDA可以通过甲鱼大佬的go_parser插件:https://github.com/0xjiayu/go_parser
image.png

下载release版本之后将其解压放入到IDA的plugins路径下
image.png

然后使用IDA7.5打开刚才的样本,ALT+F7运行该目录下的go_parser.py脚本,第一次运行可能会出现如下窗口,表示IDA没有安装IPython
image.png

此时在IDA7.5的根目录下找到Python38文件夹
image.png
调用python38路径下的python.exe执行 -m pip install IPython
image.png
等待安装IPython~
image.png
安装完成之后重新运行脚本即可
image.png

出现该窗口则说明程序正在被解析
image.png

成功还原符号
image.png

样本小结

在main_mian中,可以看到程序将一段字符串转为byte,然后将其格式化为十六进制数据
image.png

对VirtualAlloc设置断点,可以看到golang内部是先通过VirtualAlloc分配了一段内存空间:
image.png

填充数据到新开辟的内存空间:
image.png

转换为Hex:
image.png

接着重新开辟一段空间并将这部分数据拷贝过去,直接对这个内存地址设置执行断点可以过来,过来之后可以看到就是CobaltStrike的shellcode
image.png

连接C2:149.248.18.93
image.png