Fuzzing101-exe2

介绍

本文是 Fuzzing101 训练的第二篇,fuzz 对象是 libexif 库,目标是找到 CVE-2009-3895 的崩溃/PoC 和 CVE-2012-2836 的另一个崩溃

  • CVE-2009-3895:堆的缓冲区溢出,可以使用无效的 EXIF 图像触发
  • CVE-2012-2836:是一个越界读取漏洞,可以通过带有精心制作的 EXIF 标签的图像触发

将会学到的知识

  • 对使用了外部库的应用进行 fuzz
  • 使用 afl-clang-lto 进行 fuzz,它比 afl-clang-fast 的速度更快
  • 使用 Eclipse IDE 进行动态调试

流程

  1. 寻找使用了 libexif 库的应用接口
  2. 创建 exif 样例的种子语料库
  3. 使用 afl-clang-lto 编译 libexif 和选择的应用程序
  4. 对 libexif 进行fuzz
  5. 对 crash 进行分类过滤,确认每个漏洞的 PoC
  6. 修复漏洞

环境与搭建

工具还是使用的 AFL++,具体安装在 exe1 中已经写过了,这里就不多赘述了,只说一下 libexif 安装

下载并构建目标

先为项目创建一个文件夹

1
2
cd $HOME
mkdir fuzzing_libexif && cd fuzzing_libexif/

然后就是创建 libexif 环境了(官方给出的 libcxif 版本是 14 版本的,但是我试了很多次 make install 都会报错,看了网上其他师傅的博客发现 15 版本也可以,就直接用了)

1
2
3
4
5
6
7
8
9
10
11
# 下载
wget https://github.com/libexif/libexif/archive/refs/tags/libexif-0_6_15-release.tar.gz
tar -xzvf libexif-0_6_15-release.tar.gz

# 构建并安装
cd libexif-libexif-0_6_15-release/
sudo apt-get install autopoint libtool gettext libpopt-dev
autoreconf -fvi
./configure --enable-shared=no --prefix="$HOME/fuzzing_libexif/install/"
make
sudo make install

选择接口应用程序

由于 libexif 是一个库,所以还需要一个调用 libexif 库的程序。

1
2
3
4
5
6
7
8
9
10
11
# 下载
cd $HOME/fuzzing_libexif
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

# 构建并安装
cd exif-exif-0_6_15-release/
autoreconf -fvi
./configure --enable-shared=no --prefix="$HOME/fuzzing_libexif/install/" PKG_CONFIG_PATH=$HOME/fuzzing_libexif/install/lib/pkgconfig
make
sudo make install

键入指令查看是否安装成功

1
HOME/fuzzing_libexif/install/bin/exif

image-20220303132212339

种子语料库创建

因为程序本身的功能就是解析 exif 文件,所以要选取一些 exif 文件作为种子,项目中已经给出了链接地址,只需要下载即可

1
2
3
cd $HOME/fuzzing_libexif
wget https://github.com/ianare/exif-samples/archive/refs/heads/master.zip
unzip master.zip

键入指令查看是否成功

1
$HOME/fuzzing_libexif/install/bin/exif $HOME/fuzzing_libexif/exif-samples-master/jpg/Canon_40D_photoshop_import.jpg

image-20220303132707277

Afl-clang-lto 仪表

使用 afl-clang-lto 重新对 libexif 和 exif 进行编译

1
2
3
4
5
6
7
8
9
10
11
12
13
14
rm -r $HOME/fuzzing_libexif/install
cd $HOME/fuzzing_libexif/libexif-libexif-0_6_14-release/
make clean
export LLVM_CONFIG="llvm-config-11"
CC=afl-clang-lto ./configure --enable-shared=no --prefix="$HOME/fuzzing_libexif/install/"
make
make install

cd $HOME/fuzzing_libexif/exif-exif-0_6_15-release
make clean
export LLVM_CONFIG="llvm-config-11"
CC=afl-clang-lto ./configure --enable-shared=no --prefix="$HOME/fuzzing_libexif/install/" PKG_CONFIG_PATH=$HOME/fuzzing_libexif/install/lib/pkgconfig
make
make install

Fuzzing

1
afl-fuzz -i $HOME/fuzzing_libexif/exif-samples-master/jpg/ -o $HOME/fuzzing_libexif/out/ -s 123 -- $HOME/fuzzing_libexif/install/bin/exif @@

界面

image-20220303133742115

Debug

exe1 使用的是 gdb 调试,这一次要用 Eclipse IDE 调试

首先要先安装 Eclipse IDE

1
2
3
4
5
6
7
# 安装Java环境
sudo apt install default-jdk

# download and run Eclipse
cd %HOME/fuzzing_libexif
wget https://download.eclipse.org/technology/epp/downloads/release/2021-06/R/eclipse-cpp-2021-06-R-linux-gtk-x86_64.tar.gz
tar -zxvf eclipse-cpp-2021-06-R-linux-gtk-x86_64.tar.gz

解压完成后,直接运行 eclipse 即可

运行后会有一个界面,直接点 launch 即可

image-20220303135122078

在菜单栏中找到 File->Import,会出现以下界面,选择好 “Existing code as makefile project” 后 next

image-20220303135346875

继续设置

image-20220303135733252

如果一切顺利,应该能够在项目资源管理器选项卡中看到 “exif” 文件夹。

image-20220303135829759

接着是配置调试参数,需要去Run -> Debug Configurations进行设置。

image-20220303140049035

Argument 中设置好报错文件位置

image-20220303140200374

设置完成后就可以直接 Debug 了,程序会在主函数的开始处停止

Run -> resume就可以直接追溯到报错的地方

image-20220303140324572