提取字符串方法在恶意软件分析中的应用

luochicun Web安全 2019年9月4日发布
Favorite收藏

导语:目前逆向工程师、安全分析人员和事件响应人员在分析恶意软件二进制文件时,已经拥有了大量成熟的工具。

目前逆向工程师、安全分析人员和事件响应人员在分析恶意软件二进制文件时,已经拥有了大量成熟的工具。在进行恶意软件分析时,为了逐步收集有关二进制文件功能的线索,设计对应的检测方法,并确定最终的环境措施,他们会相继应用这些工具。最常用的初始步骤便是通过字符串程序检查它的可打印字符。如果二进制文件执行诸如打印错误消息、连接到URL、创建注册表项或将文件复制到特定位置等操作,那么它通常会包含一些有助于未来分析的字符串。

注:字符串程序在NT和Win2K上工作时,意味着可执行文件和目标文件会多次嵌入UNICODE字符串,使用标准ASCII字符串或grep程序无法轻松查看。字符串只扫描你传递的文件,以获取默认长度为3或更多UNICODE(或ASCII)字符的UNICODE(或ASCII)字符串。 请注意,该方法也适用于Windows 95。

手动过滤掉这些相关字符串可能非常耗时且容易出错,尤其是考虑到以下的3种情况:

1.相关字符串出现的频率比不相关字符串出现的频率少得多;

2.较大的二进制文件可以输出数万个单独的字符串;

3.对于“相关”的定义,在不同的分析师之间可能存在显著差异;

在执行恶意软件分析时,调查人员绝不想错过任何一个重要的线索,有了这些线索,不但可以减少分析时所用的时间,而且还能得出完整和正确的分析结论。在这篇文章中,我们将展示FireEye Data Science (FDS)和FireEye Labs Reverse Engineering (FLARE)团队最近合作的成果——如何使用提取字符串方法来简化分析过程。

关键过程

1.在恶意软件上运行字符串程序会不可避免地产生与重要字符串混淆的字符串,而这些字符串只有在对整个输出结果进行筛选和筛查之后才能被发现。而本文介绍的新机器学习模型可以根据字符串与恶意软件分析的相关性自动对字符串进行排序,从而大大加快这一筛选过程。

2.了解哪些字符串是相关的,通常需要经验丰富的分析人员,但利用提取字符串方法可以让这个过程变得相当简单;

3. 本文介绍的新机器学习模型可以优先考虑各个恶意软件样本的字符串输出,这些样本是依据FireEye逆向工程师7年以来编写的相关字符串数据集。

字符串程序的工作原理

字符串程序返回的每个字符串都是由3个或更多字符组成的序列表示的,以null结束符结尾,与周围的上下文和文件格式无关。这意味着这些字符串是不能被人们所阅读出来的,而计算机也只能将字符序列标识为字符串。例如,如果连续的字节0x31、0x33、0x33、0x37、0x00出现在二进制文件中,字符串可以将把这些连续的字节解释为“1337”。从这个示例中可以看到,这些ASCII字符并不会真实的表示该字符串本身。不过它们可以表示内存地址、CPU指令,甚至程序使用的数据。字符串程序会让分析人员过滤掉输出中出现的无关字符串。例如,从恶意软件分析师的角度来看,图1中列出的来自恶意二进制代码示例的字符串中,只有少数几个是和恶意行为相关的。

1.png

字符串输出中包含44个和样本相关的字符串,其中SHA-256值为eb84360ca4e33b8bb60df47ab5ce962501ef3420bc7aab90655fd507d2ffcedd。

根据降序相关性对字符串进行排序将使分析师的分析过程变得更加容易,这样,他们只需要将注意力集中在列表顶部最相关的字符串上,而忽略下面的所有内容。但是,完成字符串自动排序的任务并非易事。相关字符串的空间是非结构化和庞大的,而设计精心调整的规则来强有力地解释它们之间所有可能的变化,将是一个艰巨的任务。

对字符串输出进行排序

