4.1. 简介

4.1.1. 模糊测试

总的来说,模糊测试,是通过不断用生成的输入来运行程序,观察程序状态来查找漏洞的过程。不管是在二进制程序的漏洞挖掘,还是渗透测试中模糊测试都是非常重要的技术。

模糊测试是一种侧重于发现软件安全漏洞的方法。典型的Fuzz测试过程是通过自动的或半自动的方法,反复驱动目标软件运行,并为其提供特别构造的输入数据,同时监控软件运行的异常,进而根据异常结果及输入数据查找软件的安全漏洞。谷歌、微软、思科等公司都使用模糊测试作为软件安全开发流程的一部分。

4.1.2. 覆盖率

代码覆盖率是一种度量代码的覆盖程度的方式,也就是指源代码中的某行代码是否已执行;对二进制程序,还可将此概念理解为汇编代码中的某条指令是否已执行。其计量方式很多,但无论是GCC的GCOV还是LLVM的SanitizerCoverage,都提供函数(function)、基本块(basic-block)、边界(edge)三种级别的覆盖率检测,更具体的细节可以参考LLVM的官方文档。

4.1.2.1. 函数(Fuction-Level)

函数级的覆盖率指代码执行时调用到哪些函数。

4.1.2.2. 基本块(BasicBlock-Level)

基本块以指令跳转作划分界限。

4.1.2.3. 边

一个控制流图(CFG),图的每个节点表示一个基本块,而edge就被用来表示在基本块之间的转跳。