首页
社区
课程
招聘
Windows黑盒测试环境搭建:Dynamorio+Winafl
发表于: 2023-1-28 17:49 10632

Windows黑盒测试环境搭建:Dynamorio+Winafl

2023-1-28 17:49
10632

在漏洞挖掘或测试中,源码插桩相对容易操作一些,而二进制插桩、自动化挖掘一直是困扰我的一个难点,正好趁春节假期,好好研究研究;以下内容均为个人实测,还有很多问题,也希望各位高手给出解决办法,先谢谢各位!

 

关于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期)

最后于 2023-1-29 15:08 被Valdik编辑 ,原因: 内容补充
收藏
免费 1
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回
//