Group of Software Security In Progress

GoSSIP @ LoCCS.Shanghai Jiao Tong University

Deobfuscation Reverse Engineering Obfuscated Code

论文下载

Abstract

很多针对静态分析的混淆方法,都能通过将静态和动态结合起来的方式来解决。本文提出的方法在软件工程和软件安全方向都能得以应用。

  • 软件工程:动态分析在逆向工程中是如何被使用的。
  • 软件安全:作为一种代码混淆工具的攻击模型,帮助混淆技术设计人员做出更强的抗逆向模 型。

Introduction

混淆的目的就是让程序变得非常难以理解,攻击者很难理解程序的内部逻辑。如果混淆无法有效地对抗逆向,那么混淆技术不仅仅没有用,甚至为程序带来了额外的时空开销,让用户对安全技术产生不好的印象。

本文主要针对 Control Flow Flattening混淆技术,提出一系列对抗这种混淆的方法。文中指出动态分析能有效地对抗代码混淆,并且通过动静结合的方式,能够程序解决很多种代码混淆技术。

Obfuscating Transformation

  1. Surface Obfuscation,表层混淆。侧重于混淆程序的具体语法,比如变量重命名。只是让人更难理解,并没有混淆程序的语义结构,因此对很多逆向中用的算法都没有影响,如程序切片这种依赖于代码结构或语义,而不是上下文语法的技术。
  2. Deep Obfuscation, 混淆程序逻辑和结构,比如控制流或数据引用行为等,会干扰到程序分析或逆向工程工具。Deep处理起来显然比Surface更复杂更困难。

Control flow flattening

加强版I:Interprocedural data flow

使用全局数组来存储dispatcher variable的值,在每个调用,这些值都被初始化成一个全局数组中随机的偏移,同一个函数在不同调用点上的偏移也不同。

Artificial Block and Pointers

在CFG中人为地添加基本块,并用指针的方式进行跳转,可能这些基本块永远不会被执行,但是静态分析的时候很难识别出来。

在实现中,可能B和B’都会跳到下一个正确的基本块上,这样就增加了不确定性,B”则直接跳到一个错的地方去,然后将switch变量的初始值隐藏,这样静态分析就很难推断出哪个基本块会被执行。

反混淆

克隆

很多混淆技术通过增加伪造的基本块,来增加理解程序的难度,也就降低了分析结果的准确程度。

解决这种问题的一种办法就是,拷贝一块这个程序的一部分,这样,伪造的基本块就不会再添加到原来的程序执行路径中去,污染原来的分析结果。

Fig

但是clone并没有消除这样的基本块,所以无法改进后向数据流分析的结果。

但也不能无限clone,否则代码大小增长很快。由于反混淆的目的通常是识别和删除混淆代码,所以这里要有选择的应用clone技术,在一些有多条控制流路径的点上,找出着这种数据流传递明显更不靠谱的基本块,然后再进行clone.

静态路径可行性分析

  • 使用基于约束的静态分析方法来确定一条执行路径是否可行。
  • 给定一条路径,利用所有这条路径上活跃的变量构造一个关于这条路径的约束,判断这条路径是否可满足。
  • 约束可以用路径切片的方式构造出来,这样能够减少测试可满足性的时间,然后用约束求解器来求解。

Fig

  • 利用常量传递很容易看出这个约束是不满足的。
  • 所以在这里可以对B3做个clone,这样就避免了对分析结果准确度的影响。
  • 由此也可以看出,静态路径可行性分析和clone技术其实是互补的。

动静态分析结合

传统的静态分析,如静态可行性分析,是保守的,所以其结果通常是事实的一个超集,动态分析,如tracing或profiling,只能得到结果的一个子集。

可以先用动态方法得到一个子集,然后再用静态方法在CFG中加上一些边,也可以反过来,先静态方法生成一个超集,再用动态结果删去一些边。这样组合就能克服一些单纯用静态或者动态方法的缺点。

文中使用静态分析来改进动态分析结果的方法,在CFG中加上一些可能执行的边。

  1. 在CFG中仅标记动态分析结果中识别出来的边。
  2. 在CFG中进行constant propagation,数据流仅沿着第一步被标记出来的边进行传递,在遇到一些分支,其结果无法确定,但是这个分支上有边没有被标记时,就把这些没有被标记的边加入到结果集中去。

Evaluation

文中实验的混淆和反混淆技术都是自己实现的,在SPECint-2000的10个C实现的程序上进行 实验。

使用DIABLO和PLTO两个x86平台的二进制重写工具对下面这些程序进行混淆重写: Fig

Basic Flattening

Interprocedural data flow

Flattening with Artificial Blocks and Pointers

Fig

DIABLO使用基于传统的constant propagation的clone技术,引入了一些额外的边(这些边可以通过一些附加的处理删去,如活跃性分析或jump链折叠等),所以存在一定的误报(上面的over)。

对于第二行左一表中的结果,因为路径可行性分析是intraprocedual的,所以这里通过与动态trace结合的方式,得到了这里的结果,平均能消除73%的边。

右一的表也是PLTO的结果,结合动态的方法,平局消除78%的混淆边。

反混淆用时

7秒到21分钟不等。