0. Windows 11 에서 정상적인 실행이 되지 않으므로, hyper-V 등을 통해서 windows 10에서 실행하는 것을 권장한다.
1. 다운로드 : Python3, Visual studio 2022, DynamoRIO(https://github.com/DynamoRIO/dynamorio/releases)
2. 적절한 경로에 DynamoRIO 압축 해제
3. config.h 에서 input 파일 최대 사이즈 수정 (1*1024*1024 를 아래와 같이 수정)
/* Maximum size of input file, in bytes (keep under 100MB): */
#define MAX_FILE (100 * 1024 * 1024)
4. x64 Native Tools Command Prompt for VS 2022 열기
git clone https://github.com/googleprojectzero/winafl
cd winafl
git submodule update --init --recursive
mkdir build64
cd build64
cmake -G"Visual Studio 17 2022" -A x64 .. -DDynamoRIO_DIR=I:\DynamoRIO\cmake -DTINYINST=1 -DUSE_DRSYMS=1 -DINTELPT=1 -DUSE_COLOR=1
cmake --build . --config Release
5. harness 작성
#include <iostream>
#include <windows.h>
typedef int(__stdcall* _OHMYGOD)(const char* data);
_OHMYGOD func;
extern "C" __declspec(dllexport) __declspec(noinline) int fuzzme(const char* path)
{
int result = func(path);
return result;
}
int main(int argc, char *argv[])
{
HMODULE hMod = GetModuleHandle(0);
hMod = LoadLibrary(L"I:\\victim\\x64\\Release\\victim.dll");
if (NULL == hMod)
{
printf("dll load error\n");
return 0;
}
func = (_OHMYGOD)GetProcAddress(hMod, "ohmygod");
fuzzme(argv[1]);
}
6. victim 작성 (타겟 DLL)
#include "pch.h"
#include <iostream>
extern "C" __declspec(dllexport) int ohmygod(const char* path)
{
std::cout << path << std::endl;
char data[40] = { 0, };
char buf[30] = { 0, };
HANDLE hFile = CreateFileA(path, GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, NULL);
if (hFile)
{
DWORD dwRead;
ReadFile(hFile, data, sizeof(data), &dwRead, NULL);
std::cout << "read : " << dwRead << std::endl;
if (dwRead)
{
memcpy(buf, data, dwRead+40);
std::cout << buf;
}
CloseHandle(hFile);
}
return 0;
}
BOOL APIENTRY DllMain( HMODULE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}
원활한 crash 발생을 위해 각각 Release 로 빌드한다.
7. 입출력 디렉토리 설정
afl은 사용자가 지정한 입력 디렉토리에 있는 파일들을 퍼징 데이터로 사용한다.
crash를 유발하지 않는 정상 입력 데이터이어야 첫 실행 시 에러가 발생하지 않는다.
아래 데이터를 1.txt로 저장한다.
abcd
8. 공격
afl-fuzz.exe -D I:\\dynamorio\\bin64 -i "d:\\fuzz_input" -o "d:\\fuzz_output" -t 1000 -- -coverage_module victim.dll -target_module harness.exe -target_method fuzzme -fuzz_iterations 10 -nargs 1 -- I:\\harness\\x64\\Release\\harness.exe @@
실행은 반드시 afl-fuzz.exe 디렉토리에서 하여야 한다. 그렇지 않다면 아래와 같은 에러가 발생한다.
주의 : -coverage_module 및 -target_module 에는 파일명만 기입한다.
아래와 같은 화면이 나오면 실행 성공이다.
crash가 발생할 경우, i:\fuzz_output\crashes 경로에 상세 정보가 저장된다.
만약 CPU가 인텔인 경우, -D 옵션 대신 -P옵션을 사용하도록 하자. 속도가 압도적으로 빠르다. (내 PC에서는 5배 이상 차이가 났다.)
afl-fuzz.exe -P -i "d:\\fuzz_input" -o "d:\\fuzz_output" -t 1000 -- -coverage_module victim.dll -target_module harness.exe -target_method fuzzme -fuzz_iterations 10 -nargs 1 -- I:\\harness\\x64\\Release\\harness.exe @@
'Windows > Hacking & Vulnerability' 카테고리의 다른 글
ddraw 후킹하여 텍스트 그리기 예제 (0) | 2020.06.23 |
---|---|
code virtuzlier v1.0.1.0 동작 분석 (3) | 2020.05.08 |
stripper v2.07 (구버전 asprotect unpacker) (0) | 2019.12.25 |
PowerShell + Veil Framework을 활용한 페이로드 작성 (0) | 2015.01.07 |
Peach Fuzzer를 이용한 File Fuzzing #2 (0) | 2014.07.22 |