Fuzzing101
Fuzzing01 项目地址 :https://github.com/antonio-morales/Fuzzing101
前言
通过该项目学习如何使用 fuzz 以及如何在真实环境中使用 fuzz。
Exercise 2
由于是跟着 sakura 的课进行学习,而视频是从 Exercise 2 开始的,因此先做这个。
这是一个第三方库 libexif 的 fuzz,按照以下的六个步骤来完成 Fuzz:
- 寻找到一个使用 libexif 库的应用程序。
- 创建出 exif 样本的种子语料库。
- 使用 AFL 或者 AFL++ 的编译器对 libexif 进行编译。
- 使用语料库种子作为输入对使用 exif 库的应用程序进行 Fuzz。
- 直到产生出一些 crashes。
- 对 crashes 进行分类,看看其是否能构成漏洞,并构建出相应的 PoC。
在 make afl-clang-fast 的时候,这几行代码需要删去才行。然后再执行make AFL_TRACE_PC=1
。
接下来就跟着项目一步步开始吧。先拉取 libexif-0.6.14,将其进行构建并安装
然后我们注意到接下来的是执行一个 configure 文件,是一个 sh 文件,注释标明其是用来创建 Makefile 文件的。使用 CXX 来指明编译器路径。
所以我们可以直接指定 CXX 指向的路径是 afl-clang-fast 以及 afl-clang-fast++。
然后再执行 configure 文件,创建出 Makefile 文件,但是其用的编译器已被替换:
检查文件是否已成功被插桩。
因为要 fuzz 的是第三方库,本身是不可执行的文件,存在问题的可能是他的 API 内部实现有漏洞,所以我们需要一个使用了这个第三方库的应用程序来进行 fuzz,因为之前已经把 afl-clang-fast 导入到环境变量里了,所以这边直接进行编译即可插桩。
然后如果是正常进行 fuzz,是需要自己去寻找语料种子的,种子的寻找有以下几种方案:
- github 上进行寻找或者 google 搜索。
- 使用其他类似功能的程序的语料
- 使用生成器生成(感觉可以考虑 chatGPT)
- 语料蒸馏:使用 AFL 自带的 tmin 和 cmin。
因为是第一次的学习使用,所以直接使用 fuzzing101 提供的种子进行学习。
到这里一切都准备就绪了,可以开始把 AFL 跑起来了
1 |
|
用的是 AFL-fuzz,会限制文件大小不能超过 1MB
先找出大于 1M 的样本
使用命令 find . -size +1M -exec rm {} \;
可以直接删除大于 1M 的样本。
然后就可以跑起来了。
对于上面的参数,需要了解的并不需要太多,如下的即可:
- run time:fuzzer 运行的总时长、
- last new path:距离上一次发现新路径的间隔时间。
- total path:总共发现的新路径数量。
- map density:覆盖密度,如果达到 百分之六七十的话,会容易产生碰撞。可以考虑重新跑过,或者修改 map_size 的大小。
如果想要多个 fuzzer 一起运行的话,可以增加一个 -M 参数开启主从模式,如下:
1 |
|
- 本文作者:ShouCheng
- 本文链接:http://shoucheng3.github.io/2023/03/05/2023-03-05-Fuzzing101/index.html
- 版权声明:本博客所有文章均采用 BY-NC-SA 许可协议,转载请注明出处!