主页 > imtoken钱包地址 > DataCon2020恶意代码分析冠军writeup
DataCon2020恶意代码分析冠军writeup
5 结果和改进 6 后记 7 参考文献
1 竞赛题回顾【竞赛官网】:
2070年,GY市将举办冬奥会比特币源码分析,届时将吸引来自全球100多个国家的运动员、政要和众多媒体。 冬奥会将成为众多国际网络恐怖组织和黑客组织关注的焦点,安全形势十分严峻。 为保障冬奥会的顺利举办,大会组委会成立了“重保组”,对全市重点单位、大会相关单位网站、系统等进行网络攻防演练。 团队将根据攻防演练的交通数据,分析和应对各种可能存在的安全威胁,确保大会顺利进行。 假设你是“再保险队”的一员,请结合攻防演练的流量数据,追根溯源,分析处理各类安全事件,帮助大会找出可能存在的安全威胁。及时准确的方式。
【方向5】:恶意代码分析
活动期间,各种体育赛事门票一票难求。 暗网高价倒卖门票的违法行为屡见不鲜,一度让虚拟货币市场火爆。 挖矿类恶意代码数量也呈现爆发式增长。 许多个人用户、企业用户被感染成为免费矿工。 为打击挖矿木马,有必要对近期网络流行的恶意软件进行深入分析,研究设计挖矿型恶意代码的检测方法,保护广大用户的财产安全!
【调查能力】:系统安全相关知识、程序分析和特征提取能力(如逆向分析或机器学习算法)
【方向介绍】
冬奥会期间,各项赛事门票一票难求。 暗网高价倒卖门票的违法行为屡见不鲜,一度让虚拟货币市场火爆。 挖矿类恶意代码数量也呈现爆发式增长。 个人用户和企业用户被感染成为免费矿工。 为打击挖矿木马,有必要对近期网络流行的恶意软件进行深入分析,研究设计挖矿型恶意代码的检测方法,保护广大用户的财产安全!
2 最终排名(部分)
本次比赛,我队在恶意代码分析方向获得初赛第三名和复赛第一名,最终夺得该方向冠军。
3 灵感与思考
来自逆向工程的想法
4 算法与模型
我队在预赛、附加赛和复赛中使用的五种算法或模型相关代码,全文见文末。 思路如下(复赛由于性能要求,部分模型没有使用):
4.1 灰度图像
PE文件二进制的每个字节对应一个像素,最后缩放成固定大小的灰度图。 这是最常见、最容易实现的模型,在恶意代码检测中得到了广泛的应用。
但我们只在预赛中使用它,原因如下:
4.2 Histogram 这也是一种不需要解析PE文件格式进行提取和学习的特征方法,除了灰度图。 我们主要使用两种直方图:
字节熵直方图[2]:
最后,将这两个特征向量连接起来并使用深度学习模型进行学习。 效果好,预处理快,仅这个模型在预赛中就拿到了93.8425分。
4.3 PE静态特征模型
虽然提供的样本已经删除了样本PE结构中的MZ、PE、导入导出表等信息,但我们只需要恢复MZ头和“PE\0\0”即可使用常规分析工具对PE样本进行分析.
因为recovery只能分析PE文件的静态格式和特性,不能直接运行,所以只能从静态特性入手。 最后,我们使用著名的EMBER数据集[3]中提到的PE文件静态特征提取方法。 虽然原文是用来检测恶意Windows PE文件的,但我们也移植了它来检测挖矿软件。
原方法提取了很多PE文件的静态特征,如下:
4.4 特征工程
我们团队使用的特征工程主要包括五个部分,分别是:Section information、character matching、Yara matching、Opcode和其他Boolean information。
4.4.1 栏目信息
节特征是PE文件的一个重要特征。 section过多、section名称异常、资源section异常数量等指标可以提示PE文件的可疑性。 因此,我们首先对section statistics进行特征分析:
每个可读、可写、可执行节的大小和熵,以及每个属性节占文件大小的比例
资源部分的数量
总节数
# OEP处section名长度
section_info["entry"] = len(entry_section)
section_info["section_num"] = len(lief_binary.sections)
# 可读、可写、可执行sections大小均值
sR, sW, sX = [], [], []
# 可读、可写、可执行sections熵值均值
entrR, entrW, entrX = [], [], []
# 资源section个数
rsrc_num = 0
for s in lief_binary.sections:
props = [str(c).split('.')[-1] for c in s.characteristics_lists]
if "MEM_READ" in props:
sR.append(s.size)
entrR.append(s.entropy)
if "MEM_WRITE" in props:
sW.append(s.size)
entrW.append(s.entropy)
if "MEM_EXECUTE" in props:
sX.append(s.size)
entrX.append(s.entropy)
if 'rsrc' in s.name:
rsrc_num += 1
section_info['size_R'], section_info['size_W'], section_info['size_X'] = np.mean(sR), np.mean(sW), np.mean(sX)
section_info['entr_R'], section_info['entr_W'], section_info['entr_X'] = np.mean(entrR), np.mean(entrW), np.mean(entrX)
section_info['rsrc_num'] = rsrc_num
4.4.2 字符匹配
受排位赛的启发,队员们手写了相应的正则匹配模式,包括:
比特币钱包地址正则匹配
一些重要的字符串匹配
self.path_pattern = re.compile(b'[C-Zc-z]:(?:(?:\\\\|/)[^\\\\/:*?"<>|"\x00-\x19\x7f-\xff]+)+(?:\\\\|/)?')
self.regs_pattern = re.compile(b'reg', re.IGNORECASE)# re.compile(b'[A-Z_ ]{5,}(?:\\\\[a-zA-Z ]+)+')
self.urls_pattern = re.compile(b'https?://(?:[-\w.]|(?:%[\da-fA-F]{2}))+')
# self.strings_pattern = re.compile(b'[\x20-\x7f]{5,}')
self.ip_pattern = re.compile(b'(?:(?:25[0-5]|2[0-4]\d|[01]?\d{1,2})\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d{1,2})')
# #比特币钱包地址
self.wallet_pattern_btc = re.compile(b'(?:1|3|bc1|bitcoincash:q)(?:(?![0OIi])[0-9A-Za-z]){25,34}')
self.wallet_pattern_ltc = re.compile(b'(?:ltc1|M|L)[A-Za-z0-9]{25,36}')
self.wallet_pattern_xmr = re.compile(b'[0-9A-Za-z]{90,100}') #门罗币
self.mz_pattern = re.compile(b'MZ')
self.pe_pattern = re.compile(b'PE')
self.pool_pattern = re.compile(b'pool', re.IGNORECASE)
self.cpu_pattern = re.compile(b'cpu', re.IGNORECASE)
self.gpu_pattern = re.compile(b'gpu', re.IGNORECASE)
self.coin_pattern = re.compile(b'coin', re.IGNORECASE)
4.4.3 Yara匹配
Yara 规则是根据二进制文件中包含的文本或二进制字符串的描述创建的。 我们首先使用Yara-Rules[4]提供的规则进行匹配,包括:
密码常量规则
最后,我们还利用yarGen[5]工具对训练集进行了黑样本特征提取。 原理是先解析出样本集中常见的字符串,然后通过白名单库进行过滤,最后通过启发式、机器学习等方式进行过滤,找到最优的Yara规则。 根据得到的Yara规则集结果,选择匹配度大于一定阈值的规则组成新的规则集,检查匹配黑白样本的分布比例,过滤掉部分白样本规则。
通过不断调整阈值参数和筛选比例,在尽可能泛化的同时匹配更多的黑色样本。 最后将比较值得关注的部分人工结合挖掘特征进行规则集优化。
最终自定义Yara规则集阈值为20,即训练集黑色样本中每条规则的匹配样本数大于等于20。
4.4.4 操作码
通过传统的逆向工具分析PE文件中的函数过于耗时,所以我们打算通过简单的正则搜索来识别代码中的函数,然后提取函数片段中的Opcode并保存。 例如,在x86下,按栈匹配“push ebp; mov ebp, esp; ...; ret”,如下代码段所示。
self.m32_pat = re.compile(b'\x55\x8b\xec[^\xc3]*\xc3')
# …………
all_functions = self.m32_pat.findall(binary)
for function in all_functions:
function_op = []
for _, _, mnemonic, _ in self.md32.disasm_lite(function, 0x0):
try:
function_op.append(self.opcode_dict[mnemonic])
except Exception:
break
else:
op_pattern.append(function_op)
原因是在挖掘样本中发现样本间存在大量共同的操作码特征,但在白样本中并不明显。 因此,可以统计匹配函数的个数、操作码类型的个数、平均值、方差等特征。
4.4.5 其他布尔信息
根据资格赛提供的启发,我们还收集了各类进程名称、数字货币名称、密码算法名称等信息,检测它们是否在给定的PE文件中。
我们收集了常见杀毒软件的进程名称[6],并将其作为杀毒软件挖矿软件检测行为的特征。
考虑到挖矿软件需要反分析、反调试来保证持久性,我们也采用了常用的调试器进程名作为挖矿软件反调试行为的特征,主要是作为我们日常使用的调试工具。
考虑到挖矿软件会进行反沙箱对抗,我们搭建了各种虚拟机软件环境,并对挖矿软件可能检测到的虚拟机环境特征进行了梳理。
由于在挖矿的过程中一定要有矿池,我们想到检测矿池的二级域名[7]作为挖矿软件的一个有效特性,所以写了一个爬虫脚本来爬取目前常用的矿池通过正则匹配的域名。 超过 300 项。
4.5 函数名(CG图)
借鉴一篇论文[8]的思路,处理流程如下:
IDA Pro提取函数调用生成GDL(图形描述语言)文件
GDL文件包含函数名(节点)和调用关系(边),比如下面的代码段
这样函数调用的次数可以排序为一种序列信息用于训练
graph: {
title: "Building graph"
IDA palette
....
colorentry 71: 255 255 0
colorentry 72: 0 0 0
colorentry 73: 0 0 0
colorentry 74: 0 0 0
colorentry 75: 0 255 255
colorentry 76: 192 192 192
// ....
node: { title: "165" label: "__aulldiv" color: 75 textcolor: 73 bordercolor: black }
node: { title: "166" label: "__aulldvrm" color: 75 textcolor: 73 bordercolor: black }
node: { title: "167" label: "__aullshr" color: 75 textcolor: 73 bordercolor: black }
// ....
node 169
edge: { sourcename: "169" targetname: "135" }
edge: { sourcename: "169" targetname: "136" }
edge: { sourcename: "169" targetname: "170" }
edge: { sourcename: "169" targetname: "171" }
....
}
初赛时效果不错,复赛因为IDA Pro耗时太长而放弃。
4.6 半决赛模型融合
在这方面,我们的团队成员经验较少,可能的模型和融合方法还有改进的空间。 欢迎广大观众交流学习。
5 结果与改进 5.1 复赛预测结果
评分前,主办方提供了1k个测试样本。 我们使用这 1k 个样本进行检查和测试。 最终耗时约1分20秒,得分95.52分。
因此,预估1w个样本用于打分需要20分钟左右比特币源码分析,扣除0.2分后,已经非常接近最终的95.38,证明了我们方法的泛化能力和稳定性。
5.2 改进方向
6 后记 团队所在的信息产业研究院六室威胁情报与威胁发现团队主要分析网络空间的典型威胁数据,如在线流量、登陆样本(负载)、安全日志、威胁情报等,研究威胁情报智能处理和对抗性恶意代码分析、可疑网络/终端行为检测与挖掘的技术与系统,培养具有高级威胁分析能力的人才。 同时,团队还建设运营了国家网络空间威胁情报共享开放平台CNTIC(公众号cntic2017),开发了大型恶意代码智能分析平台iMAS和网络恶意通信检测系统,已应用于国家有关部门和地区。 在实际工作中。 欢迎有识之士(学生或员工)加入,联系jiangzhengwei#iie.ac.cn。 7 参考挖矿软件常用例程
基于深度神经网络的恶意软件检测使用二维二进制程序特征
EMBER:用于训练静态 PE 恶意软件机器学习模型的开放数据集
Yara-规则/规则
Neo23x0/yarGen
布朗飞 / findAV
矿池实时监控工具
DeepCG:通过调用图的深度学习对变形恶意软件进行分类