Step1. 환경 세팅하기
설치해야 될 것들
- Visual Studio
- WinAFL
- Dynamorio
https://hackyboiz.github.io/2021/05/23/fabu1ous/winafl-1/
https://gomguk.tistory.com/119
Step2. 타겟 선정하기
* 타겟 소프트웨어를 선정하고, 해당 소프트웨어의 동작 방식을 분석한다
(주로 뷰어, 압축프로그램, 미디어 플레이어 등등 user input 집어넣을 수 있는 애들이 쉽고 편함)
* procmon을 통해 user input 입력했을 때의 동작을 분석하면 좋음
- operation : Load Library, ReadFile 등등
- 여러 쓰레드에서 동작할 수 있음
* 플러그인 dll에서 file open, parsing, file close 작업 전부 이루어질 경우 => DLL 하네스 작성 후 퍼징
- 한 함수에서 open, parse, close 전부 이루어지면 걔만 GetProcAddress
- 별개의 함수에서 이루어지면 전부 GetProcAddress로 가져온 후 fp만 전달시키면 될 듯
* exe에서 file open, parsing, file close 작업 전부 이루어질경우 => exe 파싱 루틴 부분만 하네스 작성 후 퍼징
- 난이도 더 높음, 하네스 작성 힘들 가능성 존재
- target offset fuzzing 돌리는 방법도
afl-fuzz.exe -i in_monkey -o out_monkey -M fuzzer01 -x C:\winafl-master\build32\bin\Release\dictionary\wav.dict -t 100000 -f input.wav -D C:\DynamoRIO-Windows-10.0.0\bin32 -- -fuzz_iterations 10 -coverage_module Console.exe -target_module Console.exe -target_offset 0x0030A0 -nargs 5 -- Console.exe @@ asdf.ape -c1000
Step3. dll 하네스 작성하기
* IDA, WinDbg 등의 툴을 이용해 타겟 함수의 인자 분석을 수행한다
* 하네스를 작성한다
#include <stdio.h>
#include <Windows.h>
#pragma warning(disable:4996)
/*
qmemcpy(Format, aJpeg2000Dll, 0x1Au); // JPEG2000.DLL
*String = 0;
LibraryW = dword_5AD338;
if ( dword_5AD338
|| (sub_48ADB0(LibFileName, Format), LibraryW = LoadLibraryW(LibFileName), (dword_5AD338 = LibraryW) != 0) )
{
ReadJPG2000_W = GetProcAddress(LibraryW, aReadjpg2000W);// ReadJPG2000_W API 가져옴
if ( ReadJPG2000_W )
{
v10 = ((int (__cdecl *)(int, int, wchar_t *, int, int, int))ReadJPG2000_W)(a1, a2, String, a4, a5, a6);
if ( v10 )
*a7 = _wtoi(String);
return v10;
}
*/
typedef DWORD(*ReadJPG2000_W)(const wchar_t*, void*, void*, void*, void*, void*);
const wchar_t* convertToWchar(const char* c) {
const size_t size = strlen(c) + 1;
wchar_t* wc = new wchar_t[size];
mbstowcs(wc, c, size);
return wc;
}
int main(int argc, char* argv[]) {
HMODULE jpeg2000 = LoadLibraryA("JPEG2000.dll");
ReadJPG2000_W func = (ReadJPG2000_W)GetProcAddress(jpeg2000, "ReadJPG2000_W");
wchar_t arg3[0x200] = { 0, };
wchar_t arg4[0x200] = { 0, };
DWORD arg5 = 0;
DWORD arg6 = 0;
printf("%p\n%p\n", jpeg2000, func);
func(convertToWchar(argv[1]), 0, arg3, arg4, &arg5, &arg6);
// if no error, then printf will be executed
printf("%ws %ws %x %x\n", arg3, arg4, arg5, arg6);
return 0;
}
(thks to 심기용 PL님)
- 첫번째 인자로 유니코드 경로 문자열을 받고
- 두번재 인자로 정수값을 건네받았으며
- 세번째 네번째는 유니코드 output buffer이고
- 다섯번째 여섯번째 인자는 정수변수 주소였음
(물론 동적분석을 통해 파악해야 정확함)
Step4. WinAFL 퍼징 수행
afl-fuzz.exe -i in -out out -D "C:\DynamoRIO-Windows-10.0.0\bin32" -t 10000 -- -target_module "mng_harness.exe" -coverage_module "Mng.dll" -target_method fuzzme -fuzz_iterations 100 -nargs 1 -- "mng_harness.exe" @@
=> 여기서 인잣값이랑 경로값만 잘 바꿔서 하면
주의사항
* input 폴더에 넣을 seed 파일의 용량은 되도록 200kb 이내
* 경로에 띄어쓰기가 있으면 안되더라구요
* 가끔 이미 output 폴더가 존재하면 안될 수도 있으니까 삭제 후 진행해보시면 좋을 듯
* drrun 돌려봄으로써 커버리지 측정 (간혹 dll 모듈명 다르게 인식되는 경우 진입 자체가 안 됨)
C:\DynamoRIO-Windows-10.0.0\bin32\drrun.exe -c winafl.dll -debug -fuzz_iterations 10 -coverage_module “Mng.dll” -target_module “mng_harness.exe” -target_method fuzzme -- mng_harness.exe “C:\www\testcases\mng\input.mng”
퍼저 속도 개선
* Master-slave 사용
afl-fuzz.exe -i in_mng -o out_mng -M fuzzer01 -x C:\winafl-master\build32\bin\Release\dictionary\mng.dict -D C:\DynamoRIO-Windows-10.0.0\bin32 -t 1500 -- -target_module mng_harness.exe -coverage_module Mng.dll -target_method fuzzme -fuzz_iterations 2000 -nargs 1 -- mng_harness.exe @@
afl-fuzz.exe -i in_mng -o out_mng -S fuzzer02 -x C:\winafl-master\build32\bin\Release\dictionary\mng.dict -D C:\DynamoRIO-Windows-10.0.0\bin32 -t 1500 -- -target_module mng_harness.exe -coverage_module Mng.dll -target_method fuzzme -fuzz_iterations 2000 -nargs 1 -- mng_harness.exe @@
afl-fuzz.exe -i in_mng -o out_mng -S fuzzer03 -x C:\winafl-master\build32\bin\Release\dictionary\mng.dict -D C:\DynamoRIO-Windows-10.0.0\bin32 -t 1500 -- -target_module mng_harness.exe -coverage_module Mng.dll -target_method fuzzme -fuzz_iterations 2000 -nargs 1 -- mng_harness.exe @@
afl-fuzz.exe -i in_mng -o out_mng -S fuzzer04 -x C:\winafl-master\build32\bin\Release\dictionary\mng.dict -D C:\DynamoRIO-Windows-10.0.0\bin32 -t 1500 -- -target_module mng_harness.exe -coverage_module Mng.dll -target_method fuzzme -fuzz_iterations 2000 -nargs 1 -- mng_harness.exe @@
* dictionary 사용, 파일의 시그니쳐들 미리 fuzzer에게 알려주는 느낌으로 사용
Step5. 크래시 분석
* 크래시가 발생했다! 그러면 이제 windbg TTD 기능과 IDA 디컴파일 기능 등을 적극 활용하여 역분석 진행하면 됨
* windbg 구 버전에서 사용 가능한 !exploitable 플러그인(thks to nerty_nerty) 사용해보아도 좋을 듯
끗
'security > 화이트햇' 카테고리의 다른 글
Windbg 커맨드 정리 (2) | 2024.01.06 |
---|---|
WTF(What The Fuzz) 퍼저를 활용해 타겟 분석하기 (2) | 2024.01.06 |
git 사용하기 - github pull/push/pull request (0) | 2023.09.28 |
PCAP Programming (0) | 2023.09.23 |
UDP/TCP Attack 실습 (0) | 2023.09.20 |