使用Afl-fuzz (American Fuzzy Lop) 进行fuzzing测试(一)——使用初体验
2018-01-21 12:52
1301 查看
更新于2017.12.08
转载请注明出处:http://blog.csdn.net/youkawa/article/details/45696317
Fuzzing技术被证明是当前鉴别软件安全问题方面最强大测试技术。当前大多数远程代码执行和特权提升等比较严重的漏洞都是使用Fuzzing技术挖掘的。然而Fuzzing技术仍然存在着覆盖率低的缺陷。而许多的代码漏洞需要更大的路径覆盖率才能触发,而不是通过纯粹的随机尝试。
为了解决这一问题,已经提出了不少通过提供被测试代码更多的信息去引导和增强测试技术的方法。如简单的语义库蒸馏(corpus distillation),流分析(concolic execution),到纯粹的符号执行(symbolic execution)和静态分析等。
第一种方式(corpus distillation)能很好地工作,但严重依赖于大量的、高质量的合法输入数据的语料库(corpus)。正因为如此,代码覆盖率也只是衡量程序执行状态的一个简单化的度量,这种方式并不适合后续引导fuzzing测试的。
其余的技术(符号执行,concolic执行)一直都被认为是极有前景的。但仍然被可靠性问题和程序执行环境的复杂性所束缚。大部分高价值的程序都有非常复杂的内部状态和执行路径,在这一方面符号执行和concolic技术往往会显得不够健壮(如路径爆炸问题),所以仍然稍逊于传统的fuzzing技术。
AFL号称是当前最高级的Fuzzing测试工具之一。由lcamtuf所开发。通过对源码进行重新编译时进行插桩(简称编译时插桩)的方式自动产生测试用例来探索二进制程序内部新的执行路径。与其他基于插桩技术的fuzzers相比,afl-fuzz具有较低的性能消耗,有各种高效的fuzzing策略和tricks最小化技巧, 不需要先行复杂的配置,能无缝处理复杂的现实中的程序。当然AFL也支持直接对没有源码的二进制程序进行测试,但需要QEMU的支持。这在本文后面会做详细介绍。
从官网http://lcamtuf.coredump.cx/afl/下载最新版的源码(latest version),解压后进入所在目录。执行以下命令进行编译和安装:
2
3
在对测试集进行编译的时候把GCC编译器替换成afl-gcc,
在执行的过程中会遇到一些错误,但都给出了提示,如:
2
GNU Binary Utilities或binutils是一整套的编程语言工具程序,用来处理许多格式的目标文件。下载之后解压,然后按一下步骤编译:
2
3
4
在binutils-2.25目录下新建afl_in 用于存放初始输入文件,新建afl_out文件夹用于保存fuzzing测试结果。
2
3
4
开始对reeelf程序进行测试
转载请注明出处:http://blog.csdn.net/youkawa/article/details/45696317
1. 具有导向性的模糊测试
Fuzzing技术被证明是当前鉴别软件安全问题方面最强大测试技术。当前大多数远程代码执行和特权提升等比较严重的漏洞都是使用Fuzzing技术挖掘的。然而Fuzzing技术仍然存在着覆盖率低的缺陷。而许多的代码漏洞需要更大的路径覆盖率才能触发,而不是通过纯粹的随机尝试。为了解决这一问题,已经提出了不少通过提供被测试代码更多的信息去引导和增强测试技术的方法。如简单的语义库蒸馏(corpus distillation),流分析(concolic execution),到纯粹的符号执行(symbolic execution)和静态分析等。
第一种方式(corpus distillation)能很好地工作,但严重依赖于大量的、高质量的合法输入数据的语料库(corpus)。正因为如此,代码覆盖率也只是衡量程序执行状态的一个简单化的度量,这种方式并不适合后续引导fuzzing测试的。
其余的技术(符号执行,concolic执行)一直都被认为是极有前景的。但仍然被可靠性问题和程序执行环境的复杂性所束缚。大部分高价值的程序都有非常复杂的内部状态和执行路径,在这一方面符号执行和concolic技术往往会显得不够健壮(如路径爆炸问题),所以仍然稍逊于传统的fuzzing技术。
AFL号称是当前最高级的Fuzzing测试工具之一。由lcamtuf所开发。通过对源码进行重新编译时进行插桩(简称编译时插桩)的方式自动产生测试用例来探索二进制程序内部新的执行路径。与其他基于插桩技术的fuzzers相比,afl-fuzz具有较低的性能消耗,有各种高效的fuzzing策略和tricks最小化技巧, 不需要先行复杂的配置,能无缝处理复杂的现实中的程序。当然AFL也支持直接对没有源码的二进制程序进行测试,但需要QEMU的支持。这在本文后面会做详细介绍。
2. 安装
从官网http://lcamtuf.coredump.cx/afl/下载最新版的源码(latest version),解压后进入所在目录。执行以下命令进行编译和安装:make sudo make install1
2
3
3. 对测试集进行fuzzing测试
在对测试集进行编译的时候把GCC编译器替换成afl-gcc, 在执行的过程中会遇到一些错误,但都给出了提示,如:
echo core > /proc/sys/kernel/core_pattern1
2
4. 对binutils进行fuzzing测试
GNU Binary Utilities或binutils是一整套的编程语言工具程序,用来处理许多格式的目标文件。下载之后解压,然后按一下步骤编译:cd ~/binutils-2.25** CC=afl-gcc ./configure make1
2
3
4
在binutils-2.25目录下新建afl_in 用于存放初始输入文件,新建afl_out文件夹用于保存fuzzing测试结果。
cd ~/binutils-2.25 mkdir afl_in afl_out cp /bin/ps afl_in/1
2
3
4
开始对reeelf程序进行测试
cd ~/binutils-2.25 afl-fuzz -i afl_in -o afl_out ./binutils/readelf -a @@1
2
3
在执行过程中,afl-fuzz会把@@替代测试样本,即之前拷贝到afl_in目录下的ps程序,所以最后实际执行的命令为 readelf -a ps
(没错,跑了两天也没跑出个CRASH=_=)执行命令:
5. 对ImageMagic软件进行fuzzing测试../afl-2.49b/afl-fuzz –i ../afl-testcases/jpeg/full/images –o ./fuzzoutput ./utilities/magick @@ 3.png1
其中,/afl-testcases/jpeg/full/images为afl官网提供的测试集,里面有大量的各种格式的且经过修剪处理的测试用例(jpeg格式文件就有8千多个),./utilities/magic是被测试程序,@@代表测试输入样本,即../afl-testcases/jpeg/full/images目录下的.jpeg文件,在实际执行时@@会被替换成实际的测试样本,3.png是随便命名的文件,主要是实现把.jpeg文件转换成.png文件的功能。
在运行十几个小时之后,出现了16个崩溃,然后就显示系统错误。http://lcamtuf.coredump.cx/afl/
6. 参考资料
http://www.evilsocket.net/2015/04/30/fuzzing-with-afl-fuzz-a-practical-example-afl-vs-binutils/#sthash.yXwN1BXb.ncLj9Cic.dpbs
相关文章推荐
- 使用Afl-fuzz (American Fuzzy Lop) 进行fuzzing测试(三)——技术白皮书(technical whitepaper)
- 使用Afl-fuzz (American Fuzzy Lop) 进行fuzzing测试(四)——直接对二进制进行fuzzing
- 使用Afl-fuzz (American Fuzzy Lop) 进行fuzzing测试(待续)
- 使用Afl-fuzz (American Fuzzy Lop) 进行fuzzing测试(二)——详细使用说明(README.txt)
- 使用Afl-fuzz (American Fuzzy Lop) 进行fuzzing测试(待续)
- AFL(American Fuzzy Lop)使用(三)
- AFL(American Fuzzy Lop)使用(一)
- AFL(American Fuzzy Lop)使用(二)
- 使用afl-fuzz的QEMU模式测试chome
- 如何使用AFL进行一次完整的fuzz过程
- 如何使用Burp Suite Macros绕过防护进行自动化fuzz测试
- American Fuzzy Lop(AFL)介绍
- 转:Fuzzing Apache httpd server with American Fuzzy Lop + persistent mode
- android-afl (American Fuzzy Lop for Anadroid)编译安装
- Fuzzing简介以及使用AFL对LibTIFF进行模糊测试
- maven系列学习之二:maven初体验-简单使用maven进行测试,编译、打包和运行
- 4000 Spring中用ApplicationContext进行测试的简单使用
- 使用 ConTest 进行多线程单元测试 - 为什么并行测试很困难以及如何使用 ConTest 辅助测试
- 使用jetty-maven-plugin插件进行测试
- 使用Drozer进行安全测试(Drozer github上开源项目)