混淆技术的研究,在软件保护,云计算,免杀等领域有着极其重要的作用。
西安交通大学的两位网安新生火种对混淆模型的研究,具体函数的安全类介绍,特殊混淆模型,以及代码混淆技术的推广与实际应 用,甚至到未来该项技术的展望,都值得我们去学习和深思。
下面就让我们来 回顾 2021 看雪第五届安全开发者峰会上 《代码混淆研究的新方向》 此议题 的精彩内容。
【程瑞-西安交大智能网络与网络安全实验室】
程瑞:西安交通大学软件工程学院,智能网络与网络安全实验室,参与代码混淆与代码相似度检测课题研究。研究兴趣为程序分析,Fuzzing,恶意软件检测。
【南子龙-西安交大智能网络与网络安全实验室】
南子龙:西安交通大学微电子科学与技术学院,网络安全社团负责人。研究兴趣为密码学应用,IoT安全,量子器件,同态芯片。
演讲内容
以下为速记全文:
大家好,我们今天分享的议题名称为《代码混淆研究的新方向》,我是来自西安交通大学的程瑞,作者列表中还有一位就是范铭,范铭老师是我在实验室学习时的导师,不过很可惜他今天没有到场。我们今天的报告分为两个部分,第一部分由我来介绍,第二部分由南子龙同学来介绍。
首先是引言部分,也就是代码混淆的定义以及应用。代码混淆可以看成是一个转换过程,它接受一个程序P作为输入输出混淆后的程序,P'相比于P其分析难度应该增加了。
图中就是一个代码混淆的案例,可以看到混淆后的程序P具有更多的流程转移以及算术运算指令,同时混淆转换前后的语义应该是相等的,形式化一点的定义就是当它们接受相同且合法的输入时,应该产生相同的输出。
代码混淆的应用场景就是保护那些不得不执行于不可信执行环境的代码,不可信的执行环境指的是攻击者能够在任意时刻中断程序,修改代码与内存,也就是我们所说的mate攻击模型,然后是代码混淆的应用非常广泛,基本可以分为两类,一类应用于恶意软件,比如对蠕虫木马使用混淆加密,增加安全分析师的分析难度,一类应用于数字版权保护,就是对商业软件的关键代码进行保护。以使其免受于剽窃等非法攻击。这方面常见的解决方案有vmp、tmd、ollvm。
接着是研究现状,也就是产业界与学术界的研究现状。
产业界可能比较关注的就是混淆逻辑门,属于数据流混淆中的一大类,已经被广泛使用的逻辑门有VMP外用门,还有最近被提出的量子逻辑门以及三输入门。
我们想问一个问题: 这些混淆他们是足够安全的吗?
我们使用VMP万用门中的Nand门实现了AND、XOR以及SUB运算。 使用clang编译开启-O3优化,编译得到的BIN中复杂的逻辑运算全部被化简了。
然后我们来考察量子逻辑门的安全性。 实际上量子逻辑门基本等价于三输入门,考察它基本上也就是考察三输入门的安全性,我们依次使用量子门与三输入门实现了减法运算,开启编译优化后复杂的逻辑运算仍然被化简成了可读的形式。 然后我们讨论为什么这种逻辑门的数据流混淆是不安全的,首先是比较一下三输入门与二输入门。
我们看AOI门为例,AOI接受三个输入,当接受a,b, -1三个输入时,其输出结果等于Nor(a, b)然后我们注意到有b & -1 = b这个式子,我们把它带进去就能把它化简得到Nor(a,b),就是二输入门,这只需要使用基础的离散数学知识就能做到,也就是说从内联代码的角度来看,三输入门等价于二输入门,当然不是说三输入门完全等价于二输入门,而是在我们代码混淆的语境下来看,同时因布尔代数已经是非常成熟的话题了,有明确的运算规则可以用于化简二输入门。
右图是LLVM中InstCombine这一优化pass中的部分代码,即是这一个优化pass,完成了逻辑门的化简功能。可以看到其中进行了很多模式匹配以进行化简工作。
接着是控制流混淆中的不透明谓词,最常见的控制流混淆就是不透明谓词,谓词简单来说就是在原程序中某个位置插入一个if分支。
如图中所示就是原程序控制流与混淆后的控制流,这可以干扰攻击者对代码的分析,不透明谓词按其取值可以分为两种类型,一种是永远为真或者永远为假的不透明谓词,一种是可以为真或假的不透明谓词。
永真或者永假型的不透明谓词插入的后继基本块,也即是图中的基本块二与基本块三中必然有一个是永远不会被执行的,另一种就是可真可假型的不透明谓词,也就是说后面插入的两个基本块都有可能被执行,也正是因为这个原因,其插入的两个基本块他们的语义应该是相同的,但是可以对他们使用不同的混淆方案进行加密。以使攻击者第一时间无法判断出这两个基本块是同一个基本块,然后来混淆攻击者。
我们还要考量的问题仍然是他们的安全性问题, O-LLVM中存在很多基于数论构造的不透明谓词,但是angr,一个在BIN上进行动态符号执行的工具,检测出他们所需要的时间是极短的。
另一种方案是基于API来构造,比如CreateFile API接受错误的输入时它是永远返回0的,但是我们可以通过HOOK API或者拓展符号执行工具为API实现输入正确性检测,符号执行工具已经被广泛应用于反混淆,传统代码混淆方法正面临非常大的挑战,但是目前关于反符号执行的混淆的研究还是存在很多的不足,这也是我们的研究动机。
有研究测量了符号执行工具覆盖混淆后程序所有可能的执行路径所需时间并得出一个结论,除代码虚拟化以外的传统混淆技术,已然无法有效抵抗基于符号执行的反混淆手段,但是不管是学术界还是产业界,都有许多针对虚拟机的反混淆研究,比如VTIL它能完整还原VMP保护的程序。
作者还提出了第一个尝试,左侧是原程序,右侧是混淆后的程序,可以看见方案是在一个循环中插入分支,这即是尝试利用符号执行的路径爆炸问题构造混淆。路径爆炸问题,就是说符号执行的程序中可能执行路径非常多,导致无法处理。
比如说一个大程序的循环,这个循环可以执行一次两次或者很多很多次,这些都是可能的执行路径,然后循环内有条件分支语句,条件分支中执行某一侧的分支是不可确定的,这又极大增加了可能的执行路径,这种可能执行路径的增加是指数形式的。
作者后来又提出了一种新的混淆方案,基本思想是在程序中插入for循环。其循环次数,依次与一个整形变量中的字节相关联,从而导致其可能执行路径产生了激增。以4个for循环为例,其所有可能执行路径应该是256×256×256×256,也就是2的32次方。
接着我们讨论一下: 这两种混淆方案为什么是安全的?
作者将符号执行的攻击场景分为两类,一种是覆盖程序的所有可能执行路径,一种是试图寻找到能触发程序特定行为的输入值,range divider只能对覆盖执行路径场景产生作用,因为其在循环中引入的if分支两侧基本块语义都是相等的,因为插入的if分支可以看成是可真可假的不透不透明,也即是说探索了一条分支,就等于探索了两条分支,在整个循环中探索了一条执行路径,就等于探索了所有执行路径。for循环对两者都适用。
以dfs寻路(深度优先搜索寻路)说明问题,每一次符号执行工具无法到达某一基本块时,只能选择向上回溯一次,试图在离他最近的 for循环中多循环一次,依次取尽所有可能执行路径。
还有研究是基于哈希函数加密跳转条件。有研究基于哈希函数提出了一种加密分支条件的混淆方案,其存在的问题是引入的MD5与SHA256等哈希函数带来的时间过开销都过高了,左侧是原程序,if分支中将变量x与一个常数c比较,右侧是混淆后的程序,对等式两侧都应用哈希加密,同时使用常量c加密了后继基本块中的机器码,只有if分支成立时才进行解密,由于基本块中的机器码被加密了,故而攻击者没找到正确的输入x之前是无法进行进一步分析的。
然后是上一种方法存在的问题,就是哈希函数的时间开销过大,有研究基于3x+1猜想,构造了一种基于路径爆炸的混淆方法。
3x+1猜想指的是对任意一个正整数,如果其是偶数则除以2,如果其是奇数则乘以3再加1,如此迭代若干次后其一定能收敛回定值1.左侧是原程序,右侧是混淆后的代码,可以看到原来x=30这一条件表达式被替换为x - y>28 且 x + y < 32,这一组不等式在x, y都为正整数的情况下,是只有 x = 30与 y = 1 这一组解的,注意到3x+1猜想,其性质正是其最终能收敛到1。
while循环的前半部分就是实现了3x+1猜想的迭代过程,但是其存在的问题就是具有类似性质的数学猜想的个数是有限的,因而很容易被攻击者使用模式匹配攻击。
然后是我们的研究动机,也就是目前已有研究存在的不足。
首先是我们希望改进for混淆,我们测量了angr求解k=2,也就是有两个for循环的那种混淆方法中,每增加一条deadended路径所需要的时间。
从左图中可以看到,大部分路径求解所需时间都在0.1秒到0.3秒,相当一部分路径所需时间在0.02秒左右,for循环可以显著增加可能的执行路径数,然而求解每一条增加的路径所需时间都是极少的。我们的改进思路就是增加求解每一条路径所需的时间,显然,求解所需总时间等于每条路径所需时间的总和,for混淆只考虑了路径总数,然后我们引入对求解一条路径一条路径所需时间的考量。
然后是系统化关于3x+1混淆的研究,我们试图系统化关于3x+1混淆的研究,也即寻找一种构造这一类混淆的框架。过去的研究都表明3x+1混淆能有效抵抗符号执行工具的路径探索,然而问题就是具有类似数学性类似性质的数学猜想只有数个,同时猜想迭代回1的循环次数也是比较高的,引入的时间开销也比较多。
然后是减小哈希函数混淆方法带来的时间开销,过去的研究都表明这种方法是有效的,但是直接应用哈希函数的方法过于粗糙。
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)
最后于 2021-10-29 19:10
被kanxue编辑
,原因:
上传的附件: