上图是一个基于 AFL 的 fuzz 流程,afl-fuzz.c 文件负责的是 Fuzz target 阶段,主要作用是通过不断变异测试用例来影响程序的执行路径,期间涉及到输入处理 、覆盖率记录、输出记录等等,这些功能是该文件的主要内容。这些功能会涵盖诸多函数,我们不会对每一个函数都进行源码分析,而是按照功能介绍关键函数。 在功能上,...
上一部分对afl-fuzz的总流程进行了概要性的阐述,接下来将会对关键的代码模块进行详细的分析。 先对afl-fuzz过程中反馈与监控机制的实现进行分析,反馈是指afl在对目标程序的模糊测试过程中,目标程序可以将本次运行过程中的状态反馈给afl。本文主要介绍该afl是如何具体实现分支信息的记录以及更高效的运行目标程序的。 基...
总结师傅们笔记,主要源码分析。 0x01 代码覆盖率 代码覆盖率是fuzz中基本概念,先了解清这个概念后面的插装编译等概念才好理解。 代码覆盖率是一种度量代码的覆盖程度的方式,也就是指源代码中的某行代码是否已执行;对二进制程序,还可将此概念理解为汇编代码中的某条指令是否已执行。对fuzz来说,当然希望每句代码都...
*/ if (queued_paths == prev_queued) { if (use_splicing) cycles_wo_finds++; else use_splicing = 1; } else cycles_wo_finds = 0; prev_queued = queued_paths; if (sync_id && queue_cycle == 1 && getenv("AFL_IMPORT_FIRST")) sync_fuzzers(use_argv); } skipped_fuzz = fuzz_one(...
主要是对afl-fuzz.c的main函数进行分析,通过main函数的流程来对afl-fuzz的工作流程来进行初步的理解,这个过程中不会跟进子函数,只对每个函数的功能进行大致的介绍,涉及到核心功能模块的子函数在后续的文章中会进行详细说明。 一开始是初始化afl-fuzz的运行环境,下面来看环境初始化的整个过程。
最后可能一个crash都没有,也可能有好多crash,甚至会出现上百个,虽然fuzzer会说是unique crash,实际上很多情况下会出现很多触发相同漏洞的crash,这时候就需要进行一定的处理,得到真正的unique crash,然后再对单个结果进行分析。 粉红色:辅助流程,当确定了fuzz目标之后需要分析源代码,然后编写两段程序,分别是给fuzzer用...
这里使用的算法与学术工作中提出的一些其他测试用例最小化方法相比所涉及的内容较少,而且需要的执行次数少得多,并且倾向于在大多数实际应用程序中产生可比较的结果。 Fuzzing 策略 插装提供的反馈信息可以很容易地理解各种fuzzing策略的价值,并优化其参数,以使它们在各种文件类型中均能很好地工作。afl-fuzz使用的策略通...
安装步骤包括源码编译,使用afl-fuzz命令启动测试,命令格式如下:命令中的/path/to/program替换为目标程序路径,[options]为程序运行选项或参数。若测试程序需从文件读取输入,可使用@@占位符。AFL将根据测试需求替换此占位符。AFL使用示例 下面是一个简单示例,演示如何使用AFL进行模糊测试。目标程序实现四...
afl-fuzz是启动 AFL 模糊测试的程序。 -i input_dir指定包含初始化测试用例的目录。 -o output_dir指定存放的 fuzzing 结果的目录。 --之后的部分是运行被测试程序的命令行,其中/path/to/program替换为需要进行模糊测试的程序的路径,[options]是运行该程序的任何选项或参数。
主要的代码在 afl-fuzz.c 文件中,然后是几个独立模块的实现代码,llvm_mode 和 qemu_mode 的代码量大致相当,所以分析的重点应该还是在AFL的根目录下的几个核心功能的实现上,尤其是 afl-fuzz.c,属于核心中的重点。 各个模块的主要功能和作用的简要说明:...