0%

转载: https://www.anquanke.com/post/id/240105

0x00 前言

这篇文章主要从源码角度剖析AFL的编译时插桩(compile-time instrumentation)。AFL超级棒的一点在于其“灰盒”的特性:通过编译时插桩获动态获取目标程序的边覆盖信息。此外,AFL的forkserver机制使得AFL在运行过程中只需调用一次execv()函数,避免了多次调用execv()引起的开销(注:每执行一次execv(),都需要将目标程序加载到内存,进行链接等操作)。

注意:本文只分析能获得目标程序源码、开启forkserver下的AFL的一些内部实现,主要以afl-gcc为例对插桩代码进行解读,涉及到的源文件主要有afl-fuzz.c,afl-as.c,afl-as.h 和 afl-gcc.c。

阅读全文 »

本文主要简要介绍AFL的工作流程和实现原理。AFL是一个典型的coverage-based grey box fuzzer,对fuzzing的发展具有十分重大的意义。coverage-based,有的论文也称coverage-guided,coverage-based fuzzing通过扩大目标程序程序的代码覆盖率增加发现程序漏洞的机会。这种思路是比较直观的:如果能够执行到目标程序的每一个基本块、每一条边、每一条路径,那么发现漏洞的机率也会增大。因此,此类coverage-based fuzzer在生成测试用例时是以扩大目标程序代码覆盖率为目标的,并不是直接地以找漏洞为目标。

阅读全文 »

Fuzzing 或者 fuzz testing,中文名为模糊测试,是一种著名的自动化漏洞挖掘技术。Fuzzing的核心是通过一定的方式自动地生成大量的测试用例,并使用这些测试用例测试目标程序,以期待能够检测到目标程序的非预期行为、软件缺陷或漏洞。本文主要是粗浅地总结一下fuzzing的发展,并浅谈自己对于fuzzing的理解,有错的地方还望指正。

阅读全文 »