• AFL入门


    1 afl 是什么?

      American fuzzy lop 号称是当前最高级的Fuzzing 测试工具之一,由谷歌的Michal Zalewski 所开发。通过对源码进行重新编译时进行插桩(简称编译时插桩)的方式自动产生测试用例来探索二进制程序内部新的执行路径。与其他基于插桩技术的fuzzers 相比,afl-fuzz 具有较低的性能消耗,有各种高效的fuzzing 策略和tricks 最小化技巧,不需要先行复杂的配置,能无缝处理复杂的现实中的程序。当然AFL 也支持直接对没有源码的二进制程序进行测试,但需要QEMU 的支持,将在本文后面做详细介绍。

    2 安装

    从官网http://lcamtuf.coredump.cx/afl/ 下载最新版的源码(latest version),解压后进入所在目录。执行以下命令进行编译和安装:

    make
    sudo make install


    默认情况下,afl 相关的可执行文件会被安装到/usr/local/bin 目录下,我们看看安装了哪些工具,执行ls 命令(如图1):

    ls /usr/local/bin/afl*

    从图1可以看到,AFL 安装的文件,作用分别为:

    • afl-gcc 和afl-g++ 分别对应的是gcc 和g++ 的封装
    • afl-clang 和afl-clang++ 分别对应clang 的c 和c++ 编译器封装À。
    • afl-fuzz 是AFL 的主体,用于对目标程序进行fuzz。
    • afl-analyze 可以对用例进行分析,通过分析给定的用例,看能否发现用例中有意义的字段。
    • afl-qemu-trace 用于qemu-mode,默认不安装,需要手工执行qemu-mode 的编译脚本进行编译,后面会介绍。
    • afl-plot 生成测试任务的状态图
    • afl-tmin 和afl-cmin 对用例进行简化
    • afl-whatsup 用于查看fuzz 任务的状态
    • afl-gotcpu 用于查看当前CPU 状态
    • afl-showmap 用于对单个用例进行执行路径跟踪

    3.使用

    1.文件FUZZ

    官网有许多:略

    2.网络I/O

    1. 如果手头有被测程序的源码,可以修改源码,对网络接收报文的函数进行封装,改为从文件文件读取数据;
    2. 如果没有源码,或者不想修改代码这么麻烦的话,可以使用LD_PRELOAD 加载一些hook 库,替换掉recv、recv_from 等网路I/O 函数。preeny 是一个很好的选择À。我们以两个实际的例子,看看如何使用AFL 测试一个网络程序,分别对应修改源码和替换系统函数这两种方式。

     4.建议

    首先我们需要认识到AFL 的优劣势,选择适合的工具做合适的事情。AFL 设计之初就是用来做文件格式fuzz的,而且也测出了很多知名开源组件的漏洞,如:OpenSSH,ntpd,PHP,sqlite、FirefoxÀ该目录中的所有用例都是AFL 在FUZZ 过程中能导致目标程序异常退出的如何更有效地使用等等,这些漏洞的共同的特征是从文件中读取数据进行解析。AFL 未设计针对有特定状态机的复杂网络程序的fuzz,所以,像那些有复杂交互状态的网络程序,如通过一些交互报文建立一个会话,后续在此会话中处理输入,那么AFL 就不太适合了,peach 是更合适的选择。另外,AFL 目前也不支持fuzz 命令行参数,所以对于有些程序直接读取命令行参数中的内容,并对参数内容进行处理,AFL 也做不了。
    这里给出几个更有效使用AFL 的TIPS。

    1. 尽量使测试用例足够小

    大用例不光使得目标进程解析时需要耗费更多CPU 时间和更多内存,也会使得fuzz 进程效率非常低下。举个例子,如果要对一个图片处理程序进行fuzz,就没必要将高分辨率的照片作为用例,一个16x16 分辨率的图片就足矣。再举个例子,从数据上来看,如果一个用例的大小为100 字节,那么fuzz 1000 次,可以有71% 的机会触发到有问题的执行路径;如果用例的大小变为1k 字节,则同样的执行次数,触发有问题的分支的概率降低为%11;如果用例规模进一步增长,变为10k字节,则同样的执行次数,触发问题分支的概率将降低为%1。

    2. 确保测试对象足够简单

    有些基本的文件格式处理库被不同的处理程序使用,有些处理程序功能复杂,有些简单,那么,我们应该选择那些功能简单的处理程序来fuzz。举个例子,就图片格式处理程序来说,djpeg、readpng 以及gifhisto 要比ImageMagick 在执行效率上快5 到10 倍,但是他们都用同样的图片格式解析库。

    3. 只给需要测的库进行打桩因为AFL

    是在汇编级别对被测程序的源码进行插桩的,也就是说,插桩的点越多,编译出来的程序执行效率就会越低。那么,如果只想对其中某一个库进行fuzz 的话,可以用未插桩的库替换掉被测程序中使用AFL 编译器编译出来的库。

    4. 并行

    afl-fuzz 设计成只给工作进程分配一个核,现在的机器都具备多个CPU,每个CPU 又有多个核,所以我们可以最大地发挥硬件效率,同时执行多个afl-fuzz。

  • 相关阅读:
    数据库访问抽象基础类
    c#编码规范
    Ckeditor通过Ajax更新数据
    test
    能用钱解决的,绝不要花时间 过来人的11条人生经验
    关于servlet的一些学习总结
    java 实现群发邮件
    WEB前端性能优化
    用友u8各版本在输出的时候报错提示:外部数据库驱动程序(1)中的意外错误
    Winform入门见解
  • 原文地址:https://www.cnblogs.com/0xHack/p/9414444.html
Copyright © 2020-2023  润新知