腾讯云代金券

机器学习方法在二进制分析中的应用与思考-腾讯云代金券优惠券

1. 二进制分析的现状 众所周知,程序语言从高层到底层约莫是源码,中间代码(IR),汇编码到二进制。在这过程中,一方面是为了解决跨平台所导致的问题,另一方面也是为了节省内存,编译器做了很多层次的优化。由此可见,从高层到低层的代码,信息缺失是非常

1. 二进制分析的现状

众所周知,程序语言从高层到底层约莫是源码,中间代码(IR),汇编码到二进制。在这过程中,一方面是为了解决跨平台所导致的问题,另一方面也是为了节省内存,编译器做了很多层次的优化。由此可见,从高层到低层的代码,信息缺失是非常严重的,从而导致从低层表示到高层代码的逆向转换非常困难。

然而,二进制分析是非常需要这部分信息的,例如,代码加强(code hardening),漏洞挖掘(bug finding),克隆检测(clone detection),打补丁(patching)等。在如此大的现实需求下,对于二进制的分析是亟待突破的。

,我们可以看到,连续两条“push eax”的指令,在人眼看来都是一样的内容,没有外部信息,其实没有办法判断寄存器中的存储的数据是什么类型,更多的信息就更加无法判断了。但是从这段代码的源码层面来进行判断我们可以看到,其实第一条压栈操作的数据是bool型的变量,第二条压栈操作的数据是int型的变量。诚然,这两个变量所涉及的变量都是使用的eax寄存器,但是即使能判断出来其变量类型,仍然没有办法判断出来其变量的对应关系。

同样看到下面两图中的表示,被红框框出来的内容其实并不能直接区分其对应操作变量的类型,甚至可能会以为是同一个变量。但是如左图所示,其第一个变量对应的是bool型,第二个是int型(opt);而右图所示的更为复杂,其中有一个是针对结构体的变量入口。肉眼辅以经验都难以判断的结果,是在是让人望而却步。

对于目前学术界的情况而言,我们可以看到,对于二进制的分析其实非常的急需,然而对于二进制分析的技术其实目前大多数都是基于规则,稍好的情况就是基于动态分析抑或是静态分析得到一些额外的信息,从而辅助基于规则的方法来进行最终的判断。

当今,机器学习的发展如火如荼,在浩如烟海的二进制的世界里,是否能借助机器学习的力量,来进行一些相关信息的挖掘呢?答案似乎是肯定的。

2. 机器学习在二进制分析中的应用

众所周知,机器学习在自然语言处理(natural language processing),语音识别(speech recognition)和计算机视觉(computer vision)这三个领域已经做的非常成熟了,很多相关公司都已经取得了非常好的成果,并且其产品很多都已经有了很好的应用场景。例如我们生活中的“刷脸”进出宿舍、小区,又例如科大讯飞的语音转文字,又亦或是我们总是可以用来“偷懒”的在线翻译软件等,这些都给我们带来了莫大的便利。

因此我们就在考虑,这些技术的成功转化,很大程度上是因为数据量的激增,从而使得其有如此好的应用场景,那么在二进制如此大的数据量下,我们是否有机会可以对其使用机器学习的方法进行更深层次的挖掘呢?

目前已经有不少研究小组,对这样的方式进行了探究,并且也做出了很多不错的成果。例如,在2015年USENIX Security(CCF-A)的会议上,Dawn Song研究小组的一篇工作非常吸引人们的眼球,他们用三层的BLSTM网络实现了对二进制函数的高精度识别。

这篇工作的启发点,我们可以看到,对于一段二进制代码,不论是富有经验的从业者也好,还是具有大量科研经验的科研学者也好,他们都没有办法精准、快速的判断出来,一个函数的开头,到底是在一段代码的哪里。一方面,二进制(即使能转换到汇编)晦涩难懂,且高度抽象,其中蕴含的信息比较少,也是人类相对难以理解的;另一方面,其语义信息已经大量缺失,与高级语言能一一对应的只有其功能性。因此,我们可以看到,对于二进制分析来说,基于规则是难以实现的。

文中,提出使用三层的BLSTM,一方面是使用较高的复杂度去拟合实际二进制所表达的内容,另一方面,使用了BLSTM的特性,去关联上下文的内容,从而使得模型,能够从大量的数据中获得上下文对应的函数起始关系。

