小工具      在线工具  汉语词典  css  js  c++  java

Fuzzing101 系列练习 1 - Xpdf

python,开发语言,安全 额外说明

收录于:40天前

前言

Fuzzing101 系列包含针对 10 个现实世界目标的 10 个练习。在练习中逐步学习Fuzzing技术的知识。

模糊测试(Fuzzing/Fuzz)是一种自动化软件测试技术,其基础是向程序提供随机或变异的输入值并监视其是否存在异常和崩溃。

AFL、libFuzzer 和 HonggFuzz 是现实应用中最流行的三种模糊器,并且这三种都是覆盖引导的进化模糊器。在

  • 进化是一种受进化算法启发的元启发式算法,它基本上涉及通过使用选择标准(例如覆盖范围)随着时间的推移初始子集(种子)的进化和突变。

  • 覆盖引导意味着为了增加发现新崩溃的机会,覆盖引导模糊器收集并比较不同输入之间的代码覆盖数据,并选择那些导致新执行路径的输入。

在本练习中,我们将对 Xpdf PDF 查看器进行模糊测试。目标是在 XPDF 3.02 中找到 CVE-2019-13288 的崩溃/PoC。

CVE-2019-13288 是一个漏洞,可能会通过精心设计的文件导致无限递归。由于程序中调用的每个函数都会在栈上分配一个栈帧,如果一个函数被递归调用这么多次,就会导致栈内存耗尽,程序崩溃。因此,远程攻击者可以利用它进行DoS攻击。有关不受控递归漏洞的更多信息,请访问以下链接:https://cwe.mitre.org/data/definitions/674.html

你将学到什么

完成本练习后,您将了解 AFL 模糊测试的基础知识,例如:

  • 使用instrumentation编译目标应用程序

  • 运行模糊器 (afl-fuzz)

  • 使用调试器 (GDB) 对崩溃进行分类

环境

所有练习均在 Ubuntu 20.04.2 LTS 上进行测试。我强烈建议您使用相同的操作系统版本以避免不同的模糊测试结果,并在裸机硬件而不是虚拟机上运行 AFL 以获得最佳性能。

否则,您可以在此处找到 Ubuntu 20.04.2 LTS 镜像。用户名为 fuzz / fuzz

AFL 使用非确定性测试算法,因此两个模糊测试会话永远不会相同。我强烈建议设置一个固定的种子(-s 123),这样你的模糊测试结果将与本文的结果相似。

下载并构建目标

首先为要进行模糊测试的项目创建一个新目录:

cd $HOME
mkdir fuzzing_xpdf && cd fuzzing_xpdf/

为了充分准备环境,需要安装一些额外的工具(make和gcc)

sudo apt install build-essential

下载 Xpdf 3.02:

wget https://dl.xpdfreader.com/old/xpdf-3.02.tar.gz
tar -xvzf xpdf-3.02.tar.gz

构建 Xpdf:

cd xpdf-3.02
sudo apt update && sudo apt install -y build-essential gcc
./configure --prefix="$HOME/fuzzing_xpdf/install/"
make
make install

让我们首先下载一些 PDF 示例来测试 Xpdf:

cd $HOME/fuzzing_xpdf
mkdir pdf_examples && cd pdf_examples
wget https://github.com/mozilla/pdf.js-sample-files/raw/master/helloworld.pdf
wget http://www.africau.edu/images/default/sample.pdf
wget https://www.melbpc.org.au/wp-content/uploads/2017/10/small-example-pdf-file.pdf

使用以下命令测试 pdfinfo 二进制文件:

$HOME/fuzzing_xpdf/install/bin/pdfinfo -box -meta $HOME/fuzzing_xpdf/pdf_examples/helloworld.pdf

安装 AFL++

