海莲花OceanLotus的CobaltStrike加载器
样本来源:https://x.threatbook.cn/ 搜索MD5:edf7dc76776cd05ecf1bc190ae591654
流程图:
释放资源中的代码
参考:https://www.cnblogs.com/gakusei/articles/1352922.html
释放后,CALL进去
里面有混淆代码,主要有两个CALL
第一个CALL创建了线程,但是一直处理挂起状态
第二个CALL:遍历链表获取函数地址;设置不弹窗;挂起的方式创建svchost.exe进程;往它里面申请两段内存,第一段放跳板代码,第二段放代码;挂起线程设置线程Eip为第一段跳板代码,恢复线程跑起来。
(1)函数地址 : 加载DLL、获取函数地址
(2)设置不弹窗
参考 https://www.cnblogs.com/QKSword/p/10739142.html
接着继续LoadLibraryA 、GetProcAddress 加载模块,取函数地址
(3)接着挂起的方式创建进程svchost.exe
(4)在svchost.exe进程申请第一段可读写可执行的内存(0x12字节大小,做跳板代码,地址为0x00080000
(5)再申请第二段可读写可执行的内存 0x0003420D字节大小,保存代码,地址为0x00090000
(6)WriteProcessMemory把代码写入第二段内存
(7)遍历进程快照找到刚创建的svchost.exe进程,找到后打开它的线程
(8)挂起这个线程,获取上下文,把跳板代码拷贝进去后,再设置线程Eip为跳板代码头部
(9)ResumeThread线程挂起次数-1,再一次ResumeThread让线程跑起来
【svchost.exe进程】
预先附加了svchost.exe进程,在第一段跳板代码下了断点,恢复线程时断下来了;
CALL到第二段代码
底下两个CALL是关键CALL;
第一个call ebx:获取关键函数;申请内存;拷贝4段内存;修复导入表;修复重定位;改内存为可执行;获取DLL入口点AddressOfEntryPoint,执行DLL入口点;
第二个call eax:再一次执行DLL入口点;
第一个call
(1)获取关键函数:
(2)申请内存:随机申请0x45000大小的,只读写属性,申请出来的地址为0x00280000,做完一系列操作再添加可执行属性。
(3)拷贝4段内存:
(3.1)拷贝第一段内存(包含代码) 地址0x00280000 ,大小0x25A00
(3.2)拷贝第二段内存(包含需要修复的导入表) 地址0x002A6000 ,大小0xA200
(3.3)拷贝第三段内存(中间包含异或0x69加密的IP地址字符串) 地址0x002B1000 ,大小0x 2200
(3.4)拷贝第四段内存(包含需要修复的重定位) 地址0x00 2C2000 ,大小0x 2000
(4)修复导入表:解密字符串;LoadLibraryA加载模块;解密字符串;GetProcAddress获取函数地址,修复导入表;
(5)修复导入表
(6)修复重定位:
(7)改第一段内存(代码)为可执行
(8)获取DLL入口点AddressOfEntryPoint,执行DLL入口点
=====================================================================
AddressOfEntryPoint (DllEntryPoint):
通过比较普通的DLL,三个参数,多次调用的就是DllMain函数了
解密出IP地址
第二个call eax:再一次执行DLL入口点
释放掉上面执行DLL入口点的代码
主要函数,连接远程主机
访问185.225.19.22
此IP已经被标记为远控、APT、OceanLotus
本文参照jux1a原创发布
转载,请参考转载声明,注明出处: https://www.anquanke.com/post/id/246158
安全客 - 有思想的安全新媒体