- 준비물
- Fuzzing 순서
- 바이너리 분석 후, 퍼징할 함수가 export(dll)되어있거나 persistent mode로 퍼징 가능한지 판단
- Fuzzing
- dll exported인 경우: Harness 작성
- persistent mode로 퍼징 가능한 경우
- afl-fuzz 인자값으로 해당 함수 offset 지정할 것
- 함수 내부에 파일을 open/close 여부 확인 후, 상위함수 사용 고려
- Crash 분석
Fuzzing Arguments
C:\Users\KuroNeko\Desktop\Fuzz\winafl\build32\bin\Release\afl-fuzz.exe -M master -i in -o out -D C:\Users\KuroNeko\Desktop\Fuzz\DynamoRIO\bin32 -t 1000 -- -coverage_module module.dll -target_method fuzzme -target_module harness.exe -fuzz_iterations 5000 -nargs 1 -- harness.exe @@
Harness
#include <stdio.h>
#include <windows.h>
extern "C" __declspec(dllexport) __declspec(noinline) void fuzzme(wchar_t* path) {
}
int main(int argc, char *argv[]) {
SetDllDirectoryA("C:\\Users\\KuroNeko\\Desktop\\test");
HMODULE hModule = LoadLibraryA("module.dll");
if (hModule == NULL) {
return 0;
}
size_t orig = strlen(argv[1]);
size_t newsize = orig * sizeof(wchar_t);
wchar_t *path = (wchar_t *)malloc(newsize);
size_t convertedChars = 0;
mbstowcs_s(&convertedChars, path, newsize, argv[1], _TRUNCATE);
fuzzme(path);
return 0;
}