Notice
Recent Posts
Recent Comments
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
Tags
more
Archives
Today
Total
관리 메뉴

topcue

Fuzzing on OS X m1 with AFL++ 본문

바이너리 분석

Fuzzing on OS X m1 with AFL++

topcue 2021. 3. 10. 12:09

[목차]


💡
이글은 m1에서 intel 계열의 바이너리를 퍼징하는 것이 한계입니다. ARM 계열의 바이너리는 instrumentation없이 binary-only fuzzing만 가능합니다. ARM 계열의 Ubuntu Linux에서의 퍼징은 CPUU - ARM64 에서의 Fuzzing - (1) honggfuzz를 참고해주세요.

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/


'바이너리 분석' 카테고리의 다른 글

ELF 포맷(The ELF Format)  (0) 2021.09.14
Anatomy of a Binary  (0) 2021.09.14
PLT GOT 동작과정 분석  (1) 2021.02.25
Fuzz with AFL & Exploit dact (2) Exploit  (0) 2021.02.25
Fuzz with AFL & Exploit dact (1) Fuzzing  (1) 2021.02.25
Comments