论文赏析--Search-Based Local Black-Box Deobfuscation:Understand,Improve and Mitigate

238 阅读8分钟

Search-Based Local Black-Box Deobfuscation:Understand,Improve and Mitigate

基于搜索的局部黑盒反混淆:理解,改进和减轻

背景

混淆

含义:将程序P转换为功能等效但更复杂的程序P’

混合布尔算术编码(MBA) 结合算术和布尔运算(即位运算),可迭代使用以增加语法复杂性。SMT求解器无法解决MBA表达式的化简问题

虚拟化用代码P和虚拟机共同生成字节码B,程序执行依赖于虚拟机中的语义未知的处理程序(Handler)

反混淆

白盒反混淆是基于高级程序分析技术的符号方法,主要缺点是对语法异常敏感。

定义:语法是表达式的形式,语义是等价表达式的最简形式

基于搜索的黑盒反混淆

搜索——在给定搜索空间中搜索等价表达式,黑盒——只能在选定的输入下执行以观察结果。

基于搜索的黑盒反混淆遵循一定的算法框架,包括采样策略、学习策略和简化后处理。

理想的黑盒反混淆技术是无视语法复杂度的。

设计目标

本文采用基于搜索的黑盒反混淆,希望实现快速、简单性、正确性、健壮性

理解黑盒反混淆

Syntia简介

算法实现:Syntia采用随机采样输入,蒙特卡罗树搜索(MCTS)作为学习策略,Z3 SMT求解器化简

工作目标:Syntia工作于受混淆的局部代码,分析其简单语义

工作流程:

  1. 获取输入和输出
  2. 对输入进行随机采样,并观察结果输出
  3. 在部分表达式(例如U+x)空间上使用蒙特卡罗树搜索,尝试综合
  4. 正确->表达式化简;失败

对Syntia的评估

评估指标:

  • 成功率(Succ. Rate):推断出的表达式的数量
  • 等价率(Equiv. Rate):推断出且语义等价的表达式的数量
  • 质量(Qual.):恢复表达式与原表达式运算符数量的比率

Synita原始评估采用随机生成的基准B1,因此存在输入数量和表达式类型分布不均、且半数以上为\alpha等价的问题。 本文引入的新基准B2解决了上述问题,并且将输入变量数量的上限由3个拓展到6个,且引入MBA表达式进行测试。

算子集:

评估结果:

  1. 在15次运行中,Syntia能够生成的表达式数量的差异约为3%。因此Syntia在运行过程中非常稳定
  2. 由上图可见,成功率和等价率十分接近,并且平均质量比原始表达式更好。因此Syntia是简单且正确的
  3. Syntia在B2上综合成功率很低,并且受超时影响很大。因此Syntia不够快速、健壮
  4. Syntia默认在FULL上运行,改为MBA(更小的算子集)时成功率从21%到42%。因此Syntia是算子集敏感的

最佳的Syntia

本文找到在参数上完美配置的Syntia对MBA综合成功率仅约50%,因此认为Syntia的不足是MCTS所固有的

蒙特卡罗树搜索(MCTS)

基本思想:MCTS创建一棵搜索树,每个节点可以是终点表达式(例如a+1)或部分表达式(例如U+a,其中U是非终点记号),首先关注最相关节点。

  • 评估终点节点的相关性通过采样(Sampling) 来完成

  • 评估部分节点,依赖于仿真(Simulation)

    • 仿真:将语法的随机规则应用于部分表达式(U+a->b+a),直到它变成终点。进行采样评估,更新部分的相关性

MCTS的根本缺陷——基于仿真的部分表达式相关性估计是极不可靠的

  • 部分表达式搜索空间极不稳定,随机仿真可能会返回截然不同的结果(如下图)

猜想验证:

  • 受仿真指导的Syntia其行为类似枚举(BFS)搜索(如下图)
  • 只有34/341(20/376)成功合成的表达式是先前最有希望的节点的子节点,表明Syntia成功合成表达式完全依靠其探索性行为

改进黑盒反混淆

作为优化问题的反混淆

改进思路:

  • 建模为优化问题,而非游戏。目标是将表达式和目标表达式的距离优化到零。
  • 仅操作终点而不操作部分,避免了部分表达式相关性难以评估的缺陷。
  • 采用相比MCTS更具有健壮性的算法ILS,ILS专为不稳定的搜索空间而生。

算法实现:采样策略为Oracle,学习策略为S-元启发法和迭代局部搜索(ILS),简化处理使用OCaml

