反沙箱CobaltStrike木马加载器分析
总结
1.计算Sleep类函数延时时间与实际流逝时间是否匹配可判断环境是否为正常。对沙箱来说,跳过Sleep节约时间成本是有必要的不可省去,但可适当处理GetTickCount类函数,使其与延时时间匹配。
2.对于动态解密,打好断点动态分析比静态分析省时间,至少对我这种刚上路的菜狗来说是这样。
3.CertEnumSystemStore可作为CertEnumSystemStore替代品用于执行Shellcode。
前言
近日,笔者参加了浙江护网,在攻击队停止攻击的那一天凌晨,Windows服务器被攻破大量失分,早晨溯源时拿到了这一份名为chrome.exe的木马样本。
木马HASH
SHA256:7fbe93d7c29b4ea4ce918f3d16a74d2930120f44d00862bdc0a1f8289954e010 MD5:a5f06c8e88e200a860e83a6bdd197752 SHA1:7e5675f8c84b800a1290dd7422be1f10c2302c4d
正文
这份木马被火绒报毒,从报毒界面可以得到关于此样本的两条信息,
64位Windows程序。
大概率是CobaltStrike后门。
既然很可能是CobaltStrike后门,那直接上传哈勃、微步一把梭看一看木马行为。可奇怪的是沙箱均未检测出网络连接行为,且被鉴定为安全,这激起了我的好奇心。
拖入IDA,在主函数头部发现了exit(0),则五行伪C代码很有可能是反沙箱的代码,若是沙箱直接exit,非沙箱执行下边的解密、执行操作。
为验证这五行代码是否起到我预料的效果,我用c实现了一份类似功能的exe准备传入微步沙箱,若微步沙箱的程序运行截图中存在"sandbox!!!"则代表检测到沙箱。
#define HIDWORD(x) (*((DWORD*)&(x)+1)) //IDA
int main()
{int v3; // ebx__int64 v4; // kr00_8v3 = GetTickCount64(); // 反沙箱Sleep(300u);v4 = (int)(-300 - v3 + GetTickCount64());printf_s("v4:%d\n",v4);if ((int)((HIDWORD(v4) ^ v4) - HIDWORD(v4)) > 100)printf_s("sandbox!!!\n");elseprintf_s("none!!\n");system("pause");return 0;
}
在微步沙箱中v4为负数,检测到沙箱,而在自家Windows虚拟机内则返回正常,可见代码有效。
猜测这段代码的原理是沙箱为了节省运行时间,处理了Sleep或SleepEx类的API,导致此类API无法正常延迟,通过记录时间检测是否跳过延时即可判断是否存在沙箱。
将jg条件跳转噶了,避免其转入exit,保存后传入沙箱。
可见能正常分析出网络行为。
运行完反沙箱部分便是解密shellcode,这里是带key的xor解密。
解密完毕后修改内存为PAGE_EXECUTE_READWRITE属性用于后续执行shellcode。
此样本另外有趣的一点是他没有使用CreateThread的方式执行shellcode,而是使用Crypt32.dll中的CertEnumSystemStore,降低杀软查杀样本的可能性。
通过查询微软官方文档可知,此API会为每个找到的系统存储调用参数四提供的回调函数,这给shellcode提供了执行的机会。
为进一步分析加载器,需得到解密后的shellcode。
直接对CertEnumSystemStore下断点,在执行前一刻dump下解密后的pfnEnum开头的0x40255大小的内存,拖入IDA.
shellcode开头,调用sub_4022F,进入函数。
开头pop rdx将返回地址取到rdx,对返回地址后续进行一系列解密操作。在sub_4022f处下断,重新dump整个shellcode(这里注意断下后取消断点再dump,否则会将软件断点int3 也dump下来),拖入IDA。
又是解密。依法炮制。
这一次下方0X7D位置可见经典的PE程序特征了,未见MZ头部,但可根据PE结构推测出文件头位于0x2F位置,0x2F位置刚好又是MZ头部,将DOS头复用作为代码执行空间,节省空间。
继续看上方的loc_2F,MZ头部的0x4D5A对应的pop r10后做了一次逆向操作,随后调用了sub_16023.
进入25行的sub_16383。
根据读gs:[60h]以及ROR4可以推测sub_16383主要功能是根据HASH获取API地址。
在shellcode+0x160DF(sub_16383返回地址)打下断点,将木马运行起来,分析sub_16023的v13可知,
v13结构如下。
typedef struct _API
{PVOID GetModuleHandleA;PVOID GetProcAddress;PVOID LoadLibraryA;PVOID LoadLibraryExA;PVOID VirtualAlloc;PVOID VirtualProtect;
}API, * PAPI;
再下边就是在内存展开、修复导入表...最后找到入口点并执行,所以sub_16383功能为内存加载Dll。
将Dll Dump出来,拖入IDA。
EAT中发现ReflectiveLoader,而原生CobaltStrike木马所Map的Dll也同样导出了ReflectiveLoader,且IAT也极为相似,基本可以判断这个就是最后的功能DLL。
加载器部分分析完毕。
总结
1.计算Sleep类函数延时时间与实际流逝时间是否匹配可判断环境是否为正常。对沙箱来说,跳过Sleep节约时间成本是有必要的不可省去,但可适当处理GetTickCount类函数,使其与延时时间匹配。
2.对于动态解密,打好断点动态分析比静态分析省时间,至少对我这种刚上路的菜狗来说是这样。
3.CertEnumSystemStore可作为CertEnumSystemStore替代品用于执行Shellcode。
有价值的评论:
huoji120LV.5(这家伙太懒了,还未填写个人描述!)
这能所谓的反沙箱是因为 沙箱会加速sleep但是不会加速gettickcount.导致前者和后者的时间结果不对.沙箱把gettickcount加速后就好了.但是国内的现在技术能力可能是不太行的
反沙箱CobaltStrike木马加载器分析相关推荐
- python反编译luac_Lua程序逆向之为Luac编写IDA Pro文件加载器
距离上一次讲Lua程序逆向已经有一段时间了,这一次我们书接上回,继续开启Lua程序逆向系列之旅. 在软件逆向工程实践中,为第三方文件编写文件格式分析器与指令反汇编器是一种常见的场景.这一篇的主要目的是 ...
- 【OS学习笔记】十 实模式:实现一个程序加载器-程序加载器如何将用户程序加载到内存并执行
上一篇文章学习了以下内容: 用一种不同的分段方法,从另一个不同的的角度理解处理器的分段内存访问机制 使用循环和条件转移指令来优化主引导扇区代码 点击链接查看上一篇文章:点击链接查看 对于主引导扇区部分 ...
- JVM--类加载器详解
42. JVM--类加载器详解 ● 类加载器子系统作用: 1. 类加载器子系统负责从文件系统或者网络中加载Class文件,class文件在文件开头有特定的文件标识. 2. ClassLoader只负责 ...
- JS框架设计之加载器所在路径的探知一模块加载系统
1.要加载一个模块,我们需要一个URL作为加载地址,一个script作为加载媒介,但用户在require是都用ID,我们需要一个将ID转换为URL的方法,思路很简单,强加个约定,URL的合成规则是为: ...
- C编译器、链接器、加载器详解
一.概述 C语言的编译链接过程要把我们编写的一个c程序(源代码)转换成可以在硬件上运行的程序(可执行代码),需要进行编译和链接.编译就是把文本形式源代码翻译为机器语言形式的目标文件的过程.链接是把目标 ...
- Windows内核加载器概念学习
最近看ReactOS源码分析相关,看到内核加载器概念相关的:原文如下: ReactOS源码分析--内核加载器(一) 计算机BIOS读取硬盘第一个扇区的数据到内存0x7C00位置,将控制权交给主引导记录 ...
- 手写简版spring --5--资源加载器解析文件注册对象
一.目标 在完成 Spring 的框架雏形后,现在我们可以通过单元测试进行手动操作Bean对象的定义.注册和属性填充,以及最终获取对象调用方法.但这里会有一个问题,就是如果实际使用这个 Spring ...
- unity 异步加载网络图片_一个非常好用的AssetBundle资源加载器
Loxodon Framework Bundle是一个非常好用的AssetBundle加载器,也是一个AssetBundle冗余分析工具.它能够自动管理AssetBundle之间复杂的依赖关系,它通过 ...
- JVM篇2:[-加载器ClassLoader-]
写本篇的动因只是一段看起来很诡异的代码,让我感觉有必要认识一下ClassLoader ----[Counter.java]------------------------- public class ...
最新文章
- Maven配置JRE版本
- python视频编辑过场动画_视频剪辑什么鬼?Python 带你高效创作短视频
- 计算机软件侵权责任,对计算机软件侵权行为认定标准
- 移动端日期选择插件rolldate
- 10个CSS简写/优化技巧
- Quartz入门指南
- nagios监控服务短信报警开发及部署细节
- java string 数组 个数,Java - 定义一个接收String的方法,并返回一个整数数组,其中包含每个元音的数量...
- 2022年Java常用的框架汇总,你常用哪一个?
- 带云的计算机词语,关于写带有云字的词语
- 浩辰CAD 2019 v190128官方免费版
- JPA实体中数据库生成ID的最终指南1
- PWM电流源型逆变器
- Windows 10 远程桌面开启和关闭
- MTK Android Driver:PMIC
- python网易云_[Python] 网易云歌单/歌曲下载
- ol4通过ImageCanvas实现大量点的展示以及交互的实现
- python提取图片频谱_Python提取音乐谱并将其可视化,频谱
- 保证充足的高质量睡眠
- 两子公司犯单位行贿罪各罚100万 鹏博士收警示函高度重视