安全矩阵

 找回密码
 立即注册
搜索
查看: 2798|回复: 0

CryptoHunt: 恶意软件加密运算识别工具

[复制链接]

855

主题

862

帖子

2940

积分

金牌会员

Rank: 6Rank: 6

积分
2940
发表于 2021-12-31 14:14:04 | 显示全部楼层 |阅读模式
原文链接:CryptoHunt: 恶意软件加密运算识别工具

今天分享的论文标题为Cryptographic Function Detection in Obfuscated Binaries via Bit-precise Symbolic Loop Mapping,来自宾夕法尼亚州立大学Dinghao Wu老师课题组的Dongpeng Xu,发表于S&P 17。
Background恶意软件常用加密功能来隐藏恶意行为,伪装恶意负载,勒索软件还会对受害者计算机文件进行加密以勒索赎金,因此检测二进制文件中的加密函数是一种有效的检测恶意软件的方法。本文的出发点基于这一观察: 加密运算在指令流中往往表现为大量的循环体,通过准确地识别这类循环体就能找到恶意软件中的加密运算,从而进一步分析恶意负载。
加密计算的分析方法总体来说可以分为静态和动态两种,但静态分析易受二进制混淆技术的干扰。相比之下动态分析抗混淆能力更强,而且可以检测一些运行时可见的特征。然而当前的动态分析工具存在两个局限性:1. 不够通用,无法检测所有常见加密计算;2. 由于需要从内存中恢复输入输出参数,它们仍然受到如数据编码混淆等技术的干扰。
Introduction本文提出一种新的动态加密函数检测框架,称为CryptoHunt github地址[1]。其检测步骤如下图所示:

1.从标准密码库中找到核心加密逻辑,用布尔表达式对其语义进行建模,得到一系列参考公式,这些公式要保证紧凑性和抽象性。2.生成二进制文件执行的trace流,这一部分使用Intel Pin工具实现,这是由Intel开发的额动态二进制检测框架。其中需要记录的信息有:•每条指令的内存地址•描述其操作的指令名称•指令源操作数和目标操作数3.循环体识别。首先,本文给循环体下了一个定义:循环是满足以下要求之一的指令序列——指令序列的操作码至少重复一次,指令序列以有条件或无条件跳转指令结束,跳转到序列开头,其模式如下图所示。检测算法是基于Calvet算法的优化版,对于第一类循环体,需要用一个栈来维护其中的函数调用 和返回,以过滤嵌套函数调用的干扰;对于第二类循环,本文会识别跳转地址在已执行过的地址范围中的跳转指令,计算其与目标地址之间的范围,将之标记为循环体。除此之外,还要考虑循环体内嵌套循环体的情况。

   4.bit-precise符号执行。这一步的目的是从上一步提取的循环体结构中确定变量,使  用布尔公式对输入和输出变量的映射进行建模。具体方法是先确定循环体中的输出变量,然后执行反向切片,追溯与其相关的输入变量,将这些输入变量中选择从内存中加载的,以及不是循环不变的部分命名为自由输入变量,并标记为符号;接下来,将输入到输出的符号用布尔表达式建立一个个公式,表示其语义。之所以要精确到位级是为了避免数据聚合和拆分等数据混淆手段的干扰。   5.变量映射和比较。这是本文工作的核心部分,目的是将上一步得到的样本中加密运算的语义与标准密码库的语义进行比较,看看是否匹配。由于函数运算的语义是由输入变量和输出变量之间的布尔表达式表示,因此这部分的核心是能否将样本中提取的输入输出变量依次映射到某个标准算法的公式上,其中最关键的是输入变量的映射。具体算法如下:

首先给出几个定义:
•一个布尔函数f(x1, x2, ..., xn)接受n个输入变量,输出一个输出变量。•一个布尔公式是一组布尔函数,有n个输入变量和m个输出变量。•每个布尔公式有一个n X n的输入矩阵,矩阵里的每个元素只能为0或1,表示xn是否在对应的布尔函数中。•定义一个n X m的输出矩阵,其中的每一行对应一个输入变量,每一列对应一个输出变量,这样就将匹配问题转化为:是否可以仅通过交换行和列来将一个输出矩阵转换为另一个?
具体算法举例请移步原文,此处不再赘述。当通过这一算法找到匹配的结果后,还需要进行验证,验证方法是首先随机举出一些输入输出分别输入检测样本和标准库,如果所有的测试输出都不一样则认为这两组公式在语义上是不同的,否则就再进一步用定理证明其来证明公式是否真正等价。
Evaluation本文主要从三个角度对CryptoHunt进行评估:
1.是否能够有效检测混淆二进制文件中广泛使用的加密算法?2.误报率多高?即能否有效将加密算法与其他计算密集型的函数如压缩,视频流编解码等区分开来?3.会引入多少开销?
针对第一个问题,CryptoHunt使用四个常用密码算法来测试,并选取五个项目做横向对比,代码混淆使用extended Obfuscator-LLVM选择不同的编译选项来完成。具体结果如下:

第二个问题,本文使用一系列GNU核心程序,压缩工具和轻量级服务器程序来进行测试,这些程序包括 ls, cp, mv, cat, head, Gzip, bzip2, 7-zip, thttpd, lighttpd,均未发现误报。
第三个问题,Pin来做执行流trace的过程会带来5-6倍的开销,之后的离线分析阶段的各流程开销如下:

可以看到最耗时的部分是循环体的识别,原因是需要多次遍历整个trace流并识别循环嵌套。
Discussion总结一下:这篇工作针对恶意软件中的加密运算给出了一种有效的检测手段,尤其是在防止二进制混淆能力上做出一定优化。但是它仍然存在一些不足:
•单纯的动态二进制分析的路径覆盖率不完整;•Pin这一trace工具的引入会带来较大的性能开销;•Pin本身的存在容易被环境敏感的恶意软件检测到,从而执行逃逸策略来规避检测。


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|安全矩阵

GMT+8, 2025-4-23 15:08 , Processed in 0.012429 second(s), 18 queries .

Powered by Discuz! X4.0

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表