diff --git a/2019/07/01/AFL-first-learn/index.html b/2019/07/01/AFL-first-learn/index.html index 81817706..2c748d86 100644 --- a/2019/07/01/AFL-first-learn/index.html +++ b/2019/07/01/AFL-first-learn/index.html @@ -89,7 +89,7 @@ - + @@ -449,11 +449,37 @@

0x01 模糊测试

首先,模糊测试(Fuzzing)是一种测试手段,它把系统看成一个摸不清内部结构的黑盒,只是向其输入接口随机地发送合法测试用例,这些用例并不是开发者所预期的输入,所以极有可能会造成系统的崩溃,通过分析崩溃信息,测试人员(黑客)就可以评估系统是否存在可利用的漏洞。
模糊测试的过程,就好像是一个不断探测系统可以承受的输入极限的过程,让我想起学电子的时候对一个滤波器进行带宽的评估,如果我们知道内部电路原理,那么这个器件对于我们就是白盒了,可以直接通过公式计算理论带宽,现在系统对于我们而言是一个黑盒,我们通过在足够大频率范围内对其不断输入信号,就能测试出其实际带宽。

模糊测试方法一览

-
























基于变种的Fuzzer 基于模板的Fuzzer 基于反馈演进的Fuzzer
基于追踪路径覆盖率 基于分支覆盖率
在已知合法的输入的基础上,对该输入进行随机变种或者依据某种经验性的变种,从而产生不可预期的测试输入。 此类Fuzzer工具的输入数据,依赖于安全人员结合自己的知识,给出输入数据的模板,构造丰富的输入测试数据。 此类Fuzzer会实时的记录当前对于目标程序测试的覆盖程度,从而调整自己的fuzzing输入。
PAP:路径编码的算法;后面会产生路径爆炸的问题 漏洞的爆发往往由于触发了非预期的分支
Taof, GPF, ProxyFuzz, Peach Fuzzer SPIKE, Sulley, Mu‐4000, Codenomicon AFL
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
基于变种的Fuzzer基于模板的Fuzzer基于反馈演进的Fuzzer
基于追踪路径覆盖率基于分支覆盖率
在已知合法的输入的基础上,对该输入进行随机变种或者依据某种经验性的变种,从而产生不可预期的测试输入。此类Fuzzer工具的输入数据,依赖于安全人员结合自己的知识,给出输入数据的模板,构造丰富的输入测试数据。此类Fuzzer会实时的记录当前对于目标程序测试的覆盖程度,从而调整自己的fuzzing输入。
PAP:路径编码的算法;后面会产生路径爆炸的问题漏洞的爆发往往由于触发了非预期的分支
Taof, GPF, ProxyFuzz, Peach FuzzerSPIKE, Sulley, Mu‐4000, CodenomiconAFL

0x02 AFL快速入门

1)用make编译AFL。如果构建失败,请参阅docs / INSTALL以获取提示。
2)查找或编写一个相当快速和简单的程序,该程序从文件或标准输入中获取数据,以一种有价值的方式处理它,然后干净地退出。如果测试网络服务,请将其修改为在前台运行并从stdin读取。在对使用校验和的格式进行模糊测试时,也要注释掉校验和验证码。
遇到故障时,程序必须正常崩溃。注意自定义SIGSEGV或SIGABRT处理程序和后台进程。有关检测非崩溃缺陷的提示,请参阅docs/README中的第11节。
3)使用afl-gcc编译要模糊的程序/库。一种常见的方法是:

1
CC = / path / to / afl-gcc CXX = / path / to / afl-g ++ ./configure --disable shared make clean all

-

