wtf (https://github.com/0vercl0k/wtf</https://github.com/0vercl0k/wtf>) 是基于具一种分布式、代码覆盖引导、快照可定制、的基基于快照的础使跨平台模糊器,设计用于 fuzz 在 Microsoft Windows 平台上运行的基于具用户模式或内核模式的目标。
在日常的快照 fuzz 的工作中,通常我们都需要先大致分析目标软件,的基然后对其输入点构造 harness ,础使才可以使用工具对 harness 进行 fuzz ,高防服务器基于具从而发现目标软件的快照潜在漏洞 。构造 harness 不是的基一件容易的事情 ,这取决于安全研究人员分析解构目标软件的础使程度,除此之外 ,基于具在部分软件中,快照只有进行完整的的基、复杂的初始化操作和预设,才能保证 harness 调用的亿华云输入点函数能够正常运行。
针对这一问题 ,基于快照的 fuzz 工具 wtf 吸引了我的注意;我们可以对正常运行的目标软件打下内存快照 ,然后对该内存快照进行 fuzz ,这种方式可以不必编写 harness ,并在一定程度上减少分析目标软件的成本。
本文从基于快照这一个特性出发,介绍 wtf 工具的基础使用和注意事项 。
本文实验环境 :
复制Windows 10 x64 专业版 Visual Studio 2019 WinDBG ProxmoxVE 7.2-31.2.3.4.在 github 上可以访问 wtf 的源码和 README(https://github.com/0vercl0k/wtf) :
image
作者提供了 4 篇使用 wtf 进行 fuzz 的实操文章:
Building a new snapshot fuzzer & fuzzing IDAFuzzing Modern UDP Game Protocols With Snapshot-based FuzzersFuzzing RDPEGFX with "what the fuzz"A Journey to Network Protocol Fuzzing – Dissecting Microsoft IMAP Client Protocol其中第一篇针对 IDA 的香港云服务器 fuzz,也是作者开发 wtf 的初衷 ,其中讲诉了 wtf 的开发历程并介绍了 wtf 的实现原理 。
通过以上文章 ,了解到使用 wtf 进行 fuzz 可以大致分为 3 个步骤:
复制1. 远程调试目标程序,并在合适的位置打下系统内存快照 2. 为内存快照编写 wtf 的 fuzz 模块/插件(也称为 harness) 3. 编译并启动 wtf 进行 fuzz1.2.3.为了方便下文叙述 ,这里先介绍如何源码编译 wtf。wtf 使用 ninja 进行构建,首先我们下载 ninja(https://ninja-build.org/</https://ninja-build.org/>) 并添加到环境变量PATH中,随后从 github 下载 wtf 源码 ,源码库打开 Visual Studio 的 x64 位开发者命令行工具(vs2019:x64 Native Tools Command Prompt for VS 2019):
复制# 进入 wtf 的 build 目录 $ cd C:\Users\john\Desktop\wtf-0.4\src\build # 执行 bat 脚本 $ .\build-release.bat1.2.3.4.执行如下 :
image
编译成功后 ,会在build目录下生成wtf.exe文件,该二进制文件将支撑我们全部的 fuzz 流程 。
wtf 提供了完整的测试用例 hevd / tlv_server,能够帮助我们快速上手 wtf,这里我们以 hevd 为例进行介绍;hevd(HackSys Extreme Vulnerable Windows Driver)是 Windows 内核驱动漏洞靶场(https://github.com/hacksysteam/HackSysExtremeVulnerableDriver</https://github.com/hacksysteam/HackSysExtremeVulnerableDriver>) ,以帮助安全研究员学习漏洞原理。
首先第一步是创建 hevd 运行时的系统内存快照,作者已经提供好了 https://github.com/0vercl0k/wtf/releases/download/v0.4/target-hevd.7z</https://github.com/0vercl0k/wtf/releases/download/v0.4/target-hevd.7z>,云计算下载解压后如下 :
image
第二步是编写 hevd 的 wtf fuzz 模块/插件 ,其插件代码属于 wtf 源码的一部分 ,在其中需要定义如何对快照进行初始化 ,如何向快照注入测试用例等操作,同样作者也提供了 https://github.com/0vercl0k/wtf/blob/main/src/wtf/fuzzer_hevd.cc</https://github.com/0vercl0k/wtf/blob/main/src/wtf/fuzzer_hevd.cc>