golang解析
原始样本MD5:c54eb668cf76a37bf28f95c173770adf
IDA加载原始样本,根据入口点cpu判断代码可以得知该样本由golang编写
字符串表也有golang runtime相关的关键字:
由于golang语言的特殊性,在不还原符号的情况下无法对其进行有效的分析,所以需要先对样本进行符号还原。
IDA7.0符号还原
对于7.0的的IDA可以使用IDAGolangHelper(https://github.com/sibears/IDAGolangHelper)插件还原符号,使用方法很简单,将github上下载的脚本解压到IDA的plugins文件夹下:
IDA加载目标程序之后,ALT + F7组合键打开脚本,进入到plugins路径下,打开go_entry.py文件,然后选择golang版本,默认情况下是1.2,然后单击Rename Functions
重命名之后,在函数窗口中就重命名完成了,最下面的main_main就是此程序的入口点:
注意,如果在执行脚本时出现以下错误
可以打开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())
保存之后重新加载脚本即可正常解析,有时候重命名函数名之后,函数窗口中没有main_main,此时关闭IDA,重新加载这个文件即可,由于IDA已经识别样本是golang编写的,再次加载的时候会自动加载golang解析插件。
IDA7.5符号还原
7.5的IDA可在吾爱下载:https://www.52pojie.cn/thread-1345176-1-1.html
吾爱的IDA提供了绿色插件,使用起来较为方便。
下载并解压之后,直接运行根目录下的绿化工具即可,绿化完成会关闭IDA的自动更新并创建桌面的快捷方式。
WIn+R打开运行窗口,出入 shell:sendto 并将IDA的快捷方式复制到该目录下将其添加到右键菜单
接下来准备7.5版本的golang解析工具
7.5的IDA可以通过甲鱼大佬的go_parser插件:https://github.com/0xjiayu/go_parser
下载release版本之后将其解压放入到IDA的plugins路径下
然后使用IDA7.5打开刚才的样本,ALT+F7运行该目录下的go_parser.py脚本,第一次运行可能会出现如下窗口,表示IDA没有安装IPython
此时在IDA7.5的根目录下找到Python38文件夹
调用python38路径下的python.exe执行 -m pip install IPython
等待安装IPython~
安装完成之后重新运行脚本即可
出现该窗口则说明程序正在被解析
成功还原符号
样本小结
在main_mian中,可以看到程序将一段字符串转为byte,然后将其格式化为十六进制数据
对VirtualAlloc设置断点,可以看到golang内部是先通过VirtualAlloc分配了一段内存空间:
填充数据到新开辟的内存空间:
转换为Hex:
接着重新开辟一段空间并将这部分数据拷贝过去,直接对这个内存地址设置执行断点可以过来,过来之后可以看到就是CobaltStrike的shellcode
连接C2:149.248.18.93