我们将使用最新版本的 AFL++ fuzzer (https://github.com/AFLplusplus/AFLplusplus)

安装依赖项

sudo apt-get update
sudo apt-get install -y build-essential python3-dev automake git flex bison libglib2.0-dev libpixman-1-dev python3-setuptools
sudo apt-get install -y lld-11 llvm-11 llvm-11-dev clang-11 || sudo apt-get install -y lld llvm llvm-dev clang 
sudo apt-get install -y gcc-$(gcc --version|head -n1|sed 's/.* //'|sed 's/\..*//')-plugin-dev libstdc++-$(gcc --version|head -n1|sed 's/.* //'|sed 's/\..*//')-dev

构建 AFL++

cd $HOME
git clone https://github.com/AFLplusplus/AFLplusplus && cd AFLplusplus
export LLVM_CONFIG="llvm-config-11"
make distrib
sudo make install

执行afl-fuzz,查看是否安装成功

了解 AFL++

AFL 是一个覆盖引导的模糊器(覆盖引导模糊器),这意味着它收集每个变异输入的覆盖信息,来发现新的执行路径和潜在的错误。当源代码可用时,AFL 可以使用插桩(instrumentation),在每个基本块(函数、循环等)的开头插入函数调用。

为了为我们的目标程序启用检测,我们需要使用 AFL 的编译器来编译源代码。

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

rm -r $HOME/fuzzing_xpdf/install
cd $HOME/fuzzing_xpdf/xpdf-3.02/
make clean

现在我们将使用 afl-clang-fast 编译器构建 xpdf:

export LLVM_CONFIG="llvm-config-11"
CC=$HOME/AFLplusplus/afl-clang-fast CXX=$HOME/AFLplusplus/afl-clang-fast++ ./configure --prefix="$HOME/fuzzing_xpdf/install/"
make
make install

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

afl-fuzz -i $HOME/fuzzing_xpdf/pdf_examples/ -o $HOME/fuzzing_xpdf/out/ -s 123 -- $HOME/fuzzing_xpdf/install/bin/pdftotext @@ $HOME/fuzzing_xpdf/output

每个选项的简要说明

  • -i 表示输入示例的目录

  • -o 表示 AFL + + 将存储的变异文件的目录

  • -s 表示要使用的静态随机种子

  • @@ 是占位符目标的命令行,AFL 将用每个输入文件名替换

fuzzer将会对每个不同的输入文件运行 $HOME/fuzzing_xpdf/install/bin/pdftotext <input-file-name> $HOME/fuzzing_xpdf/output 命令

如果出现错误,请根据提示执行以下操作:

sudo su
echo core >/proc/sys/kernel/core_pattern
exit

它运行成功了。等了一会儿,发现已经崩溃了。

可以在$HOME/fuzzing_xpdf/out/ 目录中找到这些崩溃文件。一旦发现第一次崩溃,就可以停止fuzzer,上图中已经出现了一个独特的崩溃。根据您的机器性能,最多可能需要一到两个小时才能发生崩溃。

为了完成这个练习,让我们尝试使用指定的文件重现崩溃,调试崩溃以找到问题,并修复问题。

重现崩溃情况

$HOME/fuzzing_xpdf/out/目录下找到 crash 对应的文件。文件名类似于id:000000,sig:11,src:000390,time:103613,execs:71732,op:havoc,rep:16

将此文件作为输入传递给 pdftotext

$HOME/fuzzing_xpdf/install/bin/pdftotext '/home/fuzz/fuzzing_xpdf/out/default/crashes/<your_filename>' $HOME/fuzzing_xpdf/output

它会导致分段错误并导致程序崩溃。

调试

使用 gdb 找出程序在此输入时崩溃的原因。

首先使用调试信息重建 Xpdf 以获取符号堆栈跟踪:

rm -r $HOME/fuzzing_xpdf/install
cd $HOME/fuzzing_xpdf/xpdf-3.02/
make clean
CFLAGS="-g -O0" CXXFLAGS="-g -O0" ./configure --prefix="$HOME/fuzzing_xpdf/install/"
make
make install

然后使用GDB,输入run

gdb --args $HOME/fuzzing_xpdf/install/bin/pdftotext $HOME/fuzzing_xpdf/out/default/crashes/<your_filename> $HOME/fuzzing_xpdf/output

然后输入bt回溯查看栈帧

发现有许多次Parser::getObj的调用,它们似乎表示一个无限递归。如果你去 https://www.cvedetails.com/cve/cve-2019-13288/ ,你可以看到描述符合我们从 GDB 得到的回溯。

实验推荐:Fuzz之AFL
链接:https://www.hetianlab.com/expc.do?ec=ECID5ec5-3232-4f16-8c14-c98b75f8915d&pk_campaign=weixin-wemedia#stu

. . .

相关推荐

额外说明

Java旋转图片工具类

前言: 本文提供可以任意角度(最小精度1度),旋转图片的Java工具类,旋转后的图片不会失真或丢失边角,根据角度参数,重新绘制图片,达到无损旋转的目的。 一.图片工具类 import java.awt.Dimension; import java.awt

额外说明

Leetcode练习3(查找特定字符串)

题目:给定一个字符串,找出不含有重复字符的最长子串的长度。 题解(1):写一个判断字符串是否有相同字符的函数,再写一个函数能够将字符串拆分成所有可能的子字符串并进行相同字符存在性判断,比较所有无相同字符串的字符串长度,返回最大字符串长度。 #includ

额外说明

C# 36.DataGridView 行号

1. 选择一行触发一个事件 private System.Windows.Forms.DataGridView dataGridView1; private void dataGridView1_RowHeaderMouseClick(objec

额外说明

【Java|多线程多并发】PCB基本流程及进程调度

文章目录 什么是进程 PCB的组成 PID 内存指针 文件描述符表 并行和并发 进程调度相关属性 进程的状态 优先级 上下文 进程的记账信息 什么是进程 进程是正在运行的程序的实例(an instance of a computer program th

额外说明

动态显示/隐藏 DataGrid 的列

在List中选中一个就会显示相应的 DataGrid 的列。    <?xml version="1.0" encoding="utf-8"?> <mx:Application xmlns:mx=">http://www.adobe.com/2006/m

额外说明

【OpenCV】⚠️高手勿入! 半小时学会基本操作 22⚠️ 傅里叶变换

【OpenCV】⚠️高手勿入! 半小时学会基本操作 22⚠️ 傅里叶变换 概述 高频 vs 低频 傅里叶变换 代码详解 输入转换 傅里叶变换 获取幅度谱 傅里叶逆变换 获取低频 获取高频 概述 OpenCV 是一个跨平台的计算机视觉库, 支持多语言, 功

额外说明

一文搞懂深度信念网络!DBN概念介绍与Pytorch实战

目录 一、概述 1.1 深度信念网络的概述 1.2 深度信念网络与其他深度学习模型的比较 结构层次 学习方式 训练和优化 应用领域 1.3 应用领域 图像识别与处理 自然语言处理 推荐系统 语音识别 无监督学习与异常检测 药物发现与生物信息学 二、结构

额外说明

SQL语言

SQL语言按功能分为四大类 1.数据查询语言DQL : 查询数据 2.数据定义语言DDL :建立、删除和修改数据对象 3.数据操纵语言DML :完成数据操作的命令,包括查询 4.数据控制语言DCL :控制对数据库的访问,服务器的关闭、启动等 显示数据库结

额外说明

【计算机网络】MTU和MSS

什么是MTU(Maximum Transmission Unit)? 最大传输单元MTU,是指网络能够传输的最大数据包大小,以字节为单位。 MTU是数据链路层的概念,指数据链路层对帧的数据部分长度的限制,即限制三层IP数据报的最大长度。 实际上,不同的厂

额外说明

【云服务器 ECS 实战】负载均衡 SLB 概述及配置选型

一、初识负载均衡 SLB 1. 负载均衡概述 2. 为什么要使用负载均衡 二、ECS 传统型负载均衡 CLB 服务的配置与创建 一、初识负载均衡 SLB 1. 负载均衡概述 负载均衡就是将访问流量根据转发策略分发到后端的多台服务器中。负载均衡建立在现有网

ads via 小工具