Fuzzing101 Execise2-libexif
CVE-2009-3895 (heap-based buffer overflow)and CVE-2012-2836 (Out-of-bounds Read)in libexif 0.6.14
Exif是一种文件格式,这是在网上搜索到的相关描述:
可交换图像文件格式(英语:Exchangeable image file format,官方简称Exif),是专门为数码相机的照片设定的,可以记录数码照片的属性信息和拍摄数据。
首先创建一个文件夹用于存放Fuzz目标:
1 | mkdir libexif && cd libexif |
找到libexif文件,下载并解压:
1 | wget https://sourceforge.net/projects/libexif/files/libexif/0.6.18/libexif-0.6.18.tar.gz |
因为libexif编译后是一个库文件,所以还需要下载使用库接口的应用程序,这里选择exif命令行0.6.15
1 | wget https://github.com/libexif/exif/archive/refs/tags/exif-0_6_15-release.tar.gz |
构建
首先回到libexif库文件目录下进行编译:
1 | sudo apt-get install autopoint libtool gettext libpopt-dev |
此时库文件已经编译好了,再进入exif目录进行编译:
1 | cd exif-exif-0_6_15-release/ |
测试exif能否运行只需要输入:
1 | $HOME/libexif/install/bin/exif |
此时应该看到如下内容:
下载exif的测试样本:
1 | git clone https://github.com/ianare/exif-samples.git |
下载好后进入目录,使用exif
命令随便查看一张图片的信息:
1 | $HOME/libexif/install/bin/exif Nikon_D70.jpg |
可以看到如下结果:
执行Fuzz
获取交互应用(如果调试的是库,需要调用接口fuzz)
- 自己写一个c程序调用接口,用afl提供的编译器编译出来
- 直接找调用了库文件的应用,这是这题采用的方法
这次使用afl-clang-lto作为编译器来构建程序,afl-clang-lto相比于afl-clang-fast是更好的选择,因为它是一种无碰撞检测,而且比afl-clang-fast 快。
先删除原先的安装,重新编译安装库
1 | rm -r $HOME/libexif/install |
重新编译应用
1 | cd $HOME/libexif/libexif-0.6.18/exif-exif-0_6_15-release |
然后就可以开始fuzz了
1 | afl-fuzz -i /home/fuzz/libexif/exif_samples/jpg/ -o /home/fuzz/libexif/out -s 123 -- /home/fuzz/libexif/install/bin/exif @@ |
使用GDB将crash文件输入到程序中:
1 | gdb --args /home/fuzz/libexif/install/bin/exif ./crash1.jpg |
报错如下
查看回溯
参考: