进行一个完整的fuzz过程

开始fuzzing

首先从github上把代码给克隆下来:
git clone https://github.com/brackeen/ok-file-formats.git

编写Fuzz程序

我们先编写一个程序将要测试的函数加进去,如下写出一个都jpg文件的程序main.c.

#include <stdio.h>
#include "ok_png.h"
int main(int _argc, char **_argv) {
    FILE *file = fopen(_argv[1], "rb");
    ok_png image = ok_png_read(file, OK_PNG_COLOR_FORMAT_BGRA | OK_PNG_PREMULTIPLIED_ALPHA);
    fclose(file);
    if (image.data)
    {
        /* code */
        printf("Got image ! Size: %li x %li \n", (long) image.width, (long) image.height);
        free(image.data);
    }
        
    return 0;
}

然后直接通过afl-gcc进行编译:
afl-gcc -g -o fuzz_png main.c ok_png.c ok_png.h
请添加图片描述
如图,编译完成后生成fuzz_png.

用AFL进行Fuzz

在开始fuzz之前,先测试一下程序是否正常
./fuzz_png png/test.png
请添加图片描述
正常运行!!!!准备fuzz
afl-fuzz -m none -t 1000 -i png -o out ./fuzz_png @@
请添加图片描述

Fuzz的性能优化

1.种子筛选

我们可以用 afl-cmin 和 afl-tmin 工具分别对这些测试用例实现“测试集精简化”、“测试用例最小化”,命令如下(在跟afl-fuzz一样的目录下)

#cmin
afl-cmin -i png -o newpng ./fuzz_png @@
#处理完成
mv png cmin_png
mv newpng png
#tmin
afl-tmin -d 1 -i png -o newpng ./fuzz_png @@
#处理完成
mv png tmin_png
mv newpng png
2.多线程

afl 自带了多线程的方式,通过设置主进程(-M)和从属进程(-S)来设置多个进程一起Fuzz,参数后面加名称(这个名称会在-o输出文件夹里单独用这个作为文件夹命令)
afl-fuzz -m none -t 500 -i png -o out -M fuzzM ./fuzz_png @@

3. 查看Fuzz的状态

进入Fuzz阶段之后,看到crash就停吗?万一没有看到crash呢?那么多进程要一个一个检查吗?
肯定不是的,首先要确定一个fuzz过程是不是该停止了最直观的办法是看右上角的cycle done,不是看数字,而是看颜色,当变成绿色的时候基本上就该停了,没多少新路径可以给你用了,这时候不管有没有crash其实再继续意义也不大了,不能说不可能有crash,只是几率极低了。

请添加图片描述

4. afl-whatsup

当开了很多进程的时候,比如30个,即使是用了screen,也不能一下一下的点这看吧,所以用afl-whatsup是最方便的方式,可以看到实时的fuzz进展。

afl-whatsup out_dir
#这里的out_dir是-o参数后面的,而不是-M或者-S后面的
5.afl-plot

还有一个工具afl-plot,论文上会经常看到一些图标,而且很多论文图表格式都一致,其实是afl-plot工具制作的,他会制作一个网页,下面带着三张图,就像这样:
请添加图片描述

结果分析

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值