xpdf
0x00 环境准备
本实验均使用项目自带的虚拟机。
0x01 实验
1.1 环境准备
目录创建
cd $HOME
mkdir fuzzing_xpdf && cd fuzzing_xpdf/
安装依赖
sudo apt install build-essential
下载Xpdf3.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
libexif
0x00 环境准备
0x01 实验
1.1 环境准备
目录创建
cd $HOME
mkdir fuzzing_libexif && cd fuzzing_libexif/
安装依赖
cd libexif-libexif-0_6_14-release/
sudo apt-get install autopoint libtool gettext libpopt-dev
autoreconf -fvi
./configure --enable-shared=no --prefix="$HOME/fuzzing_libexif/install/"
make
make install
下载libexif0.6.14
wget https://github.com/libexif/libexif/archive/refs/tags/libexif-0_6_14-release.tar.gz
tar -xzvf libexif-0_6_14-release.tar.gz
然后安装exif0.6.15
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
make install
语料库获取
cd $HOME/fuzzing_libexif
wget https://github.com/ianare/exif-samples/archive/refs/heads/master.zip
unzip master.zip
1.2 FUZZING
1.3 分析
bt进行栈回溯。
发现最后两个函数是exif_loader_get_data和exif_data_load_data。分别打断点。重新run一边。
前两个函数exif_data_new_mem和exif_data_log都正常执行了,所以跟进exif_data_load_data里看看。
到了offset函数的时候注意一下。值明显很大,不正常。
随后offset+6+2 > ds这里产生了溢出。
最后data基址+offset的buff进行访问的时候出现了错误。
offset来源于exif_get_slong函数,函数将一块内存地址转换成32位无符号整数。
其对应的内存是
也就是解析TIFFheader,获取第一个IFDhader偏移量的地方,具体可以去看Exif结构。
文件中是偏移0x22处。如果该处数据是0xFFFFFFF8~0xFFFFFFFF也就是[-8,0)就会触发该漏洞。
以上是CVE-2012-2836。
关于CVE-2009-3895,笔者想换种方式去调试。
所以选择了eclipse。
安装如下:
sudo apt install default-jdk
tar -xzvf eclipse-cpp-2021-03-R-linux-gtk-x86_64.tar.gz
随后导入项目 File -> Import ->Existing code as makefile project
随后选择Linux GCC并选择exif的源文件夹。
在之后配置一下debug configuration。Run -> Debug Configurations
argument选择crash文件。
然后查看一下崩溃的点,这里访问[rsi]报错。
按理说堆栈应该如此,但是由于不知名原因,笔者的符号表似乎未识别完全,无法记录exif_entry_fix函数,并且打不进去断点。
exif_get_long传入buf为e->data + i *exif_format_get_size (EXIF_FORMAT_LONG),查看e->data是正常的那么问题就出现在
i *exif_format_get_size (EXIF_FORMAT_LONG)上,后者是一个定值,那么问题就出现在i上,i<e->componets,所以查看e->componets。
查看源头并查看e->componets的值,这里可以去文件对应看一下。
libexif
0x00 环境准备
0x01 实验
1.1 环境准备
目录创建
cd $HOME
mkdir fuzzing_tcpdump && cd fuzzing_tcpdump/
安装依赖
cd libexif-libexif-0_6_14-release/
sudo apt-get install autopoint libtool gettext libpopt-dev
autoreconf -fvi
./configure --enable-shared=no --prefix="$HOME/fuzzing_libexif/install/"
make
make install
下载tcpdump-4.9.2
wget https://github.com/the-tcpdump-group/tcpdump/archive/refs/tags/tcpdump-4.9.2.tar.gz
tar -xzvf tcpdump-4.9.2.tar.gz
然后libpcap-1.8.0
wget https://github.com/the-tcpdump-group/libpcap/archive/refs/tags/libpcap-1.8.0.tar.gz
tar -xzvf libpcap-1.8.0.tar.gz
我们需要重命名libpcap-libpcap-1.8.0为libpcap-1.8.0. 否则,tcpdump找不到libpcap.a本地路径:
mv libpcap-libpcap-1.8.0/ libpcap-1.8.0
构建并安装 libpcap:
cd $HOME/fuzzing_tcpdump/libpcap-1.8.0/
./configure --enable-shared=no
make
构建安装tcpdump:
cd $HOME/fuzzing_tcpdump/tcpdump-tcpdump-4.9.2/
./configure --prefix="$HOME/fuzzing_tcpdump/install/"
make
make install
启用ASAN对libpcap和tcpdump进行构建。
rm -r $HOME/fuzzing_tcpdump/install
cd $HOME/fuzzing_tcpdump/libpcap-1.8.0/
make clean
cd $HOME/fuzzing_tcpdump/tcpdump-tcpdump-4.9.2/
make clean
cd $HOME/fuzzing_tcpdump/libpcap-1.8.0/
export LLVM_CONFIG="llvm-config-11"
CC=afl-clang-lto ./configure --enable-shared=no --prefix="$HOME/fuzzing_tcpdump/install/"
AFL_USE_ASAN=1 make
cd $HOME/fuzzing_tcpdump/tcpdump-tcpdump-4.9.2/
AFL_USE_ASAN=1 CC=afl-clang-lto ./configure --prefix="$HOME/fuzzing_tcpdump/install/"
AFL_USE_ASAN=1 make
AFL_USE_ASAN=1 make install
开始fuzz
afl-fuzz -m none -i $HOME/fuzzing_tcpdump/tcpdump-tcpdump-4.9.2/tests/ -o $HOME/fuzzing_tcpdump/out/ -s 123 -- $HOME/fuzzing_tcpdump/install/sbin/tcpdump -vvvvXX -ee -nn -r @@
1.2 FUZZING
1.3 分析
由于是ASAN编译。直接运行crash就能得到报错信息。
$HOME/fuzzing_tcpdump/install/sbin/tcpdump -vvvvXX -ee -nn -r ~/fuzzing_tcpdump/out/default/crashes/id:000000,sig:06,src:008020,time:4930546,execs:4212141,op:havoc,rep:4
SUMMARY: AddressSanitizer: heap-buffer-overflow /home/fuzz/fuzzing_tcpdump/tcpdump-tcpdump-4.9.2/./extract.h:184:20 in EXTRACT_16BITS,说明是堆溢出。
不过这里和CVE-2017-13028对不上,CVE-2017-13028是BOOTP,但是这里的是ospf6。查看4.9.2版本源码,显然CVE-2017-13028已修复。
这里就不进行更深一步的分析了,暂时只fuzz,简单分析一下。具体哪一个,大家可以尝试一下,个人觉得这里也是类似CVE-2017-13028,是未使用ND_TCHECK检测是否有数据造成的溢出读。
文章评论