-
-
Windows黑盒测试环境搭建:Dynamorio+Winafl
-
发表于: 2023-1-28 17:49 10486
-
在漏洞挖掘或测试中,源码插桩相对容易操作一些,而二进制插桩、自动化挖掘一直是困扰我的一个难点,正好趁春节假期,好好研究研究;以下内容均为个人实测,还有很多问题,也希望各位高手给出解决办法,先谢谢各位!
关于Dynamorio二进制插桩的具体实现细节,感兴趣的朋友可以去研究一下源码,我只谈一下个人对二进制插桩原理的理解————一般来说,把原理理解了,接下来就好说了。二进制插桩原理是这样的,其实就是Dynamorio(插桩工具)作为父进程,然后创建一个子进程(被插桩测试对象),然后控制子进程的运行,从而达到插桩监控乃至控制程序流程的目的的。关于具体的技术细节,在Linux环境下,通过Ptrace完全可以实现同样的功能;而Windows下只不过实现函数不同罢了。做过Hook的朋友,对这些技术细节是完全掌握的。
理解了原理,就会明白为何要用Dynamorio和Winafl来配合测试了:Dynamorio用作插桩监控测试流程,其实在fuzz中最主要的是用它统计覆盖率同时跟踪执行流程,给出Crash的位置;而Winafl主要用来产生测试用例并通过遗传算法进行变异,把测试数据喂给被测对象;不知这样理解对不对。
我试过编译版的DynamoRIO。在测试运行时,无法输出log文件。不知道是环境变量设置问题还是什么问题,希望知道的大佬指出问题所在。于是,不得不在本地进行重新编译。
记着:操作之前,先卸载360等安全软件,否则DynamoRIO组件会被认为是病毒并被移除。
一、编译前准备
安装编译相关工具,并配置编译环境:
【Visual Studio 16 2019】
#我试过2022,因各种问题(visual studio 卸载不干净时,不得不重做系统)卸载后,用的2019版;
#visual studio安装时,“工作负荷”中,安装“python开发”;
#“桌面应用和移动应用”中,“.NET桌面开发、使用C++的桌面开发、通用Windows平台开发”均需安装;
#其中,“使用C++的桌面开发”在右侧的安装详细信息中一定要注意“可选”项中的配置:
#MSVC v142-VS 2019 C++ x64/x86生成工具(最新)、Windows 10 SDK、用于Windows的C++Cmake工具、
#适用于最新v142生成工具的C++ATL(x86和x64)、适用于最新v142生成工具的C++MFC(x86和x64)这几项是必须安装的;
#以上在“单个组件”中,也可以配置
如图所示:
#注意:VS2019在安装完成后,一定要配置环境变量,即找到Virsual Studio文件夹中的vcvarsall.bat所在目录,并打开cmd,
#依次执行以下两条命令(在DynamoRIO、winafl编译时也可以先运行一下):
1 | vcvarsall x86 vcvarsall amd64_x86 |
安装【cmake-3.24.0-rc1-windows-x86_64】
#cmake有版本要求,需注意一下;
安装【qt-opensource-windows-x86-5.14.2】
#不知为何,在编译过程一直存在找不到QT路径;
安装【strawberry-perl-5.32.1.1-64bit 】
安装【 git】
以上编译环境准备完成之后,进行编译。
二、编译Dynamorio
下载DynamoRIO源码
git clone https://github.com/DynamoRIO/dynamorio.git
git bash 环境下编译:
32位编译
1 2 3 4 5 | cd dynamorio mkdir build_win32 cd build_win32 cmake - G "Visual Studio 16 2019" - A Win32 .. #在这一步存在错误,以下64位时依然如此: cmake - - build . - - config RelWithDebInfo |
编译错误如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | Looking for MFC - found - - Could NOT find ZLIB (missing: ZLIB_LIBRARY) (found version "1.2.11" ) - - Performing Test implicit_fallthrough_avail - - Performing Test implicit_fallthrough_avail - Failed - - Could NOT find Doxygen (missing: DOXYGEN_EXECUTABLE) CMake Warning at CMakeLists.txt: 1864 (message): doxygen not found: documentation will NOT be built * * * NOT building documentation * * * (must re - enable BUILD_DOCS manually if fix up the component paths) - - WARNING: vera + + not found: disabling code style checks - - WARNING: Could not find Qt 5 : DrGUI will NOT be built - - Point CMake variable Qt5Widgets_DIR at the Qt5WidgetsConfig.cmake directory - - Configuring done - - Generating done - - Build files have been written to: C: / Users / Administrator / dynamorio / build_win32 |
64位编译
1 2 3 4 5 | cd dynamorio mkdir build_x64 cd build_x64 cmake - G "Visual Studio 16 2019" - A x64 .. cmake - - build . - - config RelWithDebInfo |
三、编译Winafl
注意:
最好把winafl源码拷贝至dynamorio同一目录下,并在cmd下进行编译:
编译32位:
1 2 3 4 5 | cd winafl mkdir build_win32 cd build_win32 cmake - G "Visual Studio 16 2019" - A Win32 .. - DDynamoRIO_DIR = C:\Users\Administrator\dynamorio\build_win32\cmake cmake - - build . - - config Release |
编译64位:
1 2 3 4 5 | cd winafl mkdir build_x64 cd build_x64 cmake - G "Visual Studio 16 2019" - A x64 .. - DDynamoRIO_DIR = C:\Users\Administrator\dynamorio\build_x64\cmake cmake - - build . - - config Release |
四、测试dynamorio能否使用winafl.dll进行插桩跟踪程序运行
下载VUPlayer,任意其他软件都可以,以备被测。
使用cmd,切换至afl-fuzz.exe所在目录,即winafl.dll所在目录,运行dynamorio中的drrun.exe进行插桩跟踪,命令如下:
1 | C:\Users\Administrator\dynamorio\build_win32\bin32\drrun.exe - c winafl.dll - debug - target_module VUPlayer.exe - target_offset 0x1F9280 - fuzz_iterations 5 - nargs 4 - - C:\Users\Administrator\Downloads\VUPlayer4_32bit\VUPlayer.exe input .txt |
执行完后,会在winafl.dll所在目录输出跟踪日志文件;类似afl.VUPlayer.exe.10740.0000.proc
内容如图所示:
上图末尾的异常,在我进行插桩时依然存在,怀疑是编译问题,为了确定问题所在,只好在网上找了一段源码编译了一个小的test1程序。之所以这样做是因为,程序体积小、逻辑简单,方便使用。源码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <windows.h> int main( int argc, char * argv[]) { char tmp[ 30 ]; char buff[ 1024 ]; FILE * fp; if (argc > = 2 ) { fp = fopen(argv[ 1 ], "rb" ); if (fp = = NULL) { printf( "can not load file!\n" ); return 1 ; } fgets(buff, 1024 , fp); / / 读取文件内容 fclose(fp); strcpy(tmp, buff); / / 存在栈溢出漏洞 printf( "%s\n" , tmp); return 1 ; } return 0 ; } / / test1.exe |
编译完后使用IDA看下main函数的地址,如图所示:
计算一下-target_offset 为 0x11870,使用如下命令再次插桩测试:
1 | C:\Users\Administrator\dynamorio\build_win32\bin32\drrun.exe - c winafl.dll - debug - target_module test1.exe - target_offset 0x11870 - fuzz_iterations 10 - nargs 2 - - test1.exe |
这次,在afl-fuzz所在目录生成的日志中可以看到一切正常了,说明整个测试环境是正常的。
表示Dynamorio插桩跟踪是正常的,至此,可以进行在Windows下进行模糊测试了。
先用winafl对test1进行模糊测试,准备一个测试用例文件,以上test1中存在典型的栈溢出漏洞,随便使用一个字符文件就可以,如input.txt:
1 | wqerqwerqwerwqerwqasdfasdfasdzxcjkljlk |
把input.txt拷贝到afl-fuzz.exe同级目录的in文件夹下(如果没有就mkdir一个),以后所有的测试数据都要放在这里,等待afl-fuzz使用。如图:
然后启动fuzz程序进行模糊测试,命令如下:
1 | afl - fuzz.exe - i in - o out - D C:\Users\Administrator\dynamorio\build_win32\bin32 - t 20000 + - - - coverage_module ntdll.dll - fuzz_iterations 5000 - target_module test1.exe - target_offset 0x11870 - nargs 2 - - test1.exe @@ |
注意 -t 参数之后的 “--“符号不要遗漏!
然后,经典的afl-fuzz界面就出现了:
但是,这其中还存在一个问题,就是测试过程中的弹窗问题,如图:
这个问题,网上有大佬用python脚本解决的,具体技术细节我还没研究。至此,其实out文件夹下已经存在crash文件了。
整个系统算是跑通了,可以进行其他二进制文件漏洞挖掘了。
欢迎各位指出不足之处,也欢迎各位对二进制测试感兴趣的朋友留言,进行交流。
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)
赞赏
- 怎么提取微软补丁? 5821
- [求助]来啊,一起看看这是不是个洞? 10804
- [讨论]xor r9d r9d ;这条指令执行完后,r9的值是多少? 11209
- 010editor版本V13.0.1暴力破解过程 8177
- [原创]syzkaller内核黑盒测试环境搭建中,内存不足的解决办法 9866