STUDY.md
  • [Fuzzing 실습] Fuzzing 사용법 익혀보기. +WinAFL 빌드하기
    2024년 09월 10일 01시 35분 46초에 업로드 된 글입니다.
    작성자: 방세연

    Fuzzing

    특정 프로그램에 Fuzz Testing을 사용하면, 이상이 있는 무작위 데이터 입력을 통해 프로그램의 취약점을 탐지할 수 있게 해준다. 간단히 말해 소프트웨어 안에 있는 결함을 발견하기 위한 다양한 대입 테스트를 적용하는 것이다. Fuzzer 도구별로 기법이 다르니 적절히 사용하는 것이 중요하다.

     

    결론적으로는 시스템 안정성을 높이고 보안을 강화하도록 한다.

    테스트하고자 하는 대상 프로그램(PUT)의 예상하지 못한 부분 (초과된 부분)에 (Fuzzing)을 통해 (INPUT)함
    Fuzz Algorithm은 Fuzz Configuration 파라미터들의 세팅을 통해 의존함

     

    memory courruption (heap overflow, stack overflow, interger overflow, format string bug 등..) 과 같은 취약점은 발견하기가 용이함, 그러나 logic bug는 fuzzing으로 찾기 어려움.

     

    일반적으로 TestCase Generator, Logger, Worker, Server/Master가 큰 틀을 구성해 Fuzzer의 역할을 한다.

    Dumb fuzzing, Guided fuzzing, smart fuzzing과 같은 퍼징 기법이 있는데.. WinAFL은 코드 커버리지 퍼징 기법이다.

     

    대표적인 오픈소스 퍼징으로는 AFL, LibFuzzer, Honggfuzz, WinAFL, OSS-Fuzz, Radamsa, ClusterFuzz 등.. 이 있다.

     

     

     🖤Black-box fuzzing

    프로그램의 내부 정보를 사용하지 않는다. 오로지 입력과 출력 데이터만 활용한다.

    input/output 동작을 주로 관측하며 고전 fuzzer에 속한다.

    AFL에서는 Black-box fuzzing을 기능하기 어렵다는 단점이 존재할 수 있다.

     

    🤍White-box fuzzing

    프로그램의 내부에 있는 구조와 실행 도중에 발생하는 정보들을 활용한다. (test case 생성)

    dynamic instrumentaion과 SMT solving을 사용한다.

     

    🩶Grey-box fuzzing

    프로그램의 입출력 데이터, 내부 정보 등 다양하게 이용해 일부를 수집해 활용한다.


     

     

    Fuzzing의 구조도 및 WinAFL에 대한 설명

    일반적인 Fuzzer 동작 개념 - https://www.researchgate.net/figure/Working-process-of-fuzzing_fig1_334986695

     

    AFL은 본래 리눅스 계열의 환경에 특화된 오픈소스 퍼징 도구다. 이 Fuzzer은 code coverage 기반 퍼징을 사용하는데, 실행 중 발생하는 새 경로를 탐색하여 다양한 상황을 테스트하도록 한다. 윈도우 응용 프로그램에서 AFL이 동작하기 위해서는 시스템 호환 문제의 존재를 해결해야했는데, DynamoRIO라는 동적 바이너리 계측 툴을 기반으로 code coverage 기반 퍼징 기법을 사용하는 것이 가능해졌다. WinAFL에는 파일 기반 퍼징과 API 호출 기반 퍼징이 존재하는데, 파일 입력을 변조하여 취약점을 테스할 수 있을 뿐만 아니라 특정 함수 호출을 타켓으로 API 수준에서 내부 동작을 테스트할 수도 있다.

     

    https://github.com/googleprojectzero/winafl

     

    GitHub - googleprojectzero/winafl: A fork of AFL for fuzzing Windows binaries

    A fork of AFL for fuzzing Windows binaries. Contribute to googleprojectzero/winafl development by creating an account on GitHub.

    github.com

    WinAFL을 지원하는 공식 깃허브 페이지인데, Adobe, Microsoft, XnView, InfanView, Foxit 등 다양한 윈도우 소프트웨어사에 대한 CVE가 WinAFL에 의해 발견된 사례가 매우 많다는 것을 확인할 수 있다.

     

    CODE COVERAGE란?

    테스트가 source code의 어느 정도를 실행되었는지 테스트 과정 중에 측정하는 역할을 한다. Soucre code나 binary code에 계측을 추가하며, WinAFL에서는 DynamoRIO와 같은 도구가 동적 계측을 통해 실시간으로 코드 실행 경로를 추적한다.  이후 기록된 코드 경로 실행 여부에 대해 coverage data를 수집한다. 이 데이터를 기반해 coverage analyze를 수행하여, 다양한 테스트 수치를 계산한다. 

     

    WinAFL 작동 순서
    1. WinAFL로 테스트(버그 바운팅) 할 대상 프로그램 선정
    2. Fuzzer가 실행될 때 타겟 함수에 도달하도록 함 (초기 입력값 제공, 프로그램 실행 및 타켓함수 경로 탐색)
    3. 타겟 함수에 도달했을 때 code coverage 정보를 기록하도록 함
    4. 타켓 함수가 완전히 실행되고 return할 때까지 프로그램을 계속 실행
    5. 타켓 함수의 실행이 끝나면 code coverage 정보 회수
    6. code coverage 데이터를 기반해 파일 입력값 변조 (바이트 수정, 난수 입력, 부분 교체)
    7. EIP 조작을 통해 프로그램의 특정한 위치로 다시 되돌아감. (-> 2번 과정으로 복귀)
    8. 이 과정을 일정 반복한 후 타겟 프로세스 종료, 1번 과정으로 돌아가 새로운 Fuzzing 사이클 시작.

     


    WinAFL 설치 과정

    Windows 필요 설치 항목들

     

    1. VMWare Windows 10 x64 가상머신 준비
    2. Visual Studio
    3. DynamoRIO (https://dynamorio.org/page_releases.html)
    4. winafl-master (https://github.com/ivanfratric/winafl)
    5. cmake (https://cmake.org/download/)

    다음의 환경을 다운로드 받아 압축 해제해준다. (git clone 해줘도 좋다.)

     

     

    WinAFL 환경 세팅 과정

    Visual Studio를 가상머신에 새로 다운받아야 했다. 다운로드 후 Cross Tools Command Prompt를 윈도우 검색에 입력하는데, 필자는 `Developer Command Prompt for VS 2022` 라는 이름의 앱이 이에 해당했다. 2022 버전이라 그런가보다.

     

     

    cmake --help

    Generators에서 자신이 속한 Visual Studio 버전을 확인한다. 필자는 Visual Studio 17 2022 시스템을 설치했으며 해당 시스템이 cmake에 등록된 시스템 변수라는 것을 알 수 있다.

     

     

    cd [WinAFL 경로]
    mkdir build32
    cd build32
    cmake -G"Visual Studio 17 2022" -A Win32 .. -DDynamoRIO_DIR=%DynamoRIO경로%\cmake

    해당 코드를 cmd 창에 순서대로 입력해준다. 마지막에 cmake 명령어를 입력해줄 때는 주의가 필요한데, 다음과 같은 조건이 성립해야 한다.

    • 자신의 Visual Studio 버전이 맞는지 확인하기
    • 32bit짜리 DLL을 퍼징할 것임 (자신의 고려 사항 확인하기)
    • DynamoRIO의 cmake 위치로 경로를 지정하기
    • Visual Studio에서 `C++를 사용한 데스크톱 개발` 항목이 설치되어 있어야 함

     

     

    처음에 cmake 명령어 입력이 제대로 이루어지지 않았는데, C++ 확장자를 다운로드 하니 해결되었다.

    내 컴퓨터 용량 ..

     

     

     

    cmake 명령어까지 입력하고 위와같은 문구가 나타났다면 빌드를 위한 준비가 끝난 것이다.

     

     

    cmake --build . --config Release

    그자리에서 그대로 cmake 빌드 명령어를 입력해준다. %winafl-master%\build32\bin\Release에 afl-fuzz.exe와 winafl.dll이 새롭게 생성되어야 한다.

     

     

     

    환경 세팅 완료

     

     

    build32에 다음과 같은 파일들이 생성되었으면 사전 구축은 완료된 것이다.

    해당 디렉토리가 우리가 주로 fuzzer 작업을 할 경로 위치이다.

     

     

     

    WinAFL 빌드 이후

    dir 명령어를 통해 executable 경로 확인

     

    afl-fuzz.exe

     

    %사용자 경로%\build32\bin\Release 위치에 afl-fuzz.exe가 잘 생성되어있다면 빌드가 성공적으로 이루어진 것이다.

    WinAFL의 target 선정 및 function에 대한 내용은 다음 포스팅에서 다뤄보겠다.

    댓글