二进制分析方面主要利用技术包括:动态分析(Dynamic Analysis)、静态分析(Static Analysis)、符号执行(Symbolic Execution)、Constraint Solving、资讯流追踪技术(Data Flow Tracking)以及模糊测试(Fuzz Testing)。

1. 控制流图(Control Flow Graph, CFG)

1.1 定义

控制流图(Control Flow Graph, CFG),也叫控制流程图,是一个过程或程序的抽象表现,是用在编译器中的一个抽象数据结构,由编译器在内部维护,代表了一个程序执行过程中会遍历到的所有路径。它用图的形式表示一个过程内所有基本块执行的可能流向, 也能反映一个过程的实时执行过程。Frances E. Allen于1970年提出控制流图的概念。此后,控制流图成为了编译器优化和静态分析的重要工具。

在一个control-flow graph中,每个节点表示一个 基本块 (basic block), i.e. a straight-line piece of code without any jumps or jump targets; 跳转的目的地址是一个基本块的开始,而向外跳转则是这个基本块的结束:jump targets start a block, and jumps end a block ;图中的有向边用于表示控制流中的跳转:Directed edges are used to represent jumps in the control flow. There are, in most presentations, two specially designated blocks: the entry block, through which control enters into the flow graph, and the exit block, through which all control flow leaves.

举例:

0: (A) t0 = read_num
1: (A) if t0 mod 2 == 0
2: (B)   print t0 + " is even."
3: (B)   goto 5
4: (C) print t0 + " is odd."
5: (D) end program

认为有4个bb。

Untitled

1.2 可到达性

若某一个子图没有和包括进入程序块的子图相连接,在执行程式时不会执行到该子图的程序,因此是不可到达程序,在一般情形下可以移除该程序,不会影响程序运作。若从进入程序块无法连到结束程序块,则可能有死循环。不过不是所有的死循环都可以检测的到(参考停机问题)

1.3 支配关系 (Dominate)

若从进入程式块到达基本块N的所有路径,都会在到达基本块N之前先到达基本块M,则基本块M**支配(dominates)**基本块N。

考虑相反的方向,若基本块N到达结束程式块的所有路径,都会在结束程式块之前先到达基本块M,则基本块M**后置支配(postdominates)**基本块N。