写点什么

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:004421

评论

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

关于JVM的内存模型

Java学术趴

7月月更

新型LaaS协议Elephant Swap给ePLATO提供可持续溢价空间

股市老人

Microsoft SQL服务器被黑客入侵 带宽被窃取

郑州埃文科技

microsoft 数据安全 代理IP

备战金九银十!2022面试必刷大厂架构面试真题汇总+阿里七面面经+架构师简历模板分享

Java永远的神

Java 程序员 面试 程序人生 简历模板

新一代开源免费的终端工具,太酷了

程序知音

手慢无!阿里亿级流量高并发系统设计核心原理全彩笔记现实开源

Java全栈架构师

Java 面试 程序人生 分布式锁 架构师

SpringBoot实现异步任务Async及异步任务实现发送邮件

宁在春

springboot 异步 7月月更 邮件发送

Bootstrap 模态框Modal【前端Bootstrap框架】

恒山其若陋兮

7月月更

你必须知道的一些JVM技术点

Java学术趴

7月月更

EA中的业务对象和业务实体你分得清吗?

涛哥 数字产品和业务架构

企业架构 TOGAF Archimate

基于MySQL数据库,Redis缓存,MQ消息中间件,ES搜索引擎的高可用方案解析

Java永远的神

Java 数据库 redis ES 消息中间件

C# 之 $ – 字符串内插

陈言必行

7月月更

区块链,得这样练

CECBC

元宇宙改变人类工作模式的四种方式

CECBC

Discourse 自定义头部链接(Custom Header Links)

HoneyMoose

十月阿里社招Java面试题:数据库+分布式+高并发+JVM+Spring

程序知音

Java 阿里巴巴 程序员面试 后端技术 八股文

《SpringBoot 手册》:国际化组件 MessageSource

看山

springboot MessageSource

干货来袭!2022阿里巴巴全新出品Spring全家桶全栈笔记(终极版)奉上

程序员小毕

Java spring 程序员 面试 微服务

桌面软件开发框架大赏

声网

软件开发

鸿湖万联扬帆富设备开发板正式合入OpenHarmony主干

科技汇

横向对比5种常用的注册中心,无论是用于面试还是技术选型,都非常有帮助

程序员小毕

Java 程序员 面试 微服务 后端

elasticsearch实战三部曲之二:文档操作

程序员欣宸

Java Elastic Search 7月月更

区块链的诞生是为了解决——“去中心化的协同”这个问题

CECBC

面试官:Redis中的布隆过滤器与布谷鸟过滤器,你了解多少?

Java全栈架构师

Java redis 程序员 面试 后端

Prometheus 启动时被禁止的功能特性

耳东@Erdong

Prometheus Feature 7月月更

北京突然宣布,元宇宙重大消息

CECBC

什么是数字货币、数字金融 和区块链?

CECBC

分布式限流 redission RRateLimiter 的使用及原理

王小凡

Java redis 分布式 SpringCloud 框架

历时两月,终拿字节跳动offer,算法面试题分享「带答案」

程序知音

Java 字节跳动 算法 程序员面试 八股文

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