DataCon2020 僵尸网络追踪第三题writeup

DataCon2020 僵尸网络追踪第三题writeup

作者:cdxy, LittleHann from 阿里云安全

DataCon2020 今年由于精力有限仅做了botnet(僵尸网络)方向,该方向共四题。本文为第三题的writeup。此题考察能力赛题探索全面,汇集了样本逆向、样本分析、算法特征工程、聚类分析、数据分析等知识点。

以下为比赛时提交的writeup,分享出来。

目录

  • 特征工程设计
  • 统计特征
  • 控制流图(CFG)
  • 局部感知野特征
  • 特征权重置信度分配
  • 家族社区聚合
  • 相似度搜索
  • K近邻搜索 - 非家族社区的同源样本相似搜索
  • LSH局部敏感哈希相似性搜索 - 家族社区间样本一一配对搜索
  • 冲突消岐
  • 其他的进行中思路:基于符号执行的相似性搜索
  • 其他的进行中思路:基于sequence to sequence的同源样本映射

赛题探索

任务目标,识别同源代码在mips和x86架构下一一配对关系。
从样本分析结果来看,基础源代码为mirai bot部分。同一架构下的源代码经过了不同程度的修改,基于对样本分块后的结果进行特征工程向量化后,对结果进行聚类统计,再结合ida逆向结果进行确认,大致可以猜测该赛题的样本集由以下几种同源家族复用形态组成:

  1. 功能模块同源复用
  2. 函数复用
  3. 函数逻辑结构复用

从数据的角度来看,赛题样本可以分为3大块。



因此,我们将任务分为几子任务分别处理,设计系统的时候也进行了子系统单独设计,最后再对各个系统的特征层进行融合。
这道题是一个二进制样本分析题目,同时家族同源分析又是一个和数据科学交叉的领域,因此我们采用了样本分析+数据分析的融合思路进行解题。


特征工程设计

特征提取是代码同源分析的基础,具有同源性的恶意代码是通过它们的共有特征与其他代码区分开来的。所提取的特征既要反映出恶意代码的本质和具有同源性恶意代码之间的相似性,又要满足提取的有效性。
总体上,特征工程分成了以下几个部分:

  1. 统计特征:统计特征从整体轮廓上描述了一个样本的骨架结构
  2. 文件大小(filesize):平均来看,mips架构比x86架构下的文件,filesize的膨胀比是1.2~1.9之间,浮动方差在0.3左右。
  3. 函数调用次数(function count):函数调用次数可以从整体上描绘出该样本的功能丰富度
  4. 函数形参个数
  5. 函数声明个数
  6. 常量声明个数
  7. 数组声明个数
  8. 基本块数量
  9. 序列特征
  10. 指令
  11. 操作码
  12. 字节码
  13. API代码序列等
  14. 基本块特征
  15. bytes hash matching (4 instructions minimum)
  16. call reference matching
  17. string reference matching
  18. 控制流图(CFG):CFG图以单个代码语句为原子单位, 细粒度地表示了程序的执行流程
  19. PDG图:PDG图是一种结合数据流和控制流分析的代码结构, 展现了敏感操作的依赖性, 包含程序语义信息
  20. API调用图:API调用图是由图中敏感API, 根据前后调用关系建立的网络结构图
  21. 局部感知野特征
  22. 静态常量
  23. 数组定义
  24. offset偏移


由于比赛时间仓促,这里简要说明几种主要的特征:

统计特征




控制流图(CFG)




值得注意的是,CFG特征的区分点主要在于模块级、函数级的差异性,对局部微小的同源修改并不敏感。赛题中也不乏这类修改范围很小的样本(例如只修改了中控上线域名),对这种情况,需要结合其他维度的特征进行区分。

局部感知野特征

局部感知野特征在图像检索领域特别常用,在图像识别中,人脑定位和关联图片,往往是依据某些非常局部的细节特征来完成的。
对于二进制样本同源分析来说,也存在同样的问题场景,因此可以借鉴同样的思考。bot僵尸网络样本中,往往存在很多配置信息,例如CnC上线地址、扫描端口、扫描payload指令等等,不同的家族变种之间,有时候区别就仅仅在于这些细节信息。
以一组x86-mips样本配对为例:



这组配对样本的区别,就仅仅在于某个常量立即数。
以另一组x86-mips样本配对为例:



这组配对样本的区别在于,同家族的只是改了几个变量导致地址偏移不同。但是地址小的在另一个架构下地址也肯定小,根据特征值和地址偏移变化,地址相同的由上面两张图可以找到各自的配对。


特征权重置信度分配

在特征工程阶段,结合样本分析领域经验,我们提取了大概十几维的特征,但是不同的特征对同源匹配的贡献度是不同的,在进行后续的数据分析之前,我们对各个特征的权重进行了一个预分配。

  1. Weight ~25%:统计特征
  2. Weight ~25%:序列特征
  3. Weight ~20%:基本块特征
  4. Weight ~10%:CFG特征
  5. Weight ~5%:API调用图特征
  6. Weight ~15%:局部感知野特征


