AFL入门学习<2>

AFL入门学习<2>

通用fuzz语法
afl-fuzz对于直接从stdin接受输入的目标二进制文件,通常的语法是:

./afl-fuzz -i testcase_dir -o findings_dir / path / to / program @@

对于从文件中获取输入的程序,使用“@@”标记目标命令行中应放置输入文件名的位置。模糊器将为您替换:

$ ./afl-fuzz -i testcase_dir -o findings_dir / path / to / program @@

此时afl会给我们返回一些信息,这里提示我们有些测试用例无效

afl-fuzz 2.52b by <lcamtuf@google.com>
[+] You have 2 CPU cores and 2 runnable tasks (utilization: 100%).
[*] Checking CPU core loadout...
[+] Found a free CPU core, binding to #0.
[*] Checking core_pattern...
[*] Setting up output directories...
[+] Output directory exists but deemed OK to reuse.
[*] Deleting old session data...
[+] Output dir cleanup successful.
[*] Scanning '../vuln/testcase/'...
[+] No auto-generated dictionary tokens to reuse.
[*] Creating hard links for all input files...
[*] Validating target binary...
[*] Attempting dry run with 'id:000000,orig:1'...
[*] Spinning up the fork server...
[+] All right - fork server is up.
    len = 3, map size = 1, exec speed = 295 us
[*] Attempting dry run with 'id:000001,orig:2'...
    len = 23, map size = 1, exec speed = 125 us
[!] WARNING: No new instrumentation output, test case may be useless.
[+] All test cases processed.

[!] WARNING: Some test cases look useless. Consider using a smaller set.
[+] Here are some useful stats:

    Test case count : 1 favored, 0 variable, 2 total
       Bitmap range : 1 to 1 bits (average: 1.00 bits)
        Exec timing : 125 to 295 us (average: 210 us)

[*] No -t option specified, so I'll use exec timeout of 20 ms.
[+] All set and ready to roll!

状态窗口
我们可以看到afl很快就给我们制造了崩溃
american fuzzy lop 2.52b (v1-afl)

┌─ process timing ─────────────────────────────────────┬─ overall results ─────┐
│        run time : 0 days, 0 hrs, 4 min, 19 sec       │  cycles done : 2477   │
│   last new path : 0 days, 0 hrs, 2 min, 27 sec       │  total paths : 3      │
│ last uniq crash : 0 days, 0 hrs, 4 min, 19 sec       │ uniq crashes : 1      │
│  last uniq hang : 0 days, 0 hrs, 2 min, 12 sec       │   uniq hangs : 1      │
├─ cycle progress ────────────────────┬─ map coverage ─┴───────────────────────┤
│  now processing : 2 (66.67%)        │    map density : 0.00% / 0.00%         │
│ paths timed out : 0 (0.00%)         │ count coverage : 1.00 bits/tuple       │
├─ stage progress ────────────────────┼─ findings in depth ────────────────────┤
│  now trying : havoc                 │ favored paths : 1 (33.33%)             │
│ stage execs : 1433/1536 (93.29%)new edges on : 2 (66.67%)             │
│ total execs : 2.32M                 │ total crashes : 93.1k (1 unique)       │
│  exec speed : 0.00/sec (zzzz...)    │  total tmouts : 8 (1 unique)           │
├─ fuzzing strategy yields ───────────┴───────────────┬─ path geometry ────────┤
│   bit flips : 0/1152, 0/1149, 0/1143                │    levels : 2          │
│  byte flips : 0/144, 0/14, 0/10                     │   pending : 0          │
│ arithmetics : 0/888, 0/25, 0/0                      │  pend fav : 0          │
│  known ints : 0/98, 0/390, 0/440                    │ own finds : 1          │
│  dictionary : 0/0, 0/0, 0/0                         │  imported : n/a        │
│       havoc : 2/1.50M, 0/819k                       │ stability : 100.00%    │
│        trim : 11.88%/64, 80.00%                     ├────────────────────────┘
└─────────────────────────────────────────────────────┘          [cpu000:102%] │
│ stage execs : 1432/1536 (93.23%)new edges on : 2 (66.67%)+++ Testing aborted by user +++       │ total crashes : 93.1k (1 unique)[+] We're done here. Have a nice day! │  total tmouts : 8 (1 unique)           │
├─ fuzzing strategy yields ───────────┴───────────────┬─ path geometry ────────┤

由上面AFL状态窗口:
① Process timing:Fuzzer运行时长、以及距离最近发现的路径、崩溃和挂起(超时)经过了多长时间。
已经运行4m19s,距离上一个最新路径已经过去2min27s,距离上一个独特崩溃已经过去4min19s(可见找到崩溃的速度非常快),距离上一次挂起已经过去2m12s。

② Overall results:Fuzzer当前状态的概述。

③ Cycle progress:我们输入队列的距离。队列一共有3个用例,现在是第二个,66.67%

