[목차]
Overview
ARM64 기반인 MAC OS X m1이 공개된 이래 ARM 기반의 많은 시스템 & 소프트웨어 해킹 관련 연구가 생겨날 것이라고 예상했지만! 아직까지는 생각보다 잠잠하다..
아무튼 시스템 & 소프트웨어 해킹 관련 연구자들이 m1에서 그리고 더 넓은 의미에서는 ARM 아키텍처에서의 퍼징에도 관심을 가지고 있을 것이라고 생각한다.
본인도 새로운 환경에서의 0-day나 1-day 취약점뿐 아니라 퍼징관련 소식도 주시하고 있었는데, 이전까지 한글로 된 자료는 아래 CPUU 님의 자료가 전부였다.
CPUU - ARM64 에서의 Fuzzing - (1) honggfuzz
CPUU - ARM64 에서의 Fuzzing - (2) AFL
그러다가 며칠 전 AFL++의 github issue에서 m1에서 AFL++을 빌드 할 수 있는 방법을 공개했다는 사실을 알게 되어 간단하게 정리하려 한다.
AFL++
AFL++은 AFL을 계승하여 발전시킨 fuzzer 중 하나이다.
이 사이트는 KAIST의 SoftSec Lab과 CSRC에서 관리하는 사이트로 fuzzer들의 계보를 시각화하여 보여준다.
특히 아래 그림은 AFL의 계보다.
한눈에 봐도 주렁주렁 많이 매달린 것을 알 수 있다.
물론 AFL은 '굉장히 엄청나'지만 AFL의 github을 보면 알 수 있듯이 업데이트가 활발하지 않다..
반면 AFL++은 현재도 계속해서 업데이트를 하고 있다.
특히 2020년 12월 27일에 올라온 github issue에서 ARM 기반 맥에서 AFL++을 빌드하고 사용할 수 있는 방법을 소개하기도 했다.
따라서 본인도 AFL++을 기반으로 정리하려 한다. 포스팅하는 현재 AFL++의 버전은 3.11a
다.
AFL++은 ARM 프로세서 위에서 퍼징을 지원하지만, 안타깝게도 AFL++을 ARM에서 빌드한 경우 instrumentation을 지원하지는 않아서 binary-only fuzzing
만 가능하다.
instrumentation을 포기할 수는 없다! 따라서 AFL++을 x86_64
로 컴파일해야 한다.
AFL++ build
Install Xcode-tools and LLVM
먼저 Xcode Command Line tools를 설치한다.
xcode-select --install
다음으로 brew와 llvm을 설치한다.
이때 MacOS의 xcode-tools에서 지원하는 LLVM으로는 AFL++을 빌드 할 수 없어서 brew를 이용해 최신 버전을 설치해야 한다.
아래 커맨드는 brew를 설치하지 않은 사람을 기준으로 작성했다.
sudo mkdir /opt/homebrew
sudo chown -R $(whoami) /opt/homebrew
cd /opt
curl -L https://github.com/Homebrew/brew/tarball/master | tar xz --strip 1 -C homebrew
/opt/homebrew/bin/brew update
/opt/homebrew/bin/brew install llvm
brew를 이미 설치하고 사용 중이라면 이 커맨드를 이용하면 된다.
brew update
install llvm
Switch Arhcitecture to x86_64
AFL++은 ARM 아키텍처에서 컴파일을 할 수 없으므로 터미널을 잠시 x86_64
모드로 변경해야 한다.
Rosetta2를 이용해 잠시(세션이 유지되는 동안) 아키텍처를 바꾸어 주자.
env /usr/bin/arch -x86_64 /bin/zsh --login
그리고 arch
를 이용해 아키텍처가 변경되었는지 확인해 주자.
arch
Export the LLVM path
이제 LLVM path를 export 하면 된다. 이때 llvm 경로에 따라 커맨드가 달라진다. 본인의 환경에 맞게 path를 찾아주자.
위에서 /opt/homebrew
경로에 brew를 설치한 사람은 아래 커맨드를 이용하면 된다.
export PATH="/opt/homebrew/opt/llvm/bin:$PATH"
본인은 이미 brew를 설치하여 사용 중이었기 때문에 아래 커맨드를 이용했다.
export PATH="/usr/local/opt/llvm/bin:$PATH"
Build AFL++ compiler
github에서 AFL++을 clone 하고 MakfFile을 이용해 쉽게 빌드 할 수 있다.
git clone https://github.com/AFLplusplus/AFLplusplus
mv AFLplusplus AFLPP_dir
cd AFLPP_dir/
make
그러면 아래와 같이 빌드에 성공한다!
Fuzz with AFL++
AFL++ 3.00c 릴리즈부터는 afl-clang과 afl-gcc를 통합한 afl-cc
만 제공한다고 한다.
따라서 compile-time에 instrumentation code를 삽입하기 위해서 afl-cc
를 이용하자.
간단하게 만든 아래 fuzzme.c를 컴파일하여 테스트해보자.
- fuzzme.c
afl-cc로 컴파일.
~/AFLPP_dir/afl-cc fuzzme.c -o fuzzme
input/output 디렉토리 생성.
mkdir in
echo "hello" > in/hello.txt
mkdir out
fuzzing!
~/AFLPP_dir/afl-fuzz -i in -o out ./fuzzme @@
크래시를 발견하는데 3분 정도 걸렸다.
- crashing input
$ xxd out/default/crashes/id:000000,sig:11,src:000003,time:190320,op:havoc,rep:2
00000000: 4146 4c2b 2b2b 2b2b 2b10 2b2b 46 AFL++++++.++F
결론
m1에서 퍼징은 할 수 있지만 바이너리가 intel 계열이므로 큰 의미는 없다😥.
honggfuzz는 ARM64 기반인 Ubuntu Linux에서 instrumentation 코드 삽입까지 지원해주지만, 안타깝게도 m1 환경은 지원해주지 않는다.
참고
[1] Add build documentation for M1 Macs #659 https://github.com/AFLplusplus/AFLplusplus/issues/659
[2] How to compile and run AFL Fuzzer on M1 Mac with Apple Silicon (for x86 instrumentation support) https://vineethbharadwaj.medium.com/how-to-compile-and-run-afl-fuzzer-on-m1-mac-with-apple-silicon-for-x86-instrumentation-support-4f1700eaafb6
[3] fuzzing-survey https://fuzzing-survey.org/
Uploaded by Notion2Tistory v1.1.0