Fuzzing101:Exercise 4 - LibTIFF 翻译+解题

Fuzzing101:Exercise  4 - LibTIFF 翻译+解题
题目链接:https://github.com/antonio-morales/Fuzzing101/tree/main/Exercise%204

在本次练习中,我们将对LibTIFF图像库进行模糊测试。目标是在LibTIFF 4.0.4中找到CVE-2016-9297的崩溃/PoC,并测量崩溃/PoC 的代码覆盖率数据。

你将学到什么:

完成此练习后,您将了解:

  • 如何使用 LCOV 测量代码覆盖率
  • 如何利用代码覆盖率数据提高模糊测试的有效性
环境:

所有的练习都在Ubuntu 20.04.2 LTS上进行了测试。强烈建议您使用相同的操作系统版本,以避免不同的模糊结果。

下载并构建目标:

让我们首先得到我们的fuzzing目标。为您想要fuzzing的项目创建一个新的目录

cd $HOME
mkdir fuzzing_tiff && cd fuzzing_tiff/

 下载并解压libtiff 4.0.4:

wget https://download.osgeo.org/libtiff/tiff-4.0.4.tar.gz
tar -xzvf tiff-4.0.4.tar.gz

构建并安装Libtiff:

cd tiff-4.0.4/
./configure --prefix="$HOME/fuzzing_tiff/install/" --disable-shared
make
make install

作为目标二进制文件,我们对tiffinfo进行模糊测试。作为种子输入语料库,我们将使用文件夹中的示例图像/test/images/

要测试一切是否正常工作,只需执行以下命令:

$HOME/fuzzing_tiff/install/bin/tiffinfo -D -j -c -r -s -w $HOME/fuzzing_tiff/tiff-4.0.4/test/images/palette-1c-1b.tiff

结果如图所示:

Fuzzing101:Exercise 4 - LibTIFF 翻译+解题_第1张图片

在最后一个命令行中,您可以看到我启用了所有这些标志:“-j -c -r -s -w”。这是为了提高代码覆盖率并增加发现错误的机会。

代码覆盖率

        代码覆盖率是一种软件指标,显示每行代码被触发的次数。通过使用代码覆盖率,我们将了解模糊器已达到代码的哪些部分,并可视化模糊测试过程。

首先,需要安装lcov。我们可以使用以下命令来完成:

sudo apt install lcov

现在,我们需要使用--coverage(编译器和链接器)重建LibTIFF:

rm -r $HOME/fuzzing_tiff/install
cd $HOME/fuzzing_tiff/tiff-4.0.4/
make clean
  
CFLAGS="--coverage" LDFLAGS="--coverage" ./configure --prefix="$HOME/fuzzing_tiff/install/" --disable-shared
make
make install

然后,我们可以通过输入以下内容来收集代码覆盖率数据:

cd $HOME/fuzzing_tiff/tiff-4.0.4/
lcov --zerocounters --directory ./
lcov --capture --initial --directory ./ --output-file app.info
$HOME/fuzzing_tiff/install/bin/tiffinfo -D -j -c -r -s -w $HOME/fuzzing_tiff/tiff-4.0.4/test/images/palette-1c-1b.tiff
lcov --no-checksum --directory ./ --capture --output-file app2.info

解释每条命令:

  • lcov --zerocounters --directory ./:重置之前的计数器
  • lcov --capture --initial --directory ./ --output-file app.info:返回“基线”覆盖率数据文件,其中包含每个检测线的覆盖率
  • $HOME/fuzzing_tiff/install/bin/tiffinfo -D -j -c -r -s -w $HOME/fuzzing_tiff/tiff-4.0.4/test/images/palette-1c-1b.tiff:运行您要分析的应用程序。您可以使用不同的输入多次运行它
  • lcov --no-checksum --directory ./ --capture --output-file app2.info:将当前覆盖状态保存到app2.info文件中

最后,生成HTML输入:

genhtml --highlight --legend -output-directory ./html-coverage/ ./app2.info

如果一切顺利,代码覆盖率报告将在该html-coverage文件夹中创建。只需打开该./html-coverage/index.html文件,您应该会看到如下内容:

模糊测试Fuzzing 

首先,我们将清理所有先前编译的目标文件和可执行文件:

rm -r $HOME/fuzzing_tiff/install
cd $HOME/fuzzing_tiff/tiff-4.0.4/
make clean

现在,我们在调用make之前设置AFL_USE_ASAN=1:

export LLVM_CONFIG="llvm-config-11"
CC=afl-clang-lto ./configure --prefix="$HOME/fuzzing_tiff/install/" --disable-shared
AFL_USE_ASAN=1 make -j4
AFL_USE_ASAN=1 make install

现在,您可以使用以下命令运行模糊器:

afl-fuzz -m none -i $HOME/fuzzing_tiff/tiff-4.0.4/test/images/ -o $HOME/fuzzing_tiff/out/ -s 123 -- $HOME/fuzzing_tiff/install/bin/tiffinfo -D -j -c -r -s -w @@

经过一段时间,您可以看到运行结果:

Fuzzing101:Exercise 4 - LibTIFF 翻译+解题_第2张图片

你可能感兴趣的:(Fuzzing101,学习)