④ Map coverage:目标二进制文件中的插桩代码所观察到覆盖范围的细节。

⑤ Stage progress:Fuzzer现在正在执行的文件变异策略、执行次数和执行速度。

⑥ Findings in depth:有关我们找到的执行路径,异常和挂起数量的信息。

⑦ Fuzzing strategy yields:关于突变策略产生的最新行为和结果的详细信息。

⑧ Path geometry:有关Fuzzer找到的执行路径的信息。

⑨ CPU load:CPU利用率
afl何时结束
(1) 状态窗口中”cycles done”字段颜色变为绿色该字段的颜色可以作为何时停止测试的参考,随着周期数不断增大,其颜色也会由洋红色,逐步变为黄色、蓝色、绿色。当其变为绿色时,继续Fuzzing下去也很难有新的发现了,这时便可以通过Ctrl-C停止afl-fuzz。
(2) 距上一次发现新路径(或者崩溃)已经过去很长时间
(3) 目标程序的代码几乎被测试用例完全覆盖
处理输出结果

$ tree ../vuln/out/
../vuln/out/
├── crashes
│   ├── id:000000,sig:11,src:000000,op:havoc,rep:64
│   └── README.txt
├── fuzz_bitmap
├── fuzzer_stats
├── hangs
├── plot_data
└── queue
    ├── id:000000,orig:1
    └── id:000001,orig:2

3 directories, 7 files

在输出目录中创建了三个子目录并实时更新:

queue: 测试每个独特执行路径的案例,以及用户提供的所有起始文件。
crashes: 导致被测程序接收致命信号的独特测试用例(例如,SIGSEGV,SIGILL,SIGABRT)。条目按接收信号分组。
hangs: 导致测试程序超时的独特测试用例。将某些内容归类为挂起之前的默认时间限制是1秒内的较大值和-t参数的值。可以通过设置AFL_HANG_TMOUT来微调该值,但这很少是必需的。
崩溃和挂起被视为“唯一” :如果相关的执行路径涉及在先前记录的故障中未见的任何状态转换。如果可以通过多种方式达到单个错误,那么在此过程中会有一些计数通货膨胀,但这应该会迅速逐渐减少。
fuzzer_stats:afl-fuzz的运行状态。
plot_data:用于afl-plot绘图。
1、riage_crashes
AFL源码的experimental目录中有一个名为triage_crashes.sh的脚本,可以帮助我们触发收集到的crashes。例如下面的例子中,11代表了SIGSEGV信号,有可能是因为缓冲区溢出导致进程引用了无效的内存;06代表了SIGABRT信号,可能是执行了abort\assert函数或double free导致,这些结果可以作为简单的参考。
代码覆盖率及其相关概念
GCOV:插桩生成覆盖率 LCOV:图形展示覆盖率 afl-cov:调用前两个工具计算afl测试用例的覆盖率

gcc插桩

-fprofile-arcs -ftest-coverage
$ gcc -fprofile-arcs -ftest-coverage ./v1.c -o v1-cov

afl-cov计算之前fuzzer的过程(结束后)

$ ../afl-2.52b/afl-cov/afl-cov -d ./out/ --enable-branch-coverage -c . -e "cat AFL_FILE | ./v1-cov AFL_FILE"

   Non-zero exit status '1' for CMD: /usr/bin/readelf -a cat

*** Imported 2 new test cases from: ./out//queue

    [+] AFL test case: id:000000,orig:1 (0 / 2), cycle: 0
        lines......: 100.0% (6 of 6 lines)
        functions..: 100.0% (2 of 2 functions)
        branches...: no data found

    Coverage diff (init) id:000000,orig:1
    diff (init) -> id:000000,orig:1
    New src file: /home/han/ck/vuln/v1.c
      New 'function' coverage: main()
      New 'function' coverage: vulnerable_function()
      New 'line' coverage: 11
      New 'line' coverage: 12
      New 'line' coverage: 13
      New 'line' coverage: 6
      New 'line' coverage: 8
      New 'line' coverage: 9

++++++ BEGIN - first exec output for CMD: cat ./out//queue/id:000000,orig:1 | ./v1-cov ./out//queue/id:000000,orig:1
        Hello, World
    ++++++ END

    [+] AFL test case: id:000001,orig:2 (1 / 2), cycle: 0
        lines......: 100.0% (6 of 6 lines)
        functions..: 100.0% (2 of 2 functions)
        branches...: no data found
    [+] Processed 2 / 2 test cases.

    [+] Final zero coverage report: ./out//cov/zero-cov
    [+] Final positive coverage report: ./out//cov/pos-cov
        lines......: 100.0% (6 of 6 lines)
        functions..: 100.0% (2 of 2 functions)
        branches...: no data found
    [+] Final lcov web report: ./out//cov/web/index.html
    ```
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值