主要分析 winafl.cafl-fuzz.c(入口函数)

创建命名管道与内存映射来实现与目标进程(DR)交互

管道用来发送和接收命令相互操作对方进程,内存映射主要用来记录覆盖率信息

基础结构

基本块

学习一个 工具最好的学习方法就是去了解他的实现,分析他的原理。

WinAFL 利用的是 DynamoRIO 动态插桩框架,用于分析代码的覆盖率(基本块覆盖率、边界覆盖率

进行的是对基本块的识别,基本快 IDA 反编译可以看到

通过对模拟运行基本块中的指令,监控是否运行结束。

边界

这里提到了 基本块和边界

边界是:我们可以将程序看成一个控制流图(CFG),图的每个节点表示一个基本块,而edge就被用来表示在基本块之间的转跳。也就是块的间的连接线。

具体到AFL的实现中,使用二元组(branch_src, branch_dst)来记录当前基本块 + 前一基本块 的信息,从而获取目标的执行流程和代码覆盖情况,下文会详细介绍。

函数(Fuction-Level)

函数就是代码执行时调用到哪些函数,但是函数里面的具体代码行却不作统计,相对比较粗糙但高效的统计方式。所以,通常的统计方式是用基本块,简称BB。