对字符串输出进行排序的任务可以在机器学习(ML)框架中进行,这个框架称为学习排序(learning to rank, LTR) 。LTR(Learning torank)学习排序是一种监督学习(SupervisedLearning)的排序方法。LTR已经被广泛应用到文本挖掘的很多领域,比如IR中排序返回的文档,推荐系统中的候选产品、用户排序,机器翻译中排序候选翻译结果等等。IR领域传统的排序方法一般通过构造相关度函数,然后按照相关度进行排序。影响相关度的因素很多,比如上面提到的tf,idf,dl等。有很多经典的模型来完成这一任务,比如VSM,Boolean model,概率模型等。对于传统的排序方法,很难融合多种信息,比如向量空间模型以tf*idf作为权重构建相关度函数,就很难利用其他信息了,并且如果模型中参数比较多,也会使得调参非常困难,而且很可能会出现过拟合现象。于是人们很自然的想到了用机器学习(Machine Learning)来解决这一问题,于是就有了Learning to rank。机器学习方法很容易融合多种特征,而且有成熟深厚的理论基础。

解决LTR问题的一种方法是使用 GBDT(Gradient Boosting Decision Tree),GBDT(Gradient Boosting Decision Tree) 又叫 MART(Multiple Additive Regression Tree),是一种迭代的决策树算法,该算法由多棵决策树组成,所有树的结论累加起来做最终答案。它在被提出之初就和SVM一起被认为是泛化能力(generalization)较强的算法。近些年更因为被用于搜索排序的机器学习模型而引起大家关注。GBDT中的树都是回归树,不是分类树,这点对理解GBDT相当重要(尽管GBDT调整后也可用于分类但不代表GBDT的树是分类树)。GBDT的核心就在于,每一棵树学的是之前所有树结论和的残差,这个残差就是一个加预测值后能得真实值的累加量。比如A的真实年龄是18岁,但第一棵树的预测年龄是12岁,差了6岁,即残差为6岁。那么在第二棵树里我们把A的年龄设为6岁去学习,如果第二棵树真的能把A分到6岁的叶子节点,那累加两棵树的结论就是A的真实年龄;如果第二棵树的结论是5岁,则A仍然存在1岁的残差,第三棵树里A的年龄就变成1岁,继续学。

GBDT通过梯度下降的方法,不断学习降低损失的决策树,最终将每棵预测树的加权和作为一个集合。具有LTR目标函数的GBDT可以学习类概率来计算每个字符串的预期相关性,然后可以用它对给定的字符串输出进行排序。

在图2的初始train()步骤中,超过25000个二进制文件通过字符串程序运行,最终生成包含超过1800万个字符串的训练数据。然后,每个训练样本对应于该输入文件上的字符串程序输出的ASCII和Unicode字符串的串联列表。为了训练模型,这些原始字符串被转换为包含自然语言处理特征(如香农熵和字符共现频率)的数字向量,以及特定于域的信号,如存在损害指示符(例如文件路径,IP地址,URL)等,格式字符串,导入和其他相关标志。

2.png

基于ML的LTR框架根据字符串与恶意软件分析的相关性对字符串进行排序,该图演示了机器学习建模过程的不同步骤:初始的train()步骤用实箭头和方框表示,随后的predict()和sort()步骤用虚线箭头和方框表示。

每个字符串转换后的特征向量都与一个非负整数标签相关联,该标签表示的是征向量与恶意软件之间的相关性。标签的范围从0到7不等,数字越大,表示相关性越强。为了生成这些标签,我们利用FLARE分析人员的方法来开启生成模式即可,并对生成的标签进行高级约束。虽然与手工标记的每个字符串相比,这种约束方法可能会产生噪声和误报信息,但它也提供了一种廉价且与模型无关的方法,可以将领域专业知识直接集成到GBDT模型中。

