《HarmonyOS:领航者说》技术公开课来啦,大咖分享、实战解码,不容错过 了解详情
写点什么

NLP 技术也能帮助程序分析?

  • 2019-08-10
  • 本文字数:2554 字

    阅读完需:约 8 分钟

NLP技术也能帮助程序分析?

众所周知,在机器学习领域中,计算机视觉、自然语言处理和语音识别的技术已经发展的非常成熟,都已经有非常好的效果。同时,在系统安全领域,也有非常多的研究者,正在尝试使用非常大量的数据进行分析,以完成一些人类难以完成的挑战。


以程序分析为例,从源码,经过编译获得中间语言、汇编码,再到二进制,最终进行运行,是一个很复杂的过程,而研究者就希望反向从二进制获得更多和源码直接相关的信息,以达成自身的研究目的,这就是所谓的“逆向工程”。然而,在逆向工程中,本身就具有非常多的问题,例如,信息的缺失,信息的不对等,甚至人都无法判断的条件和选项,常常让研究者头疼不已。因此,我们就希望通过机器学习的方式进行更多信息的挖掘,以更为取巧的方式获得最终的结果。


二进制相似度是在程序分析中非常重要的一环,其应用范围非常广泛,如果知道相应的程序相似度,对于代码克隆检测、恶意程序检测都能起到良好的辅助,甚至决定性的作用。然而程序在进行商用的过程中,为了防止源码被逆向工程轻易获取到,混淆和信息的缺失是非常常见的。因此在 19 年 S&P(CCF-A)上,出现了一篇很有意思的工作,其利用了 NLP 领域中 PV-DM 的算法,巧妙的进行了迁移,解决了二进制相似度比较中,混淆和信息缺失的问题。



如上图所示,同一段源码通过不同的编译选项,可以获得不同结构的二进制形态。从左至右分别是从同一段源码,以 gcc O0、gcc O3 编译,以及 LLVM 混淆控制流和 LLVM 伪控制流编译的结果。可以看到,这四组二进制的编译结果完全不同,使得传统或现有的方法难以处理,十分棘手。


因此需要有比较好的方法,既能够将结构化信息保留,又能够将语义信息提取出来。该文通过 T-SNE 的聚类方法,对于所有的操作指令和操作数进行了可视化。



从图中可以看到,基本上,只要是属于同一类的操作数或操作符“距离”都是比较接近的,也就应证了其语义特征是比较接近的。通过比较传统的方法,比如 wrod2vec,已经可以比较好的解决这一类的问题。


但是除了解决语义的问题,仍有二进制结构性的问题亟待解决,如何将混淆和非混淆的二进制进行相似度的对比,是一个很难的问题。值得庆幸的是,NLP 领域已经有类似问题的解决方案了,就是 PV-DM。其核心思想就是多存储一个和段落相关的字段,以获得结构化的信息。如下图所示,以“The cat sat on a mat”这句话为例,抽取“sat”这个词的对应向量,就是通过结合段落 ID 和前两个单词以及后两个单词的向量维度取平均值,最后通过 sigmoid 的函数来获取最终的向量计算结果。



虽然,在英文的自然语言领域,其文本和汇编语言非常的相近,但是也不能直接套用 PV-DM 用于汇编语言的处理,但是有很多可以借鉴的地方,是可以帮助这样的问题进行建模的。



以图中的这段示例代码为例,我们的目标是对“push rbx”这段代码进行向量化,借鉴 PV-DM 算法的思想,我们通过对于上下文的获取,即“mov rbp,rsp”和“sub rsp,138h”的向量,对应获得两段向量,并分别对它们这段汇编语句中的两个操作数对应的向量取平均值,再拼接上操作符对应的向量。分别完成对于这两段汇编语句向量化操作之后,再通过对于核心语句的映射关系之后,对这三段汇编语句取向量平均值,再通过 sigmoid 函数,就可以获得最终的结果,以此获得最终的向量表示。



众所周知的是,一段相同的源码经过 O2 和 O3 的编译,其二进制的表现可能比较类似,是因为 O3 比 O2 多出的编译选项,并没有很多,且条件相对苛刻一些。但是对于经过 O0 和 O3 编译的源码进行比较,那相似度人眼都难以分辨,不仅仅是表现在整体的大小,同时也表现在 basicblock 的个数,以及内在的逻辑。


从图中可以看到,之前的工作,在 O2 和 O3 的比较上,其实还是有比较可以接受的对比结果,但是在 O0 和 O3 上,其结果几乎难以接受。从这篇工作的结果可以看到,在各个优化等级的表现下,其结果都是令人可接受的。这也可以看得出来,这种基于 PV-DM 的新型表示方式,还是有非常有效的结果,可以同时体现其语义和结构化信息的。



更令人惊喜的是,当经过 LLVM 等工具的混淆之后,其相似度的检出率还是比较高,且能与其竞争的方法仅有原始的 PV-DM 的方法了,可见其对于原有结构化信息的还原程度之高。