家族社区聚合

通过样本数据分析,我们发现赛题提供的样本中,存在大量的社区内聚现象,大概占50%左右的比例。在这些社区内部,样本间的修改幅度相对社区外要小,而在家族社区之外,样本间的修改幅度相对较大。
结合样本分析,这应该是类似ddg家族变种的那种场景,


ddg不同家族变种的区别,有时候就仅仅是一些上线地址、蠕虫扫描端口、漏洞攻击载荷的区分。
因此,我们将赛提提供的样本分为了社区集和非社区集,进行后续相似性搜索的时候,对于社区集,以社区为单位进行跨架构的相似性搜索,对于非社区集,则直接进行常规相似性搜索,从而显著提高的相似性搜索的精度和召回率。
使用DBSCAN算法对样本向量数据进行无监督聚类,得到了大致20个家族社区。





家族社区聚类完毕后,对样本的预处理阶段就基本结束了,接下来进入到相似度搜索阶段。


相似度搜索

完成了二进制样本的特征工程向量化之后,我们就将赛题的目标转化成了一个集合间相似性搜索问题,两个集合分别是x86和mips的512个样本。
针对特征工程中的两种不同特征向量,我们采取了两种相似度搜索方法,分别是:

  1. K近邻搜索
  2. LSH局部敏感哈希相似性搜索

K近邻搜索 - 非家族社区的同源样本相似搜索

对于非家族社区的样本点,我们使用了K近邻搜索算法,其算法实例图如下,


逐轮匹配跨Arch间最近邻配对(一次一个mips和x86)。每次配对成功后,即将被配对的样本点从待搜索集合中删除,即不放回近邻搜索。
通过这种方法,我们找出了大概30%的配对。

LSH局部敏感哈希相似性搜索 - 家族社区间样本一一配对搜索

对于赛题样本集中存在的家族社区样本,由于其在统计特征、CFG特征、字节码序列上比较接近,因此我们提高了局部感知野特征的权重,即重点关注样本中存在的一些静态常量、数组定义、函数参数立即数等。
为了提高泛化效果,我们用simhash(一种局部敏感文本哈希)对提取出的局部特征进行了模糊化处理,然后再在社区家族间进行两两一一配对。


为了提高工程化和通用泛化能力,我们设计了一套自动差分提取系统。

比如下面这对mips和x86的,



通过自动差分生成的diff结果为:

  • B9 F4 19 7C
  • 2D 5F A8 5D



通过这种方法,我们找出了大概60%的配对。


冲突消岐

在数据分析相似搜索和分类任务中,冲突问题是一个很常见的问题,它是指两个数据向量之间的空间距离上相对比较接近,并不具备差异显著性。


我们完成所有相似度搜索之后,发现还留下大概10%的样本属于这种“灰色地带”情况,从数据科学的角度来看,出现这种问题的本质原因是特征工程部分没有提取到更深层次的特征,因为理论上只有特征区分度高,所有样本都是线性可分的。
但是因为比赛时间限制,因此我们采取了人工分析的方法,对存在冲突的mips-x86配对进行冲突消岐,从而确定了最终的10%的配对答案。


其他的进行中思路:基于符号执行的相似性搜索

通过求解不同输入的输出结果实现无源代码跨平台二进制比对。
大致方法是:

  • 汇编指令转换成中间表示
  • 使用符号执行求解基本块输入/输出值
  • 使用MinHash作为LSH求解距离
  • 基于CFG(控制流图)匹配实现函数比对



本质上,x86和mips样本都是由c代码编译而成,只是体系结构不同,编译器针对不同的cpu架构,采取了不同的指令集,所以理论上,将汇编指令翻译回中间态语言,基于中间态语言进行相似度搜索,是一个比较优雅的做法。


其他的进行中思路:基于sequence to sequence的同源样本映射

sequence to sequence model是NLP机器语言翻译中比较常用的一类模型,常被用在跨语言文本翻译中。在这题中,我们将x86和mips ASM反汇编代码看做是输入和输出文本,进行有监督序列翻译。
下图是一个英语和法语翻译的示例图:




在比赛进行中,我们原本的计划是:对每一个二进制样本,我们通过IDA插件生成了ASM反汇编代码。然后利用已经确定的答案,作为有监督训练的样本,逐步从无监督学习,过渡到有监督学习阶段。
但是实际中遇到一个问题,赛题提供的样本量太少,导致无法进行深度学习训练。
因此我们自己模仿赛方的方式,自己对mirai进行了自动化修改,然后分别在x86和mips上进行编译,用这种方式生成了1w对样本。

发布于 08-17

文章被以下专栏收录