pwnable/Fuzzing

AFL++ LTO mode

범고래_1 2022. 1. 29. 21:46

 

AFL++에서 고오급 기능인 LTO 모드를 지원한다.

공식 문서에 따르면 LTO 모드를 사용하면 더 빠른 속도와 높은 커버리지를 가진다고 한다.

LTO 모드를 사용하기 위해서는 llvm 11 버전 이상을 사용해야 한다.

LTO 모드를 사용할 수 없으면 LLVM 모드를 사용하고, 이것도 불가능하면 GCC_PLUGIN 모드를 사용하고...

이런 식으로 점차 내려가게 된다. (https://github.com/AFLplusplus/AFLplusplus/blob/stable/docs/fuzzing_in_depth.md)

 

stable 버전인 13버전을 설치하고 LTO 모드를 사용해보자.

LLVM Install

다음 내용을 /etc/apt/sources.list.d에 적당히 추가해준다.

20.04(focal), 21.04(hirsute) 적당히 알맞게...

Focal (20.04) LTS - Last update : Fri, 28 Jan 2022 19:42:23 UTC / Revision: 20220128052849+ea05ee90596c
deb http://apt.llvm.org/focal/ llvm-toolchain-focal main
deb-src http://apt.llvm.org/focal/ llvm-toolchain-focal main
# 12
deb http://apt.llvm.org/focal/ llvm-toolchain-focal-12 main
deb-src http://apt.llvm.org/focal/ llvm-toolchain-focal-12 main
# 13
deb http://apt.llvm.org/focal/ llvm-toolchain-focal-13 main
deb-src http://apt.llvm.org/focal/ llvm-toolchain-focal-13 main

-------------------------------------------------

Hirsute (21.04) - Last update : Fri, 28 Jan 2022 22:19:17 UTC / Revision: 20220128083604+c2a961e414e0
deb http://apt.llvm.org/hirsute/ llvm-toolchain-hirsute main
deb-src http://apt.llvm.org/hirsute/ llvm-toolchain-hirsute main
# 12
deb http://apt.llvm.org/hirsute/ llvm-toolchain-hirsute-12 main
deb-src http://apt.llvm.org/hirsute/ llvm-toolchain-hirsute-12 main
# 13
deb http://apt.llvm.org/hirsute/ llvm-toolchain-hirsute-13 main
deb-src http://apt.llvm.org/hirsute/ llvm-toolchain-hirsute-13 main

Archive Signature

wget -O - https://apt.llvm.org/llvm-snapshot.gpg.key|sudo apt-key add -
sudo apt update

# LLVM
apt install libllvm-13-ocaml-dev libllvm13 llvm-13 llvm-13-dev llvm-13-doc llvm-13-examples llvm-13-runtime
# Clang and co
apt install clang-13 clang-tools-13 clang-13-doc libclang-common-13-dev libclang-13-dev libclang1-13 clang-format-13 python3-clang-13 clangd-13 clang-tidy-13
# libfuzzer
apt install libfuzzer-13-dev
# lldb
apt install lldb-13
# lld (linker)
apt install lld-13
apt install -y clang-13 clang-tools-13 libc++1-13 libc++-13-dev \
    libc++abi1-13 libc++abi-13-dev libclang1-13 libclang-13-dev \
    libclang-common-13-dev libclang-cpp13 libclang-cpp13-dev liblld-13 \
    liblld-13-dev liblldb-13 liblldb-13-dev libllvm13 libomp-13-dev \
    libomp5-13 lld-13 lldb-13 llvm-13 llvm-13-dev llvm-13-runtime llvm-13-tools

설치 확인

which llvm-config
llvm-config --version

PATH 설정

export PATH=/usr/lib/llvm-13/bin:$PATH

gcc plugin 설치

sudo apt install -y gcc-$(gcc --version|head -n1|sed 's/.* //'|sed 's/\..*//')-plugin-dev libstdc++-$(gcc --version|head -n1|sed 's/.* //'|sed 's/\..*//')-dev

AFL Build

apt install rustc cargo
git clone https://github.com/AFLplusplus/AFLplusplus
cd AFLplusplus
make source-only -j$(nproc)

make 옵션에 관한 상세한 사항은 여기서 참고.

qemu 모드를 쓰는게 아니면 source-only로 make해도 충분한 듯 하다.

make distrib은 모든 기능 빌드.

 

afl 관련 명령어를 편하게 쓰기 위해 path 추가. (굳이 make install 안 하고 이렇게 쓴다.)

export PATH=$PATH:/home/alkyne/AFLplusplus

Build Target Binary

이제 타겟 바이너리를 빌드할 때 afl-clang-lto, afl-clang-lto++로 빌드 하면 된다.

CC=afl-clang-lto CXX=afl-clang-lto++ LD=afl-ld-lto RANLIB=llvm-ranlib AR=llvm-ar ./configure --disable-shared --enable-lto
make -j$(nproc)

(만약 오류가 나면 AFL_LLVM_MAP_ADDR 값을 바꿔주거나 unset하자.)

빌드하면 이런식으로 mode : LLVM-LTO-PCGUARD가 찍히게 된다.

Fuzzing

Fuzzing 하는 방법은 똑같다.

afl-fuzz -m none -t 200 -i ../input -o ../output -M Main_vim -- ../../src/vim -u NONE -i NONE -n -X -Z -e -s -S @@ -c ":qa!"

 

References : 

- https://github.com/AFLplusplus/AFLplusplus/blob/stable/instrumentation/README.lto.md

- https://cpuu.postype.com/post/11671863

- https://apt.llvm.org/

https://aflplus.plus/building/

 

Acknowledgement

Special thanks to pwnstar.

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

AFL Parallel fuzzing  (1) 2022.01.24
AFL Fuzzing  (0) 2022.01.24