相比之下,对于商用化软件经常存在混淆的情况,然而优化等级是可以进行预先判断的。因此我们可以看到,对于这样的二进制相似度对比问题,我们更应该把基于混淆的问题进行解决,这样的问题是更普遍存在的。当我们能对进行过混淆的二进制进行相似度对比的时候,我们就有更多的场景可以应用了。例如本文中,还对公开的漏洞数据库进行了检索对比,也有不错的发现。对于不同编译器、不同优化等级、不同工程中的 heartbleed 漏洞均有不同程度的检出,也给之后的漏洞检测工作带来了新的启发。


这篇文章其实更多的是利用 NLP 领域中 PV-DM 的方法给予我们了启发,其巧妙的解决了如何将语义和结构化信息纳入至二进制的表示中来。然而,现有的很多工作,想要将机器学习的方法引入至程序分析领域,最令人头痛的一点是如何将二进制表示成合适的向量,同时又包含需要挖掘的相关语义。现有较多的方法是将程序处理成定长的序列片段,同时将这些片段输入至 word2vec 中,将相关的信息以上下文概率的形式向量输出以表达结果。不过,笔者认为,如何将二进制更好的表示,其更大的一点是用合适的数据做合适的事情,将强相关的内容纳入至模型当中,以获得最紧密的映射关系,才是最为合适的。


相关文献:

[1] Ding S H H, Fung B C M, Charland P. Asm2vec: Boosting static representation robustness for binary clone search against code obfuscation and compiler optimization[C]//Asm2Vec: Boosting Static Representation Robustness for Binary Clone Search against Code Obfuscation and Compiler Optimization. IEEE, 2019: 0.

[2] Hu Y, Wang H, Zhang Y, et al. A Semantics-Based Hybrid Approach on Binary Code Similarity Comparison[J]. IEEE Transactions on Software Engineering, 2019.

[3] Alon U, Levy O, Yahav E. code2seq: Generating sequences from structured representations of code[J]. arXiv preprint arXiv:1808.01400, 2018.


本文转载自公众号 SIGAI(ID:SIGAICN)


原文链接


https://mp.weixin.qq.com/s/b4_OdxgxsK8CCU5b8qCEfw


2019-08-10 00:004336

评论

发布
暂无评论
发现更多内容

第六周作业

cqyanbo

【优化技术专题】「系统性能调优实战」终极关注应用系统性能调优及原理剖析(下册)

码界西柚

性能调优 Java 分布式 优化逻辑 技术职场 1月日更

ReactNative进阶(四十六):移动端实现字体自适应

No Silver Bullet

自适应 React Native 2月月更

Java NIO为何导致堆外内存OOM了?

JavaEdge

2月月更

从 TDD 到测试策略

Teobler

前端 TDD 单元测试 测试策略 测试金字塔

Linux之killall命令

入门小站

Linux

TTF、OTF、WOFF 和 WOFF2 的相关概念

编程三昧

CSS css3 1月月更

JAVA新特性的入场券-函数式接口

蜜糖的代码注释

Java 后端 Java高级特性

Kubectl插件开发及开源发布分享| 社区征文

雪雷

golang 云原生 cobra kubectl plugin 新春征文

行业研究流程及资源总结

轻口味

android AI 1月月更

浅谈 Java 集合框架

宇宙之一粟

java集合总结 1月月更

树概念总结

en

数据结构

模块六作业-拆分电商系统为微服务

CH

#架构实战营 「架构实战营」

云原生的前世今生(一)

劼哥stone

云原生

我的2021

劼哥stone

年终总结

2021年度总结-拥抱变化

wood

300天创作

ReactNative进阶(四十三):Mac 通过 .bash_profile 文件配置环境变量

No Silver Bullet

Mac 2月月更 .bash_profile

从IaC到IaD

俞凡

云计算 基础设施即代码

在线格式时间计算时间差

入门小站

工具

Windows 和 Linux 上安装 TTF 字体的方法

编程三昧

HTML5, CSS3 1月月更

WebRTC 流媒体常见开源方案综述 | 社区征文

liuzhen007

音视频 新春征文 2月月更

Mybatis技术专题之MybatisPlus自带强大功能之多租户插件实现原理和实战分析

码界西柚

多租户 MyBatisPlus 2月日更 多租户技术

特征工程:归一化与标准化

强劲九

Python 人工智能 神经网络 机器学习 scikit-learn

简单入门计算机网络

宇宙之一粟

计算机网络 2月月更

ReactNative进阶(四十四):Mobile App 适配性优化

No Silver Bullet

React Native 适配 1月月更

2021,平(jia)凡(ban)的一年

xiezhr

年终总结 2021 2021年终总结

Java9特性-响应式流(Reactive Stream)

蜜糖的代码注释

Java 响应式 响应式编程 2月月更

Linux之kill命令

入门小站

Linux

Kubernetes初学者指南

俞凡

架构 Kubernetes 云原生 2月月更

我所理解的云原生(二)

劼哥stone

云原生

Promise 基本方法的简单实现

编程三昧

JavaScript Promise 2月月更

NLP技术也能帮助程序分析?_语言 & 开发_陈立庚_InfoQ精选文章