[WinAFL] 퍼징으로 1-day 취약점 분석하기(7zip)

들어가며

7-zip를 퍼징한다. 7-zip에서 발생하는 CVE-2016-2334을 분석한다. 그리고 발견한 크래시에서 코드 커버리지를 분석한다.

CVE-2016-2334은 heap-based buffer overflow 취약점이다. 범위 밖의 데이터를 읽을 수 있다. 7-zip에서는 조작된 HFS+ 이미지 파일에서 발생한다.

준비

1-day 실습이므로 취약점이 발생했던 같은 환경을 준비한다. 또는 다음의 내용을 학습할 수 있다.

  • Windows x64 1809
  • WinAFL(Fuzzer)

Download and Build

Windows 환경에서 AFL 퍼저의 실행은 WinAFL을 사용한다.

사전 설치

1. Visual Studio compiler 가 필요로하며 2019 버전의 설치를 권장한다.

    “Desktop development with C++” 패키지 선택 후 설치한다.

2. https://github.com/DynamoRIO/dynamorio/releases/download/release_8.0.0-1/DynamoRIO-Windows-8.0.0-1.zip 에서 DynamoRIO 설치한다.

       자세한 설치방법은 이전 게시글인 https://gomguk.tistory.com/111 에서 다루었다.

WinAFL 설치

https://github.com/googleprojectzero/winafl 에서 설치한다.

Visual Studio 2019를 이전 단계에서 설치했으므로 “Developer Command Prompt for VS2019” 실행하여 WinAFL이 설치된 경로로 이동한다. 그리고 다음의 명령어 실행한다.

mkdir build32
cd build32
cmake -G"Visual Studio 16 2019" -A Win32 .. -DDynamoRIO_DIR=C:\Users\IEUser\Desktop\DynamoRIO-Windows-8.0.0-1\cmake
cmake --build . --config Release

자신의 시스템에 맞게 빌드된 WinAFL 바이너리가 winafl-master\build32\bin\Release 에 위치한다.

7-zip Download

15.05 버전을 https://github.com/antonio-morales/Fuzzing101/blob/main/Exercise 9/Resources/7z1505.exe 에서 받을수 있다.

Create corpus

다양한 방법으로 샘플 데이터를 생성할 수 있다.

https://github.com/antonio-morales/Fuzzing101/blob/main/Exercise 9/Resources/example.img 에서 예제 파일을 제공한다.

WinAFL

WinAFL은 AFL과는 다른 추가 옵션이 존재한다.

-coverage_module : 커버리지를 기록할 모듈을 명시한다. 여러개 모듈을 지정할 수 있다.

-target_module : 퍼징할 함수를 지정한다.

-target_offset : 퍼징할 메소드의 시작주소로부터의 오프셋 주소

퍼징을 수행하기 위한 함수의 오프셋을 분석한다.

0x42F3B3

함수의 베이스 주소가 0x400000이므로 0x42F3B3 - 0x400000 = 0x02F3B3 이 target_offset 인자가 된다.

이 주소가 맞는지 DynamoRIO에서 확인해본다.

C:\_fuzz\DynamoRIO-Windows-8.0\bin32\drrun.exe -c winafl.dll -debug -target_module 7z.exe -target_offset 0x02F3B3 -fuzz_iterations 10 -nargs 2 -- "C:\Program Files (x86)\7-Zip\7z.exe" l C:\_fuzz\afl_in\example.img

실행 결과로 목적한 함수가 10회 실행되고 종료되면 된다.

Fuzzing

afl-fuzz.exe -i C:\_fuzz\afl_in -o C:\_fuzz\afl_out -t 2000 -D C:\_fuzz\DynamoRIO-Windows-8.0\bin32 -- -coverage_module 7z.exe -coverage_module 7z.dll -target_module 7z.exe -target_offset 0x02F3B3 -nargs 2 -- "C:\Program Files (x86)\7-Zip\7z.exe" e -y @@

 

반응형