如果程序构建失败,请联系 afl-users@googlegroups.com
4)获取一个对程序有意义的小而有效的输入文件。在模糊详细语法(SQL,HTTP等)时,也要创建字典,如dictionaries/README.dictionaries中所述。
5)如果程序从stdin读取,则运行’afl-fuzz’,如下所示:
./afl-fuzz -i testcase_dir -o findings_dir -- \ /path/to/tested/program [... program's cmdline ...]
如果程序从文件中获取输入,则可以在程序的命令行中输入@@; AFL会为您放置一个自动生成的文件名。

+

如果程序构建失败,请联系 afl-users@googlegroups.com
4)获取一个对程序有意义的小而有效的输入文件。在模糊详细语法(SQL,HTTP等)时,也要创建字典,如dictionaries/README.dictionaries中所述。
5)如果程序从stdin读取,则运行’afl-fuzz’,如下所示:
./afl-fuzz -i testcase_dir -o findings_dir -- \ /path/to/tested/program [... program's cmdline ...]
如果程序从文件中获取输入,则可以在程序的命令行中输入@@; AFL会为您放置一个自动生成的文件名。

一些参考文档

docs/README - AFL的一般介绍,
docs/perf_tips.txt - 关于如何快速模糊的简单提示,
docs/status_screen.txt - UI中显示的花絮的解释,
docs/parallel_fuzzing.txt - 关于在多个核上运行AFL的建议
Generated test cases for common image formats - 生成图像文件测试用例的demo
Technical “whitepaper” for afl-fuzz - 技术白皮书

@@ -462,7 +488,7 @@

AFL的变体和衍生物允许您模糊Python,Go,Rust,OCaml,GCJ Java,内核系统调用,甚至整个虚拟机。 还有一个密切启发的进程模糊器,它在LLVM中运行,并且是一个在Windows上运行的分支。 最后,AFL是OSS-Fuzz背后的模糊引擎之一。

哦 - 如果你安装了gnuplot,你可以使用afl-plot来获得漂亮的进度图。


-

0x03 AFL

    +

    0x03 AFL特点

    1. 非常复杂。它是一种插桩器(instrumentation)引导的遗传模糊器,能够在各种非平凡的目标中合成复杂的文件语义,减少了对专用的语法识别工具的需求。它还带有一个独特的崩溃浏览器,一个测试用例最小化器,一个故障触发分配器和一个语法分析器 - 使评估崩溃错误的影响变得简单。
    2. 智能。它围绕一系列经过精心研究,高增益的测试用例预处理和模糊测试策略而构建,在其他模糊测试框架中很少采用与之相当的严格性。结果,它发现了真正的漏洞
    3. 它很快。由于其低级编译时间或仅二进制检测和其他优化,该工具提供了针对常见现实世界目标的近原生或优于原生的模糊测试速度。新增的持久模式允许在最少的代码修改的帮助下,对许多程序进行异常快速的模糊测试。
    4. @@ -470,10 +496,10 @@

    0x04 AFL README

    -

    Written and maintained by Michal Zalewski lcamtuf@google.com

    +

    Written and maintained by Michal Zalewski lcamtuf@google.com

    Copyright 2013, 2014, 2015, 2016 Google Inc. All rights reserved.
    Released under terms and conditions of Apache License, Version 2.0.

    For new versions and additional information, check out:
    http://lcamtuf.coredump.cx/afl/

    -

    To compare notes with other users or get notified about major new features,
    send a mail to afl-users+subscribe@googlegroups.com.

    +

    To compare notes with other users or get notified about major new features,
    send a mail to afl-users+subscribe@googlegroups.com.

    See QuickStartGuide.txt if you don’t have time to read this file.

    1)具有导向性的模糊测试的挑战

    Fuzzing是用于识别真实软件中的安全问题的最强大且经过验证的策略之一;它负责安全关键软件中迄今为止发现的绝大多数远程代码执行和权限提升漏洞。
    不幸的是,模糊测试也不够有力。盲目的、随机的变异使得它不太可能在测试代码中达到某些代码路径,从而使一些漏洞超出了这种技术的范围。
    已经有许多尝试来解决这个问题。早期方法之一 - 由Tavis Ormandy开创 - 是一种语义库蒸馏(corpus distillation)。网上找到的一些大型语料库中往往包含大量的文件,这时就需要对其精简,该方法依赖于覆盖信号从大量高质量的候选文件语料库中选择有趣种子的子集,然后通过传统方式对其进行模糊处理。该方法非常有效,但需要这样的语料库随时可用。正因为如此,代码覆盖率也只是衡量程序执行状态的一个简单化的度量,这种方式并不适合后续引导fuzzing测试的。
    其他更复杂的研究集中在诸如程序流分析(“concoic execution”),符号执行或静态分析等技术上。所有这些方法在实验环境中都非常有前景,但在实际应用中往往会遇到可靠性和性能问题 - 部分高价值的程序都有非常复杂的内部状态和执行路径,在这一方面符号执行和concolic技术往往会显得不够健壮(如路径爆炸问题),所以仍然稍逊于传统的fuzzing技术。

    @@ -961,7 +987,7 @@ -
    +
    diff --git a/search.xml b/search.xml index fefb14ab..9f960986 100644 --- a/search.xml +++ b/search.xml @@ -3,7 +3,7 @@ <![CDATA[AFL初探]]> %2F2019%2F07%2F01%2FAFL-first-learn%2F - + 二进制 diff --git a/sitemap.xml b/sitemap.xml index 0efbf3ae..a77618e1 100644 --- a/sitemap.xml +++ b/sitemap.xml @@ -4,7 +4,7 @@ https://cool-y.github.io/2019/07/01/AFL-first-learn/ - 2019-07-01T11:51:18.420Z + 2019-07-01T12:00:47.564Z