security/화이트햇

WinAFL 퍼징을 통해 타겟 분석하기

민사민서 2024. 1. 6. 18:32

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