基于快照的 Fuzz 工具 Wtf 的基础使用
基于快照的 Fuzz 工具 Wtf 的基础使用
作者:知道创宇404实验室 2023-07-04 08:28:27安全 应用安全 在日常的 fuzz 的工作中,通常我们都需要先大致分析目标软件,然后对其输入点构造 harness,才可以使用工具对 harness 进行 fuzz,从而发现目标软件的潜在漏洞。前言
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 2019WinDBGProxmoxVE 7.2-31. wtf概要
在 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 进行 fuzz为了方便下文叙述,这里先介绍如何源码编译 wtf。wtf 使用 ninja 进行构建,首先我们下载 ninja(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.bat执行如下:
image
编译成功后,会在build目录下生成wtf.exe文件,该二进制文件将支撑我们全部的 fuzz 流程。
2. fuzz hevd
wtf 提供了完整的测试用例 hevd / tlv_server,能够帮助我们快速上手 wtf,这里我们以 hevd 为例进行介绍;hevd(HackSys Extreme Vulnerable Windows Driver)是 Windows 内核驱动漏洞靶场(https://github.com/hacksysteam/HackSysExtremeVulnerableDriver),以帮助安全研究员学习漏洞原理。
首先第一步是创建 hevd 运行时的系统内存快照,作者已经提供好了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,如下:
image
通过build-release.bat重新编译 wtf 以添加 hevd 插件,target-hevd已经准备好了工作目录,如下:
$ tree target-hevdtarget-hevd├── inputs输入/测试用例/样本种子文件├── outputs 输出/wtf发现的可产生不同的路径的测试用例├── coverage覆盖率文件夹├── crashes 保存触发 crash 的测试用例└── state 快照文件夹,包含内存dump(`mem.dmp`)和CPU状态`regs.json`$ hexdump -C target-hevd/inputs/ioctl.bin 000000003b 20 22 00 |; ".|00000004随后便可以使用wtf.exe进行 fuzz,wtf 的 fuzz 分为 server 节点和 fuzz 节点,服务器节点负责聚合代码覆盖率、语料库,生成测试用例并将其分发给客户端,fuzz 节点运行由服务器生成和分发的测试用例,并将结果传回服务器(代码覆盖率/结果等)。
$ cd C:\Users\john\Desktop\wtf-0.4\src\build# 首先启动 server 节点# master 指定为 server 节点# --name 指定插件模块为 hevd# --max_len 设置最大测试用例长度# --runs 设置生成测试用例的个数# --target 设置工作目录$ .\wtf.exe master --name hevd --max_len=1028 --runs=10000000 --target C:\Users\john\Desktop\target-hevd# 再启动一个 fuzz 节点# fuzz 指定为 fuzz 节点# --backend 指定执行后端为 bochscpu(还支持 whv/kvm)$ .\wtf.exe fuzz --name hevd --backend=bochscpu --target C:\Users\john\Desktop\target-hevd执行如下:
image
运行一段时间后我们将收获 crash,本文这里不进行扩展分析。
3. demo程序
target-hevd示例能够让我们快速的上手 wtf,现在我们提供个 demo 程序以便完整的学习 wtf 的基本使用,编写 demo 程序如下:
#define _CRT_SECURE_NO_WARNINGS#include在main()函数的起始位置,我们设置了一个ready标志等待用户输入一个字符后,再执行真正代码逻辑,这样可以方便我们后续调试该程序进行快照操作;随后 demo 程序接收用户输入的字符串,将该字符串传入核心函数fuzzme()进行处理,在该函数中将逐字节检查用户输入是否等于test,满足条件后若第 5 个字节为1,则手动触发空指针访问异常,若第 5 个字节为2,则手动触发 GS cookie 异常,其他则调用printf()输出。
我们将该 demo 程序编译为wtf_test.exe,接下来的目标则是使用 wtf 对该二进制程序的fuzzme()函数进行 fuzz,找到其中的两个异常错误;同样按照上文的三大步进行。
4. 内存快照
首先我们需要搭建双机调试环境来获取二进制运行时的内存快照,官方推荐使用 hyper-v 虚拟机作为执行环境,我这里使用 ProxmoxVE 虚拟机环境也一样;运行的虚拟机(debuggee)使用 1C4G 的配置,调试主机(debugger)的环境不做要求,需要注意一点,由于打内存快照涉及到大量的数据通信,双机调试一定要使用网络调试进行,实验环境搭建如下:
image
在debuggee上使用命令开启 powershell 配置网络双机调试如下:
# 开启 debug$ bcdedit /debug on# 设置网络调试参数# 设置 debugger 的 ip 地址为 10.0.25.191# 设置被调试机的端口为 50000# 设置被调试机的连接密码为 p.a.s.s$ bcdedit /dbgsettings NET HOSTIP:10.0.25.191 PORT:50000 KEY:p.a.s.s# 查看调试配置$ bcdedit /dbgsettings除此之外,我们还需要关闭 Windows 的 KVA(Kernel Virtual Address) shadow 功能,否则 wtf 执行快照时将出现内存分页错误的问题,可以使用作者提供的脚本(https://github.com/0vercl0k/wtf/blob/main/scripts/disable-kva.cmd)进行关闭:
REM To disable mitigations for CVE-2017-5715 (Spectre Variant 2) and CVE-2017-5754 (Meltdown)REM https://support.microsoft.com/en-us/help/4072698/windows-server-speculative-execution-side-channel-vulnerabilitiesreg add "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management" /v FeatureSettingsOverride /t REG_DWORD /d 3 /freg add "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management" /v FeatureSettingsOverrideMask /t REG_DWORD /d 3 /f如果关闭 KVA shadow 后若还出现内存分页错误,可尝试使用https://github.com/0vercl0k/lockmem对内存进行锁定再进行快照。
随后使用debugger使用 WinDBG 网络调试连接debuggee,随后在debuggee上执行wtf_test.exe程序,在 WinDBG 中进入目标进程空间如下:
image
此时,我们需要选择一个「合适」的内存快照位置,因为 wtf 将会以该快照作为起始运行状态,在wtf_test.exe中,我们的目标函数是fuzzme(),所以我们在fuzzme()函数入口打下断点,并在wtf_test.exe程序中分别输入g和1234以运行到断点处,如下:
image
随后我们使用 WinDBG 的插件 bdump (https://github.com/yrp604/bdump)对此刻的运行状态进行快照:
# 加载 bdump.js 脚本kd> .scriptload C:\Users\john\Desktop\bdump\bdump.js# 打下内存快照,保存在 state 文件夹中kd> !bdump_active_kernel "C:\\Users\\john\\Desktop\\state"执行如下:
image
在本文的实验环境下,打内存快照大约需要 40 min。
5. 编写wtf插件
随后我们为 demo 程序编写 wtf 的插件,我们可以以https://github.com/0vercl0k/wtf/blob/main/src/wtf/fuzzer_hevd.cc作为模板进行改写。
插件主要需要实现Init()和InsertTestcase()两个函数,wtf 加载内存快照后,将停留在我们打下断点/打下快照的位置,然后首先调用一次插件的Init()函数,在该函数中一般定义了:1.快照运行到何处停止、2.如何处理异常错误、3.如何处理IO 等操作,完成初始化操作后,随后将在每次执行快照前,调用InsertTestcase()函数注入测试用例。
编写 demo 的 wtf 插件如下:
#include "backend.h"#include "targets.h"#include "crash_detection_umode.h"#include需要注意的是,由于快照不具备 IO 访问能力,发生 IO 操作时 wtf 无法正确处理,所以我们应该尽量选择一个「合适」的快照点;对于无法避免的 IO 操作,我们可以采用 patch 的方式修改逻辑,如 demo 程序中的printf()函数调用,我们在Init()中进行 patch,不会执行真正的printf()功能。
通过build-release.bat重新编译 wtf 以添加 demo 插件。
6. fuzz demo
首先我们准备好工作目录如下,其中state目录就是我们上文打下的内存快照:
$ tree workdirworkdir├── inputs├── outputs├── coverage├── crashes└── state$ cat workdir/inputs/1.txt1234在进行 fuzz 之前,我们先使用 wtf 的run子命令,检查内存快照和插件是否正确运行:
$ cd C:\Users\john\Desktop\wtf-0.4\src\build# 指定为 run 子命令# --name 指定插件模块为 demo# --state 指定内存快照文件夹# --backend 指定执行后端为 bochscpu# --input 指定输入文件$ .\wtf.exe run --name demo --state C:\Users\john\Desktop\workdir\state\ --backend=bochscpu --input C:\Users\john\Desktop\workdir\inputs\1.txt执行如下:
image
如果不能按预期执行,可以使用run命令生成路径覆盖,随后根据执行路径分析问题,下文我们将介绍在 wtf 如何获取路径覆盖。
随后我们便可以对其进行 fuzz:
$ cd C:\Users\john\Desktop\wtf-0.4\src\build# 启动 server 节点$ .\wtf.exe master --name demo --max_len=6 --runs=10000000 --target C:\Users\john\Desktop\workdir# 启动一个 fuzz 节点$ .\wtf.exe fuzz --name demo --backend=bochscpu --target C:\Users\john\Desktop\workdir启动执行 2min 即可获得 crash 如下:
image
其 crash 文件如下,顺序寻找到我们埋在 demo 程序中的两个异常错误:
image
7. 覆盖率
使用 wtf 的run子命令还可以生成路径覆盖,配合 IDA 以及 lighthouse 插件可以帮助我们排查 fuzz 问题和衡量 fuzz 的质量,如下:
$ cd C:\Users\john\Desktop\wtf-0.4\src\build# 指定为 run 子命令# --trace-path 设置覆盖率输出文件夹# --trace-type 设置路径类型为 cov$ .\wtf.exe run --name demo --state C:\Users\john\Desktop\workdir\state\ --backend=bochscpu --input C:\Users\john\Desktop\workdir\inputs\1.txt --trace-path=C:\Users\john\Desktop\workdir\coverage --trace-type=cov执行完毕后将在C:\Users\john\Desktop\workdir\coverage下生成1.txt.trace文件,该文件没有符号化不能直接使用,使用作者提供的工具 symbolizer(https://github.com/0vercl0k/symbolizer) 对其进行符号化处理:
$ cd C:\Users\john\Desktop\workdir\coverage# --input 指定输入文件# --crash-dump 指定内存快照文件# -o 设置输出文件# --style 指定符号化类型$ C:\Users\john\Desktop\symbolizer\symbolizer.exe --input .\1.txt.trace --crash-dump C:\Users\john\Desktop\workdir\state\mem.dmp -o cov.txt --style modoff执行完毕后,将在指定目录下生成符号化的路径覆盖文件cov.txt,如下:
image
随后在 IDA 中加载wtf_test.exe文件,并使用 lighthouse 插件加载覆盖率文件如下:
image
8. References
[1]https://github.com/0vercl0k/wtf
[2]https://github.com/0vercl0k/wtf/issues/14
[3]https://github.com/0vercl0k/lockmem[4]https://github.com/0vercl0k/symbolizer
[5]https://github.com/yrp604/bdump
[6]https://msrc.microsoft.com/blog/2018/03/kva-shadow-mitigating-meltdown-on-windows/
[7]https://blog.ret2.io/2021/07/21/wtf-snapshot-fuzzing/
责任编辑:武晓燕 来源:FreeBuf.COM wtffuzz工具推荐系统
电脑公司Ghost Win8.1 x32 精选纯净版2022年7月(免激活) ISO镜像高速下载
语言:中文版系统大小:2.98GB系统类型:Win8电脑公司Ghost Win8.1x32位纯净版V2022年7月版本集成了自2022流行的各种硬件驱动,首次进入系统即全部硬件已安装完毕。电脑公司Ghost Win8.1x32位纯净版具有更安全、更稳定、更人性化等特点。集成最常用的装机软件,精心挑选的系统维护工具,加上绿茶独有
微软Win11原版22H2下载_Win11GHOST 免 激活密钥 22H2正式版64位免费下载
语言:中文版系统大小:5.13GB系统类型:Win11微软Win11原版22H2下载_Win11GHOST 免 激活密钥 22H2正式版64位免费下载系统在家用办公上跑分表现都是非常优秀,完美的兼容各种硬件和软件,运行环境安全可靠稳定。Win11 64位 Office办公版(免费)优化 1、保留 Edge浏览器。 2、隐藏“操作中心”托盘图标。 3、保留常用组件(微软商店,计算器,图片查看器等)。 5、关闭天气资讯。
Win11 21H2 官方正式版下载_Win11 21H2最新系统免激活下载
语言:中文版系统大小:4.75GB系统类型:Win11Ghost Win11 21H2是微软在系统方面技术积累雄厚深耕多年,Ghost Win11 21H2系统在家用办公上跑分表现都是非常优秀,完美的兼容各种硬件和软件,运行环境安全可靠稳定。Ghost Win11 21H2是微软最新发布的KB5019961补丁升级而来的最新版的21H2系统,以Windows 11 21H2 22000 1219 专业版为基础进行优化,保持原汁原味,系统流畅稳定,保留常用组件
windows11中文版镜像 微软win11正式版简体中文GHOST ISO镜像64位系统下载
语言:中文版系统大小:5.31GB系统类型:Win11windows11中文版镜像 微软win11正式版简体中文GHOST ISO镜像64位系统下载,微软win11发布快大半年了,其中做了很多次补丁和修复一些BUG,比之前的版本有一些功能上的调整,目前已经升级到最新版本的镜像系统,并且优化了自动激活,永久使用。windows11中文版镜像国内镜像下载地址微软windows11正式版镜像 介绍:1、对函数算法进行了一定程度的简化和优化
微软windows11正式版GHOST ISO镜像 win11下载 国内最新版渠道下载
语言:中文版系统大小:5.31GB系统类型:Win11微软windows11正式版GHOST ISO镜像 win11下载 国内最新版渠道下载,微软2022年正式推出了win11系统,很多人迫不及待的要体验,本站提供了最新版的微软Windows11正式版系统下载,微软windows11正式版镜像 是一款功能超级强大的装机系统,是微软方面全新推出的装机系统,这款系统可以通过pe直接的完成安装,对此系统感兴趣,想要使用的用户们就快来下载
微软windows11系统下载 微软原版 Ghost win11 X64 正式版ISO镜像文件
语言:中文版系统大小:0MB系统类型:Win11微软Ghost win11 正式版镜像文件是一款由微软方面推出的优秀全新装机系统,这款系统的新功能非常多,用户们能够在这里体验到最富有人性化的设计等,且全新的柔软界面,看起来非常的舒服~微软Ghost win11 正式版镜像文件介绍:1、与各种硬件设备兼容。 更好地完成用户安装并有效地使用。2、稳定使用蓝屏,系统不再兼容,更能享受无缝的系统服务。3、为
雨林木风Windows11专业版 Ghost Win11官方正式版 (22H2) 系统下载
语言:中文版系统大小:4.75GB系统类型:雨林木风Windows11专业版 Ghost Win11官方正式版 (22H2) 系统下载在系统方面技术积累雄厚深耕多年,打造了国内重装系统行业的雨林木风品牌,其系统口碑得到许多人认可,积累了广大的用户群体,雨林木风是一款稳定流畅的系统,一直以来都以用户为中心,是由雨林木风团队推出的Windows11国内镜像版,基于国内用户的习惯,做了系统性能的优化,采用了新的系统
雨林木风win7旗舰版系统下载 win7 32位旗舰版 GHOST 免激活镜像ISO
语言:中文版系统大小:5.91GB系统类型:Win7雨林木风win7旗舰版系统下载 win7 32位旗舰版 GHOST 免激活镜像ISO在系统方面技术积累雄厚深耕多年,加固了系统安全策略,雨林木风win7旗舰版系统在家用办公上跑分表现都是非常优秀,完美的兼容各种硬件和软件,运行环境安全可靠稳定。win7 32位旗舰装机版 v2019 05能够帮助用户们进行系统的一键安装、快速装机等,系统中的内容全面,能够为广大用户
相关文章
- u盘装系统win7图文详细教程图解
- 做人就要赶时髦 高端Win8触控超极本推荐_超极本导购_太平洋电脑网PConline
- epic无主之地2卡顿严重处理办法(图文)
- 量产成功的U盘在845GV主板上打开不了怎样办?
- 阿里旺旺可以加多少个好友?_其它聊天
- win10更新失败蓝屏如何修复 win10更新失败蓝屏修复方法【详解】
- win7系统禁止别人访问c盘的设置方法-系统城
- win8系统打开iis服务器的操作流程
- 年底大降价 华硕A550JK4710特价5699元
- 微信迅速返回顶部的小技巧_微信
- 如何实现两个视频在一个屏幕上同时播放?
- Linux网络流量安全审计的神器-linux流量控制
- mswin7 msvcr90.dllvcp90.dll下载
- win10电脑弹窗怎么办 win10电脑弹窗解决方法【详解】
- 逆水寒手游最新二测,全网最公平测评
- vm虚拟机教程 Win7系统
- 装机高手教你运用卡片式U盘
- win7怎样打开休眠模式本文教您怎样打开
热门系统
- 1华硕笔记本&台式机专用系统 GhostWin7 32位正式旗舰版2018年8月(32位)ISO镜像下载
- 2深度技术 Windows 10 x86 企业版 电脑城装机版2018年10月(32位) ISO镜像免费下载
- 3电脑公司 装机专用系统Windows10 x86喜迎国庆 企业版2020年10月(32位) ISO镜像快速下载
- 4雨林木风 Ghost Win7 SP1 装机版 2020年4月(32位) 提供下载
- 5深度技术 Windows 10 x86 企业版 六一节 电脑城装机版 版本1903 2022年6月(32位) ISO镜像免费下载
- 6深度技术 Windows 10 x64 企业版 电脑城装机版2021年1月(64位) 高速下载
- 7新萝卜家园电脑城专用系统 Windows10 x64 企业版2019年10月(64位) ISO镜像免费下载
- 8新萝卜家园 GhostWin7 SP1 最新电脑城极速装机版2018年8月(32位)ISO镜像下载
- 9电脑公司Ghost Win8.1 x32 精选纯净版2022年5月(免激活) ISO镜像高速下载
- 10新萝卜家园Ghost Win8.1 X32 最新纯净版2018年05(自动激活) ISO镜像免费下载
热门文章
常用系统
- 1电脑公司win10 64位热门装机版 v2023.04下载
- 2番茄花园 GHOST WIN10 X86 极速体验版 V2020.01 (32位) 下载
- 3萝卜家园Win7全能驱动旗舰版下载_萝卜家园Win7 32位旗舰版下载V2023.09
- 4番茄花园 GHOST WIN7 SP1 X86 完美装机版 V2018.07 (32位) 下载
- 5技术员联盟Win7系统_技术员联盟Ghost Win7 32位旗舰版下载
- 6电脑公司 装机专用系统Windows10 x64 企业版2021年10月(64位) ISO镜像高速下载
- 7Win11官方原版下载_Win11官方原版ISO镜像下载
- 8电脑公司 装机专用系统Windows10 x86企业版 版本1903 2022年4月(32位) ISO镜像快速下载
- 9番茄花园GhostWin7 SP1电脑城极速装机版2022年5月(32位) 最新高速下载
- 10番茄花园Ghost Win8.1 x64 办公纯净版2019年6月(激活版) ISO镜像高速下载