抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >

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
2
3
wget https://sourceforge.net/projects/libexif/files/libexif/0.6.18/libexif-0.6.18.tar.gz
tar -zxvf libexif-0.6.18.tar.gz
cd libexif-0.6.18

因为libexif编译后是一个库文件,所以还需要下载使用库接口的应用程序,这里选择exif命令行0.6.15

1
2
wget https://github.com/libexif/exif/archive/refs/tags/exif-0_6_15-release.tar.gz
tar -xzvf exif-0_6_15-release.tar.gz

构建

首先回到libexif库文件目录下进行编译:

1
2
3
4
5
sudo apt-get install autopoint libtool gettext libpopt-dev
autoreconf -fvi
./configure --enable-shared=no --prefix="/home/fuzz/libexif/install/"
make
make install

此时库文件已经编译好了,再进入exif目录进行编译:

1
2
3
4
5
cd exif-exif-0_6_15-release/
autoreconf -fvi //用于适配系统环境,简化config命令
./configure --enable-shared=no --prefix="/home/fuzz/libexif/install/" PKG_CONFIG_PATH=$HOME/libexif/install/lib/pkgconfig
make
make install

测试exif能否运行只需要输入:

1
$HOME/libexif/install/bin/exif

此时应该看到如下内容:

image-20220901135556442

下载exif的测试样本:

1
git clone https://github.com/ianare/exif-samples.git

下载好后进入目录,使用exif命令随便查看一张图片的信息:

1
$HOME/libexif/install/bin/exif Nikon_D70.jpg

可以看到如下结果:

image-20220901150455121

执行Fuzz

获取交互应用(如果调试的是库,需要调用接口fuzz)

  1. 自己写一个c程序调用接口,用afl提供的编译器编译出来
  2. 直接找调用了库文件的应用,这是这题采用的方法

这次使用afl-clang-lto作为编译器来构建程序,afl-clang-lto相比于afl-clang-fast是更好的选择,因为它是一种无碰撞检测,而且比afl-clang-fast 快。

先删除原先的安装,重新编译安装库

1
2
3
4
5
6
7
rm -r $HOME/libexif/install
cd $HOME/libexif/libexif-0.6.18
make clean
export LLVM_CONFIG="llvm-config-12"
CC=afl-clang-lto ./configure --enable-shared=no --prefix="$HOME/libexif/install"
make
make install

重新编译应用

1
2
3
4
5
6
cd $HOME/libexif/libexif-0.6.18/exif-exif-0_6_15-release
make clean
export LLVM_CONFIG="llvm-config-12"
CC=afl-clang-lto ./configure --enable-shared=no --prefix="$HOME/libexif/install/" PKG_CONFIG_PATH=$HOME/libexif/install/lib/pkgconfig
make
make install

然后就可以开始fuzz了

1
afl-fuzz -i /home/fuzz/libexif/exif_samples/jpg/ -o /home/fuzz/libexif/out -s 123 -- /home/fuzz/libexif/install/bin/exif @@

image-20220901152901726

使用GDB将crash文件输入到程序中:

1
gdb --args /home/fuzz/libexif/install/bin/exif ./crash1.jpg

报错如下

image-20220901153751834

查看回溯

image-20220901153858187

参考:

AFL++ Fuzz一个libexif例子 - unr4v31 - 博客园 (cnblogs.com)

评论