american fuzzy lop 介绍

  1. guided fuzzing的挑战
    ====================

Fuzzing是漏洞挖掘领域最有效的方法之一,可以用来发现大量的远程代码执行和提权的漏洞。然而,fuzzing优势相对肤浅和盲目的。随机变异使得我们很难实现达到测试程序特定的代码路径。这就使得测试的代码覆盖率很低。
有很多人试图去解决这个问题,Tavis Ormandy曾经提出一种:语料精馏法。这个方法根据代码覆盖率,从大量高质量的输入文件语料中选取一个子集,然后按照传统方法去fuzz。这种方法很有效,但前提是需要一个这样的语料。另一方面,代码覆盖率只提供了一个很简单的对程序状态的描述,当Fuzzing测试到了一定的程度,代码覆盖率就没什么作用了。
所以,大家都在探索更复杂的技术,比如:程序控制流分析,符号执行或静态分析。这些技术在实验中是很有前途的,但是在实际应用中显得效率低下、缺乏可靠性。

  1. AFL的方案
    =========

AFL是一个暴力方法的fuzzer,搭配了一个极其简单但是绝对可靠的,插桩代码导向的遗传算法。
它根据一种自定义的分支覆盖率,来毫不费力地识别局部的程序控制流。
简单来说,整个算法的逻辑如下:

  1) Load user-supplied initial test cases into the queue,
  2) Take next input file from the queue,
  3) Attempt to trim the test case to the smallest size that doesn't alter the measured behavior of the program,
  4) Repeatedly mutate the file using a balanced and well-researched variety of traditional fuzzing strategies,
  5) If any of the generated mutations resulted in a new state transition recorded by the instrumentation, add mutated output as a new entry in the queue.
  6) Go to 2.

整个fuzzing过程,会产生一个很有用的test case集合,我们可以使用这个集合,对一些闭源的软件进行压力测试。
经测试,AFL的性能,比那些blind fuzzing或者coverage-only工具高多了。

  1. 有源码的情况下instrument
    ====================

当有源代码时,我们可以在编译期间进行instrument,这种instrument对性能影响很小。

gcc/g++重新编译目标程序的方法是:
CC=/path/to/afl/afl-gcc ./configure
make clean all
对于一个C++程序,要设置:
CXX=/path/to/afl/afl-g++.

afl-clang和afl-clang++的使用方法类似。

当测试库的时候,我们需要写一个小程序,从stdin中读数据,然后传到被测试库中。
这种情况下,我们就需要把这个库静态链接到可执行文件中:
$ CC=/path/to/afl/afl-gcc ./configure --disable-shared

  1. 对二进制instrument
    =================

AFL对二进制的instrument支持是实验性的。通过qemu的用户级仿真实现。这种模式比编译期instrument慢2到5倍。

  1. 选取初始测试样例
    ===========

为了正确操作,AFL一开始需要有一个可以被目标程序正确读取的输入样例。选择输入样例的两条基本准则:

  • 文件尽可能小
  • 选择的案例尽可能在功能上不相同,比如:fuzz照片程序时,没有必要用50个不同的风景照
  1. 开始Fuzzing
    ============

afl-fuzz负责进行fuzzing的过程,需要指定一个初始test cases的目录、一个存放findings的目录和一个目标程序的目录。

对那些直接从stdin读取输入的目标程序来说,语法如下:
$ ./afl-fuzz -i testcase_dir -o findings_dir /path/to/program […params…]

对从文件读取输入的目标程序来说,要用“@@”,语法如下:
$ ./afl-fuzz -i testcase_dir -o findings_dir /path/to/program @@

也可以用-f选项,把变异数据写到一个指定的文件。
没有被instrument的目标程序,可以用qemu模式(-Q)进行fuzz,或者直接用blind-fuzzer模式(-n)。
使用-t和-m选项,设置fuzz过程的默认timeout和memory limit。
一般afl-fuzz的fuzzing过程会持续几天时间,如果想要尽早结束,可以使用-d选项。

  1. fuzzing的输出文件
    ===============

fuzzing过程中,会输出文件到以下目录:

  • queue/ - test cases for every distinctive execution path,
  • crashes/ - unique test cases that cause the tested program to receive a fatal signal (e.g., SIGSEGV, SIGILL, SIGABRT).
  • hangs/ - unique test cases that cause the tested program to time out.
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值