AFL源码阅读 - afl-fuzz
简介afl-fuzz 便是 afl 中的核心文件,模糊测试的代码都在该文件中,从功能上大致可以分为三个部分:
初始配置:进行初始化的配置操作
模糊测试:fuzz 的主要循环过程
变异策略:测试用例的变异策略和实现
初始配置输入参数处理在设置完随机数种子(使用时间 + pid)后,会进行输入参数的处理过程:
12345while ((opt = getopt(argc, argv, "+i:o:f:m:b:t:T:dnCB:S:M:x:QV")) > 0) switch (opt) { // opt }
大致的可输入参数如下:
1234567891011121314151617181920212223242526272829303132afl-fuzz 2.57b by <lcamtuf@google.com>afl-fuzz [ options ] -- /path/to/fuzzed_app [ ... ]Required parameters: -i dir - input director ...
AFL源码阅读 - afl-clang-fast
简介前面学习了 afl-as ,但是可以发现前面的插桩技术十分原始且神奇,现在更为通用的插桩方式是通过 llvm pass 进行插桩,对应的也就是 afl-clang-fast 。
LLVMllvm 的大体框架如下:
Clang 是 LLVM 项目的一个子项目,它是 LLVM 架构下的 C/C++/Objective-C 的编译器,是 LLVM 前端的一部分。相较于GCC,具备编译速度快、占用内存少、模块化设计、诊断信息可读性强、设计清晰简单等优点。
以 Clang 为例,从源码到机器码的流程如下:
其中的 LLVM Pass 便是用户自定义的处理 IR 的过程,可以进行优化、插桩、分析等功能。
AFL中的afl-clang-fastAFL 中的 llvm mode 可以实现编译器级别的插桩,主要包含以下三个文件:
afl-clang-fast.c :本质上是 clang 的 wrapper ,和 afl-gcc 类似
afl-llvm-pass.so.cc :通过 afl-clang-fast 调用 clang 时将 pass 插入 LLVM 中
afl-l ...
AFL源码阅读 - afl-as
main12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182/* Main entry point */int main(int argc, char** argv) { s32 pid; u32 rand_seed; int status; u8* inst_ratio_str = getenv("AFL_INST_RATIO"); struct timeval tv; struct timezone tz; clang_mode = !!getenv(CLANG_ENV_VAR); if (isatty(2) && !getenv("AFL_QUIET")) { SAYF(cCYA "afl-as " cBRI ...
AFL源码阅读 - afl-gcc
main首先从 main 来看:
123456789101112131415161718192021222324252627282930313233343536373839/* Main entry point */int main(int argc, char** argv) { if (isatty(2) && !getenv("AFL_QUIET")) { SAYF(cCYA "afl-cc " cBRI VERSION cRST " by <lcamtuf@google.com>\n"); } else be_quiet = 1; if (argc < 2) { SAYF("\n" "This is a helper application for afl-fuzz. It serves as a drop-in replacement\n" "f ...
CVE-2021-43226 :CLFS 中的栈溢出漏洞
漏洞分析根据 patch 可以得到主要更改了 CClfsLogFcbVirtual::QueryLogFileInfo 函数,其中判断了 a7 指向的值,当他大于 0x78 的时候也直接设为 0x78 ,并在接下来继续使用:
根据函数名,查询 MSDN ,可以推断出可能 GetLogFileInformation 函数可以触发到该路径:
12345CLFSUSER_API BOOL GetLogFileInformation( [in] HANDLE hLog, [in, out] PCLFS_INFORMATION pinfoBuffer, [in, out] PULONG cbBuffer);
其中传入了一个 pinfoBuffer ,结构为 PCLFS_INFORMATION :
12345678910111213141516171819typedef struct _CLS_INFORMATION { LONGLONG TotalAvailable; LONGLONG CurrentAvailab ...
CVE-2022-21882 :win32k 中的相对偏移读写漏洞
漏洞成因漏洞起源于 CVE-2021-1732 ,原因就是 xxxClientAllocWindowClassExtraBytes 可以被 hook 导致返回的 pExtraBytes 受用户所控,在此期间如果调用 NtUserConsoleControl 则会将 pExtraBytes 的解释方式改变为内核态的相对偏移,进而造成内核的越界写。而微软在 2022 年 1 月又 patch 另外几个相似的地方,也就是触发 xxxClientAllocWindowClassExtraBytes 函数的别的路径。所以这几个漏洞和 CVE-2021-1732 十分相似,本漏洞介绍的便是 xxxSwitchWndProc 路径。相关的知识不再介绍,可以看之间的博文 。
漏洞利用xxxSwitchWndProcxxxSwitchWndProc 路径如何触发有很多方法,例如 CVE-2019-1458 的方法或者使用未公开的 NtUserMessageCall 方法,如下所示:
1234567891011121314151617181920212223242526272829303132333435 ...
CVE-2021-34486 :ETW 中的 UAF 漏洞
前置知识Event Tracing For Windows (ETW)Event Tracing For Windows (ETW) 是 Windows 中用于应用程序或内核事件追踪的功能,开发人员可以通过 ETW 的相关 API 来追踪在开发调试过程中的相关日志信息,从而帮助开发人员更好的理解程序和系统的处理流程。在 Windows 中可以使用 Windows Performance Analyzer 分析 ETW 的日志信息,具体而言可以参考 这篇文章 。
在 ETW 中有一个比较重要的方法 NtTraceControl ,该方法是 ETW 的中心控制点,它支持许多管理跟踪会话的用户模式 API 。其定义如下:
12345678NTSTATUS NtTraceControl ( ULONG FunctionCode, PVOID InBuffer, ULONG InBufferLen, PVOID OutBuffer, ULONG OutBufferLen, ULONG *ReturnSize);
该函数的各种支持的 Function ...
CVE-2021-38001 :V8 IC 中的类型混淆漏洞
信息收集该 CVE 就是 TFC 上昆仑打的,issue 页面暂未公开,patch 如下:
可以看出来漏洞应该和 CVE-2021-30517 十分类似,为 receiver 和 holder 的类型混淆,更确切来说是把 holder 所对应的 handle 给了 receiver 而导致的类型混淆。
在 [github](https://github.com/vngkv123/articles/blob/main/CVE-2021-38001.md) 上可以找到验证的 poc ,分为两个文件,首先是 1.mjs :
123export let x = {};export let y = {};export let z = {};
随后是 2.mjs :
12345678910111213141516171819202122232425262728293031323334353637383940import * as module from "1.mjs";function poc() { ...
CVE-2021-1732 :win32k 中的相对偏移读写漏洞
前置知识Windows 桌面编程我们可以直接用 Visual Studio 生成以下的默认模板:
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178// test.cpp : 定义应用程序的入口点。 ...
CVE-2021-31956 :NTFS 模块的池溢出漏洞
漏洞分析漏洞存在于 ntfs.sys 驱动中的 NtfsQueryEaUserEaList 函数:
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778_QWORD *__fastcall NtfsQueryEaUserEaList(_QWORD *a1, __int64 ea_blocks_for_file, __int64 a3, __int64 out_buffer, unsigned int out_buf_length, unsigned int *a6, char a7){ unsigned int eaList_iter; // ebx unsigned int padding; // er15 _FILE_GET_EA_INFORMATION *current_ea; // r12 unsigned int nex ...