1. 정의

instrumentation-guided genetic algorithm 과 결합된 퍼저. 커버리지를 넓혀가며 프로그램 제어 흐름에 대한 변경사항을 기록하고, 이를 로깅하여 크래시를 발견한다. 소프트웨어적인 측면에서는 버그를 찾는게 목표였으나, 보안쪽으로는 익스플로잇터블한 버그를 발견하는게 차이점이다.

2. 특징

커버리지 기반 퍼저

코드 커버리지 측정을 위한 코드를 컴파일 타임에 삽입

QEMU를 이용하여 런타임시에 코드 삽입(Instrumentaiton)도 가능함. 여기서의 코드는 어디까지 실행이 되었는지를 구별해 주는 코드.

3. 과정

  1. afl-fuzz에서 우리가 퍼징하려는 프로그램을 실행한다.

  2. 해당 프로그램이 처음으로 실행되면서 afl-fuzz와 pipe로 통신을 하면서 fork server를 만들고, 새로운 타겟 인스턴스를 fork call()로 실행한다.

  3. 표준 입력 or file로 들어온 입력이 fuzz 대상 프로그램으로 전달된다.

  4. 실행된 결과를 에 기록하여 실행을 완료한다.

    공유 메모리

  5. afl-fuzz는 에서 fuzz 대상이 남긴 기록을 읽고 이전 항목을 변경하여 새로운 입력을 만든다.

    공유메모리

  6. 새롭게 만든 입력은 다시 프로그램에 들어가서 실행된다.

4. 실습

$ wget <http://lcamtuf.coredump.cx/afl/releases/afl-latest.tgz> $ tar -xvf afl-latest.tgz $ cd afl-2.52b/ $ make $ sudo make install

https://s3-us-west-2.amazonaws.com/secure.notion-static.com/68cf6663-c3e8-437c-a50a-4d468f0fc7fe/Untitled.png