AFL简易使用


AFL 简易使用

一、环境

名称 版本 链接
AFL 2.57B https://github.com/google/AFL
Ubuntu 18.04 https://ubuntu.com/
UPX 3.94 https://github.com/upx/upx.git
afl-cov 0.62 https://github.com/mrash/afl-cov#prerequisites

二、测试

  • vi test.c
#include<stdio.h>    
#include<stdlib.h>    
#include<string.h>    
      
int main(int argc, char* argv[]) {    
      char buf[100] = {0};    
      gets(buf);    
      printf("%s\n",buf);    
      return 0;    
 }   
  • 使用afl-gcc test.c

  • 创建输入输出文件夹,并初始化首个样本文件

  • 使用afl-fuzz -i fuzz_in -o fuzz_iout ./a.out

  • 如上图所示即为运行成功。

  • 在fuzz_iout 目录下存在crashes文件夹,里面存放着可以导致崩溃的文件

*如下图所示触发

三、fuzz upx

  • 首先拉取upx代码并切换到3.94版本
    git clone https://github.com/upx/upx.git
    cd upx
    git checkout v3.94

  • 拉取依赖(在当前目录下运行)
    git submodule update --init --recursive

  • 上面这一步是为了拉取src/lzma-sdk/目录下的代码

  • vim src/Makefile

    • CC = /usr/local/bin/afl-gcc (添加)
    • CXX ?= /usr/local/bin/afl-g++ (修改)
  • 安装 UCL

  • 进入upx目录执行make all

  • 编译完成之后就可以进行fuzz了

  • mkdir upx_in upx_out

  • cp /bin/touch upx_in

  • afl-fuzz -i upx_in -o upx_out -m 300 -t 300000 -- upx/src/upx.out @@

四、简易介绍

  • afl命令
    afl-gcc 和afl-g++ 分别对应的是gcc 和g++ 的封装 可以编译文件,并在源文件中添加特殊指令用于 afl fuzz 编译插装
    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 用于对单个用例进行执行路径跟踪
  • afl-fuzz 参数
    -i:指定测试样本所在目录;
    -o:指定测试结果存放目录;
    -M:运行主(Master) Fuzzer;
    -S:运行从属(Slave) Fuzzer;
    -t:设置程序运行超时值,单位为 ms;
    -m:最大运行内存,单位为 MB;
  • 窗口信息
    Process timing:Fuzzer运行时长、以及距离最近发现的路径、崩溃和挂起经过了多长时间。
    Overall results:Fuzzer当前状态的概述。
    Cycle progress:我们输入队列的距离。
    Map coverage:目标二进制文件中的插桩代码所观察到覆盖范围的细节。
    Stage progress:Fuzzer现在正在执行的文件变异策略、执行次数和执行速度。
    Findings in depth:有关我们找到的执行路径,异常和挂起数量的信息。
    Fuzzing strategy yields:关于突变策略产生的最新行为和结果的详细信息。
    Path geometry:有关Fuzzer找到的执行路径的信息。

五、afl-cov的使用

  • afl-cov主要是为了查看覆盖率,并且需要编译支持。
  • 首先拷贝一份upx的代码
    • cd upx_2

    • vi src/Makefile

    • 在上面更改的CC和CXX后面添加-fprofile-arcs -ftest-coverage

    • make all

 ./afl-cov/afl-cov -d fuzz_upx/upx_out/ --live --coverage-cmd="./upx/upx_2/src/upx.out  AFL_FILE" --code-dir="./upx/upx_2/src/"
  -d afl-fuzz 的输出目录
  --live 实施获取
 --coverage-cmd  被fuzz文件与AFL_FILE 为生成的例子
 --code-dir= 代码目录
  • 在upx_out 目录下存在cov目录,cov目录下存在web,可以使用python启动web服务器查看。
  • python启动web服务命令
    • python -m SimpleHTTPServer 80
  • 浏览器中访问
  • 根据上图所示,更改示例达到更好的fuzz效果。


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM