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。

转载于:https://www.cnblogs.com/0xHack/p/9414444.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值