Oops-re's Blog.

afl_Fuzzing学习

字数统计: 1.3k阅读时长: 4 min
2023/04/16

Fuzzing系列学习

参考:

HotSec/Fuzzing101: An step by step fuzzing tutorial. A GitHub Security Lab initiative

原理

生成随机输入并将其输入到目标程序中,以寻找程序中的漏洞

1
2
3
4
5
6
7
8
9
选择种子文件:AFL会选择一些种子文件,作为测试用例的基础,用于生成随机输入。种子文件可以是程序的正常输入,也可以是其他测试用例。

插桩和监视:AFL会对目标程序进行插桩和监视,以便在程序执行时收集关键信息,比如代码覆盖率、分支覆盖率、路径覆盖率等。AFL会利用这些信息,帮助生成更加有针对性的测试用例。

生成随机输入:AFL会根据已有的种子文件和关键信息,生成大量的随机输入,并将其输入到目标程序中。AFL使用一种称为“变异”的技术,对已有的输入进行微小的修改,以生成新的测试用例。

检测崩溃和异常:AFL会检测目标程序在执行测试用例时是否出现崩溃和异常情况。如果出现异常情况,AFL会将该测试用例标记为“有趣的”,并将其用作下一轮的种子文件,以便生成更多有针对性的测试用例。

迭代测试:AFL会不断迭代测试过程,生成新的测试用例,并使用已有的关键信息帮助生成更加有针对性的测试用例,以发现更多的漏洞。

主要流程

通过AFL生成大量变异文件

AFL输入这些变异数据,监控crash情况

测试产生crash的对应的变异文件 运行产生的错误

gdb调试,根据崩溃点找到漏洞

工具下载

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

测试 afl-fuzz

image-20230413160254000

Exercise 1 -Xpdf

Xpdf

1
XpdfReader 是一个免费的(但不是开源的)PDF查看器,它包含一些在开源xpdf查看器中找不到的额外功能。跨平台

开源的Xpdf工具包包含以下几个命令行工具,可以对PDF进行命令操作,实现对PDF文件多种转换操作及其他命令操作.

  • pdftotext:将PDF转换为文本
  • pdftops:将PDF转换为PostScript
  • pdftoppm:将PDF页面转换为netpbm(PPM / PGM / PBM)图像文件
  • pdftopng:将PDF页面转换为PNG图像文件
  • pdftohtml:将PDF转换为HTML
  • pdfinfo:提取PDF元数据
  • pdfimages:从PDF文件中提取原始图像
  • pdffonts:列出PDF文件中使用的字体
  • pdfdetach:从PDF文件中提取附件

fuzzing

这里其实是在源码中编译插桩了,这是有源码的情况下使用

image-20230413165703122

经历了3个小时多 终于crach了QAQ。。。。

吃了个饭。。洗了个澡,做了会儿作业…还没crash,还以为是它把洞修上了 结果 原来是我机器太拉了呀 放心了

🤡🤡🤡

崩溃复现

image-20230414185257247

image-20230414192656509

段错误,内存泄漏

分析原因

重新编译一下

1
2
3
4
5
6
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调试 查看崩溃点的堆栈信息

1
gdb --args $HOME/fuzzing_xpdf/install/bin/pdftotext $HOME/fuzzing_xpdf/out/default/crashes/id:000000,sig:11,src:001864,time:10787447,execs:6003676,op:havoc,rep:4 $HOME/fuzzing_xpdf/output

image-20230414192523166

???为啥我是在getchar的报错捏???不会是我ubuntu18的问题叭??挖到新洞了??

getchar也就是单字节?

image-20230414194113198

这是溢出点的代码

通过递归调用的,所以还是获得字符串

下个断点看看xxxxx PIE呢 怎么断xxxx哎呀 这是通过coredump文件调的拉 地址不变捏 可以断

原因

image-20230414204613162

向错误地址读取数据 往上看一下eax怎么来的

1
0x55555560122c <EmbedStream::getChar()+66>    mov    rax, qword ptr [rbp - 8]

参数传的

image-20230414205059474

这里传的

调了一下0x00005555555a2aae处的execOp 看了一下 循环free了 然后 突然就跳到getchar()了 看一下 是call rax跳的(虚函数?动态绑定) 跳到opBeginImage,然后最后来到getchar()

这里崩溃的原因是 EmbedStream 类没有初始化 导致成员函数limited为0,同时lenth也为0,执行了lenth–后,lenth=0xffffffffffffffff 然后 最后的崩毁 是没在虚表中找到getchar函数

嗷嗷 知道了这里就是由于没有初始化EmbedStream生成的对象 成员limited和lenth为0

image-20230416154548024

image-20230416154633812

看源码可以知道这里找的是strA 但由于strA没有初始化,是0(NULL)空 ,而这里又要调用str的方法,导致他无法正确寻址 找到无效地址 从而导致了崩溃

所以 这里应该是个BUG 修复的话就是判断一下str是否为NULL应该也可以,或者判断一下这个对象有没有初始化。

后面拿ubuntu20.04试了,雀氏是系统问题,20系统就是无限递归导致的栈溢出,

image-20230416125402504

这里引发的思考就是 怎么利用捏? 布兹道QAQ

怎么感觉 这就是一个程序的bug呀????能利用吗??拒绝服务??

CATALOG
  1. 1. Fuzzing系列学习
    1. 1.1. 原理
    2. 1.2. 主要流程
    3. 1.3. 工具下载
    4. 1.4. Exercise 1 -Xpdf
      1. 1.4.1. fuzzing
      2. 1.4.2. 崩溃复现
      3. 1.4.3. 分析原因