상세 컨텐츠

본문 제목

[Fuzzing] WinAFL 환경구축 및 사용법

ANALYSIS/Fuzzing

by koharin 2022. 7. 8. 15:17

본문

728x90
반응형

WinAFL

AFL은 Windows를 지원하지 않는다. 따라서 AFL을 fork 해서 Windows에서 AFL과 다른 instrumentation approach로 fuzzing이 가능하도록 WinAFL이 개발되었다. 

 

Environment

Windows 10 64bit VM

 

Prerequisite

  • Windows 10 VM
  • cmake
    • installer로 설치 후 재부팅하여 cmake 실행 시 아래와 같이 보이면 된다.

  • DynamoRIO
    • DynamoRIO 폴더 내 bin32\ 경로에 drrun.exe 등 사용 가능한 명령어가 있음

  • Visual Studio
    • Visual Studio Cross Tool Command Prompt로 harness 등 컴파일 위해 필요

Download WinAFL

WinAFL github에서 zip 파일 다운로드 후 압축해제하여 원하는 작업 경로에 위치시킨다.


Build WinAFL

  • Visual Studio Command Prompt 또는 Visual Studio x64 Win64 Command Prompt 연다. (64-bit target을 fuzzing 하는 경우 64-bit winafl.dll 필요)
    • Visual Studio 설치 관리자에서 C++ 워크로드 중 하나 선택 시 Visual Studio 플랫폼 도구 집합 설치되므로 C++ 워크로드 중 하나를 선택해서 설치한다. (참고)
    • 설치를 하고 나면 다음과 같이 x86_x64 Cross Tools Command Prompt for VS 2022가 있다. 이걸 우클릭해서 관리자 권한으로 실행한다.

 

cd winafl
mkdir build
cd build
cmake -G"Visual Studio 17 2022" -A Win32 .. -DDynamoRIO_DIR=C:\Users\johan\DynamoRIO-Windows-9.0.19174\DynamoRIO-Windows-9.0.19174\cmake
cmake --build . --config Release

target이 32bit인 경우 WinAFL build 

cd winafl
mkdir build32
cd build32
cmake -G"Visual Studio 17 2022" -A Win64 .. -DDynamoRIO_DIR=C:\Users\johan\DynamoRIO-Windows-9.0.19174\DynamoRIO-Windows-9.0.19174\cmake
cmake --build . --config Release

 

WinAFL 빌드 후 executable 경로

  • winafl\build32\bin\Release

Using WinAFL

 

필수 옵션

-i dir test case가 있는 input directory

-o dir output directory

-t msec fuzzing 실행에 대한 timeout → -t 1000 이면 test case 당 timeout이 1초이고, 1초가 지나면 time out error 발생

 

instrumentation type

-D dir dynamoRIO 바이너리 (drrun, drconfig)가 위치한 directory 경로


Target run with WinAFL

target function을 선택하고 application을 fuzz 하는 경우 WinAFL 통한 target 실행 과정

  1. target function에 도달할 때까지 target이 일반적으로 실행된다.
  2. WinAFL은 coverage를 기록한다..
  3. target function이 리턴하기 전까지 실행됨
  4. WinAFL은 coverage를 보고하고, input 파일을 재작성한 후 EIP를 수정해서 step 2 과정으로 실행 흐름이 가도록 한다.
  5. target function이 특정 iteration 수 만큼 실행되었으면, target 프로세스는 kill 되고 재실행된다. target function 리턴 후 실행되는 것에는 도달할 수 없다.

How to select a target function

WinAFL의 fuzzing 대상은 target 내 특정 function이다. target function을 반복적으로 실행하며 퍼징을 진행한다.

이때 target function은 몇 가지 조건을 충족해야 WinAFL의 fuzzing 대상으로 사용할 수 있다.

 

target function 조건

  1. 함수 내에서 input 파일을 열어야 함
    • target 함수 내에서 input 파일을 열어서 각 iteration마다 새로운 input 파일을 읽을 수 있어야 한다.
  2. input 파일 파싱할 수 있어야 한다.
    • file parsing의 coverage를 측정할 수 있음
  3. 함수 내에서 input 파일 닫아야 함
    • 함수 내에서 input 파일을 닫지 않으면 WinAFL이 input 파일을 재작성할 수 없다.
  4. 리턴까지 정상 실행되어야 함
    • WinAFL이 리턴을 잡아서 실행을 redirect

WinAFL instumentation

WinAFL은 3가지 instrumentation mode를 지원한다.

  1. Dynamic instrumentation → DynamoRIO
    • DynamoRIO 이용해서 Code Coverage 함
    • target coverage를 측정하고 추출할 수 있음
    • -DDynamoRIO_DIR 옵션을 WinAFL build 시 지정해야 함
  2. Hardware Tracing → Intel PT
  3. Static instrumentation → Syzygy
728x90
반응형

'ANALYSIS > Fuzzing' 카테고리의 다른 글

[Fuzzing] WinAFL target function offset 자동으로 넣어주기  (0) 2022.07.08
[Fuzzing] WinAFL fuzzing HncAppShield  (0) 2022.07.08
[Fuzzing] AFL fuzzing dact  (0) 2022.06.28
[Fuzzing] AFL++ 설치  (0) 2022.06.28
[Fuzzing] AFL 설치  (0) 2022.06.28

관련글 더보기