본문 바로가기

Testing Tools/Fuzzing

AFL(American Fuzzy Lop) Fuzzer 사용기 - binutils 대상

참고 자료

AFL이란?

SW 버그를 찾기위해 다양한 상황을 고려한 테스트 케이스를 만들어야 하는데 많은 노력이 든다. 이에 테스트 케이스의 입력값을 자동으로 생성하는 다양한 기법들이 있는데, 이 중 유전알고리즘 기반 Fuzzing 기법을 활용한 테스트 케이스 입력값을 자동 생성하는 AFL의 간단한 사용법을 알아보고자 한다. AFL 홈페이지를 찾으면, AFL의 소개를 아래와 같이 하고 있다. (다른 기법인 Concolic Testing 활용은 Link1, Link2를 참고한다.)

 

American fuzzy lop is a security-oriented fuzzer that employs a novel type of compile-time instrumentation and genetic algorithms to automatically discover clean, interesting test cases that trigger new internal states in the targeted binary. This substantially improves the functional coverage for the fuzzed code. The compact synthesized corpora produced by the tool are also useful for seeding other, more labor- or resource-intensive testing regimes down the road.

 

또한, binutils의 readelf를 대상으로 crash를 일으키는 입력값을 찾아보도록 한다.

 

준비하기

설치하기(docker)

기 구축된 docker 이미지가 있으므로 이를 활용하여 afl을 위한 환경을 구축한다.

드라이브 마운트는 -v 옵션을 조절하여 변경할 수 있다.

sudo docker run --name afl_test -v /home/ppiazi/work:/media/work -it mykter/afl-training /bin/bash

 

binutils 2.25 다운로드

테스트 대상이 되는 binutils 2.25버전을 다운로드하여, /home/ppiazi/work 에 압축을 해제한다.

 

테스트

afl-gcc로 binutils 빌드

cd ~/binutils-2.25
CC=afl-gcc ./configure
make

 

afl-fuzzer로 fuzzing 시작

readelf 를 대상으로 시작하며, 초기 폴더 구조 및 최초 test case 입력값을 만들어 준다.

cd ~/binutils-2.25
mkdir afl_in afl_out
cp /bin/ps afl_in/

 

afl-fuzz 명령어를 사용하여 fuzzing을 시작한다.

cd ~/binutils-2.25
afl-fuzz -i afl_in -o afl_out ./binutils/readelf -a @@

 

fuzzing 시도 시 아래와 같은 메시지가 나올 수가 있는데 2가지 방법으로 해결가능하다.

(프로그램이 Crash 일으켰을때 기본 처리 방식을 바꾸어줘야 한다.)

root@09e5fb5bd212:/media/work/binutils-2.25# afl-fuzz -i afl_in -o afl_out ./binutils/readelf -a @@
afl-fuzz 2.52b by <lcamtuf@google.com>
[+] You have 4 CPU cores and 1 runnable tasks (utilization: 25%).
[+] Try parallel jobs - see /usr/local/share/doc/afl/parallel_fuzzing.txt.
[*] Checking CPU core loadout...
[+] Found a free CPU core, binding to #0.
[*] Checking core_pattern...

[-] Hmm, your system is configured to send core dump notifications to an
    external utility. This will cause issues: there will be an extended delay
    between stumbling upon a crash and having this information relayed to the
    fuzzer via the standard waitpid() API.

    To avoid having crashes misinterpreted as timeouts, please log in as root
    and temporarily modify /proc/sys/kernel/core_pattern, like so:

    echo core >/proc/sys/kernel/core_pattern

[-] PROGRAM ABORT : Pipe at the beginning of 'core_pattern'
         Location : check_crash_handling(), afl-fuzz.c:7275

root@09e5fb5bd212:/media/work/binutils-2.25# 

 

방법1)

echo core > /proc/sys/kernel/core_pattern
afl-fuzz -i afl_in -o afl_out ./binutils/readelf -a @@

 

방법2)

AFL_I_DONT_CARE_ABOUT_MISSING_CRASHES=1 afl-fuzz -i afl_in -o afl_out ./binutils/readelf -a @@

 

결과

구동화면

테스트 결과

afl_out/crashes 폴더 하부에 crash를 일으키는 입력들이 생성되었음을 확인할 수 있다.