如图2所示,接下来在predict()步骤中,我们使用经过训练的GBDT模型来预测属于输入文件的字符串的排序,其实,这个输入文件原本不是训练数据的一部分,所以在这个示例查询中,我们使用图1所示的字符串输出。该模型将查询中的每个字符串的排序预测为浮点数,浮点数表示预期的相关性得分,在图2的最后一个sort()步骤中,字符串按这些得分依次降序排列。图3说明了这个结果预测是如何根据字符串与恶意软件分析的相关性对字符串进行排序的。

3.png

在图1和图2所示的查询中字符串的排序结果,将此处显示的字符串的相对顺序与其他相同的列表进行比较

图3中的预测和排序字符串排名显示了列表顶部的基于网络的指标,其次是注册表路径和条目。这些揭示了主机上潜在的C2服务器和恶意行为。由用户相关信息组成的后续输出更可能是良性的,但仍需要调查。四舍五入的列表是常见的字符串,如Windows API函数和PE构件,它们往往不会被恶意软件分析师所注意到。

定量评估

虽然看起来模型按照预期对上述字符串进行了排序,但我们希望采用一些定量方法来更全面地评估模型的性能。

这里,我们推荐NDCG评价指标,两个最受欢迎的排名指标是MAP和NDCG。MAP表示平均精度均值,NDCG表示归一化折损累积增益。两者之间的主要区别是,MAP认为是二元相关性,而NDCG允许以实数形式进行相关性打分,这种关系类似分类和回归的关系。NDCG其背后的思想却很简单。一个推荐系统返回一些项并形成一个列表,我们想要计算这个列表有多好。每一项都有一个相关的评分值,通常这些评分值是一个非负数。这就是gain(增益)。此外,对于这些没有用户反馈的项,我们通常设置其增益为0。

NDCG听起来很复杂,其实用几个字母来理解就可以了:

“G”代表增益,它对应于每个字符串相关性的大小;

“C”代表累加,是指每个字符串的相关性的累加增益或总和;

“D”代表贴现,它将每个字符串的预测相关性除以一个单调递增的函数,如其排序位置的对数,反映了将最相关的字符串排在我们预测的顶部的目标;

“N”代表归一化,归一化是一种无量纲处理手段,使物理系统数值的绝对值变成某种相对值关系。简化计算,缩小量值的有效办法。经过归一化的数据集是我们从历史恶意软件报告中包含的经过FLARE识别的相关字符串中获得的。由于不同字符串输出中的字符串数量差异很大,归一化使得比较样本之间的排序得分成为可能。

4.png

只需在每个二进制(灰色)上运行字符串程序,然后计算原始排序的得分,而不是根据训练过的GBDT模型(红色)预测的排序

实际上,我们在单个字符串输出中采用其排名索引的前k个字符串,其中k参数是根据恶意软件分析人员平均要处理或认为相关的字符串数量来选择的。本文我们设置k = 100,其中越相关的字符串越靠近顶部。

总结

在这篇文章中,我们介绍了一个ML模型,它可以根据字符串与恶意软件分析的相关性对字符串进行排序。测试结果说明,对字符串输出进行排序可以很准确且高效地分析出恶意软件中的潜在行为。

众所周知,恶意软件的开发者会花很大的力气隐藏有用的字符串,而这个模型有一个问题,就是无法识别被混淆的字符串。此时,就要借助像FireEye Labs Obfuscated Strings Solver (FLOSS) 这样的开源工具。FLOSS会自动检测,提取和解码Windows可移植可执行文件中的混淆字符串,另外它还会显示已编码、打包或手动构建在堆栈上的混淆字符串。本文介绍的学习模型可以很容易地对FLOSS的输出内容进行训练,以便对模糊的字符串进行排序。此外,由于它可以应用于任意字符串列表,所以还可以使用该模型对从活动内存转储和沙箱运行中提取的字符串进行排序。

本文翻译自:https://www.fireeye.com/blog/threat-research/2019/05/learning-to-rank-strings-output-for-speedier-malware-analysis.html 如若转载,请注明原文地址: https://www.4hou.com/web/18421.html
点赞 5
  • 分享至
取消

感谢您的支持,我会继续努力的!

扫码支持

打开微信扫一扫后点击右上角即可分享哟

发表评论