搜索启发法(S-metaheuristics) 。在搜索空间中移动搜索,以迭代地改进候选解决方案。存在多种启发式方法,如爬山、随机游走、模拟退火等

迭代局部搜索(ILS) 。ILS由其他搜索启发法参数化,称为侧边搜索。一旦侧边搜索找到局部最优解,ILS对其添加扰动并重新启动。

搜索:ILS从随机终点启动,迭代应用以下两个步骤

  1. 扰乱:随机选择AST的一个节点并用随机终点替换它迭代
  2. 随机突变:基于侧边搜索(爬山)迭代地改进输入表达式,突变包括用叶子或深度为1的AST替换随机节点

对Xyntia的评估

评估结果:

  • 类似Syntia,Xynita运行十分稳定。
  • 由图中可以看出,Xyntia是简单正确的,更需要强调的是,Xyntia在B2上仍有较好的成功率(80%以上),并且受超时时间影响小,说明Xyntia是健壮且快速的。
  • Xyntia对算子集更加敏感。其经证实的等效率从 90% (Expr) 下降至 71% (Full),而 Syntia 仅从 38.7% (Expr) 下降至 33.7% (Full)。

其他S-元启发法:除了爬山的S-元启发法(随机游走、模拟退火、Metropolis Hasting)参数化的Xyntia均优于Syntia,证明了问题不适合部分探索和仿真指导的搜索。

论ILS相对MCTS的有效性:ILS很好地受到目标函数的指导,并遵循积极的演化趋势

Xyntia对比其他反混淆器

对于相同数据集的反混淆,Xyntia在高混淆程度的反混淆性能优于灰盒反混淆器QSynth,Xyntia对于各数据集的反混淆性能和效率都优于白盒反混淆器GCC和Z3简化器,Xyntia的程序合成效率优于常见的程序合成器CVC4和STOKE。

Xyntia反混淆

Xyntia对于常规混淆方法有效,受混合布尔算数编码的影响较小,不受不透明谓语、基于路径的混淆、隐蔽通道的影响。

Xyntia对基于虚拟化的混淆如用Tigress进行混淆和用VMprotect同样有效。

防御反混淆

  1. 防御原理

黑盒反混淆主要步骤:I/O采样和从样本中学习

防御黑盒反混淆思路:使采样阶段无法正确执行或使分析的表达式较为复杂。

  1. 增强语法复杂程度

实验:创建了3个不同复杂度的数据集,并用Xyntia进行黑盒反混淆。

结论:通过增加语法复杂程度能够延长反混淆时间,从而降低反混淆器性能。

  1. 增强语义复杂程度

实验:5个相同数据集分别进行1~5次if-then-else语义构建,对构建后的数据集用Xyntia进行黑盒反混淆。

结论:通过增强语义复杂程度增加表达式匹配难度,从而导致反混淆器成功率下降。

相关工作

  1. 黑盒反混淆

Syntia:搜寻表达式的随机性过大。

  1. 白盒反混淆

In Botnet Detection:通过将加密算法和密钥直接绑定到特定硬件设备或软件环境的技术,以增强安全性并抵抗逆向分析和密钥提取的技术,但对语法复杂度过于敏感。

  1. 灰盒反混淆

QSynth:I/O关系缓存(黑盒)和沿目标表达式的增量推理(白盒),但对语法复杂度的敏感程度也偏大。

  1. 程序合成

枚举(CVC4):从最简单的程序开始枚举所有程序,删除与规范不一致的代码片段,并返回第一个符合规范的代码。

约束(oracle):约束求解方法将目标程序的框架编码为一阶可满足性问题,并使用现成的SMT求解器来推断满足规范的实现。

随机(Stochastic superoptimization):依照一定规律随机遍历搜索空间,返回找到的第一个符合的表达式。

总结与讨论

创新。在Syntia的基础上创新性地使用迭代局部搜索,使得搜索过程更加可靠。在黑盒混淆的基础上想出了针对黑盒混淆的防御方法,为保护源代码安全做出了贡献。

当然,本文同时也存在一些不可忽视的局限性。

  1. 首先,语义较为复杂的表达式Xyntia无法进行推断,对于复杂程序、大型程序的反混淆效果不佳。
  2. 其次,对于输入和输出不连续且输入输出较少的点函数无法处理。
  3. 最后,本文进行评估的混淆器是免费的Tigress而不是当时最先进的商业混淆器Transdecoder,混淆程度不够大,评估不够严谨。