最后,我们也可以看到,在文中,也提到了其工作,比14年的工作ByteWeight的效果更好,且在两个平台上都达到了不错的效果。与前人工作不同的是,其不仅识别了函数的开头,还识别了函数的结尾部分,因此工作会更加全面,且更有实际效用。

机器学习对于二进制的帮助,仅限于此吗?其实是远远不止的。近几年,大家对于二进制的信息挖掘是更加火热的。二进制对于人来说难以阅读的一大原因是缺少语义信息,那这部分信息很大程度上都是通过变量的类型来提供的。这对应到自然语言中,我们可以理解为一个句子中的单词的词性。一旦我们能了解其中的词性关系,我们一定能取得更好的分析进展。18年的一篇工作,则以很直观且巧妙的方法来给我们打开了二进制分析的思路。具体的流程:

如果我们能定位到变量之后,对变量相关的操作进行直观分类,不就能对变量进行分类了吗?文中通过VSA(value set analysis)对变量的相关操作进行规约,并对其操作内容进行统计(统计方法),将对应的统计结果转换成向量的方式来表示一个样例,之后通过训练SVM分类器来达到最终的目的。

预测的时候,亦是类似。对未知变量的操作进行规约,并作出统计之后,输入模型进行最终判别的输出,得到对应变量的类型。

可以看到,对具体的“特征”挑选则是重中之重。,我们可以看到,文中对于特征的选择就是直观的不同操作的类型的统计,其中值得注意的是,在处理之前的“mov,eax”和“mov,ecx”被合成一个“mov reg32”了,同时对于变量的长度也有了初步的判断,是“32”的长度。通过这样的处理,一个变量对应的对应表示形式,就成了一个向量了。为使得每一个样本的长度都是相同的,文中选取了“最重要”(TF-IDF)的100维特征。

然而,由于方法和特征抽取的局限性,其并没有获得很好的效果,只是有了初步的结论,给大家有所思考。不过值得庆幸的是,他们的结果比IDA-Pro的效果还是好了不少的。

同年,在CCS(CCF-A)会议上出现一篇名为“Debin”的工作,其目的为挖掘二进制语义信息,并用于检测恶意代码的工作做的也很漂亮。为了使得结果有更好的提高,文中提取了更多的额外信息,并构建了相应的图,使用了CRF(Conditional Random Field)的方法来进行预测。

意料之中,其跨平台的结果,取得了很好的结果(如上图)。

并且在文中也对比了之前的实验结果,不仅仅是做到了更多的类型种类,并且还对变量的名字(疑似的名字)进行了预测,从而进行恶意代码的检测。

3. 机器学习与二进制分析的关系思考

如前文提到的一样,机器学习目前应用场景非常广泛,但是能实际切合的场景其实并不多。这就是为什么现在有这么多的学科希望能引入“AI”,但是却没有太多进展的原因。在我看来,二进制分析为何能引入机器学习有以下几个原因:

一,二进制代码数量巨大,有大量的数据基础,适用机器学习进行拟合;

二,其应用场景人难以推理,但是其间其实蕴含了很多的额外信息是我们研究所需要的;

三,规则难以穷尽。

因此,在我看来,只要对问题进行适当的建模,并且能有比较适合的数据集做支撑和验证,引入机器学习来进行二进制分析是非常可行的。

参考文献:

[1] Shin E C R, Song D, Moazzezi R. Recognizing functions in binaries with neural networks[C]//24th {USENIX} Security Symposium ({USENIX} Security 15). 2015: 611-626.

[2] Xu Z, Wen C, Qin S. Type Learning for Binaries and Its Applications[J]. IEEE Transactions on Reliability, 2018.

[3] He J, Ivanov P, Tsankov P, et al. Debin: Predicting debug information in stripped binaries[C]//Proceedings of the 2018 ACM SIGSAC Conference on Computer and Communications Security. ACM, 2018: 1667-1680.



上一篇:干货|最新版 Spring Boot2.1.5 教程+案例合集-腾讯云代金券优惠 下一篇:CSS学习笔记-腾讯云代金券优惠券