
[ Fuzzing 101 ] Exercise 1 - Xpdf (CVE-2019-13288)
sangjuns
·2023. 8. 1. 09:07
Fuzzing 101의 내용을 번역해봤습니다.
목표
XPDF3.02에서 CVE-2019-13288 취약점 발견하기
환경구축
XPDF3.02빌드하기
1. 타겟 디렉토리 생성
cd $HOME
mkdir fuzzing_xpdf && cd fuzzing_xpdf/
2. make와 gcc 도구 설치
sudo apt install build-essential
3. Xpdf 3.02 다운로드
wget https://dl.xpdfreader.com/old/xpdf-3.02.tar.gz
tar -xvzf xpdf-3.02.tar.gz
4. Xpdf 빌드
cd xpdf-3.02
sudo apt update && sudo apt install -y build-essential gcc
./configure --prefix="$HOME/fuzzing_xpdf/install/"
make
make install
5. 빌드된 실행파일 테스트하기
cd $HOME/fuzzing_xpdf
mkdir pdf_examples && cd pdf_examples
wget https://github.com/mozilla/pdf.js-sample-files/raw/master/helloworld.pdf
wget http://www.africau.edu/images/default/sample.pdf
wget https://www.melbpc.org.au/wp-content/uploads/2017/10/small-example-pdf-file.pdf
~/fuzzing_xpdf/install/bin/pdfinfo -box -meta ~/fuzzing_xpdf/pdf_examples/helloworld.pdf
AFL++ 구축하기
cd ~
git clone https://github.com/AFLplusplus/AFLplusplus.git
cd AFLplusplus
CC=/path/to/afl-cc CXX=/path/to/afl-c++
./configure --disable-shared make clean all
퍼징 테스트하기
이전 빌드된 xpdf실행파일 삭제 & AFL-clang-fast로 xpdf 빌드하기 & 퍼징해보기
--> AFL-clang-fast 컴파일러로 새롭게 빌드하는 이유는 AFL은 코드 커버리지 기반 퍼저이기 때문에
전체 바이너리 중에 어느 분기문이 실행되고 실행되지 않았는지 측정하기 위함이다.
즉, 원본 코드에 AFL이 알아볼 수 있는 코드를 새롭게 추가하여 어느 부분이 실행됐는지 안됐는지 측정하기 위함.
취약점이 발견된 바이너리는 pdftotext 바이너리이다.
llvm모드와 afl-clang-fast컴파일러를 사용하는데 이것은 성능 및 속도 향상을 위함이다.
rm -r $HOME/fuzzing_xpdf/install
cd $HOME/fuzzing_xpdf/xpdf-3.02/
make clean
export LLVM_CONFIG="llvm-config-11"
CC=$HOME/AFLplusplus/afl-clang-fast CXX=$HOME/AFLplusplus/afl-clang-fast++ ./configure --prefix="$HOME/fuzzing_xpdf/install/"
make
make install
$HOME/AFLplusplus/afl-fuzz -i $HOME/fuzzing_xpdf/pdf_examples/ -o $HOME/fuzzing_xpdf/out/ -s 123 -- $HOME/fuzzing_xpdf/install/bin/pdftotext @@ $HOME/fuzzing_xpdf/output
크래시 분석하기
afl-fuzz에서 -o 옵션을 통해 $HOME/fuzzing_xpdf/out에 출력파일을 설정해줬기 때문에
cd $HOME/fuzzing_xpdf/out/default/crashes 해보면 크래시 났을 때 input들이 있다.
크래시 났을 때 input을 재현해보자
$HOME/fuzzing_xpdf/install/bin/pdftotext $HOME/fuzzing_xpdf/out/default/crashes/<<크래시 파일>> $HOME/fuzzing_xpdf/output
AFL 컴파일러가 아닌 원래 컴파일러로 빌드하고 gdb로 확인해보기
rm -r $HOME/fuzzing_xpdf/install
cd $HOME/fuzzing_xpdf/xpdf-3.02/
make clean
CFLAGS="-g -O0" CXXFLAGS="-g -O0" ./configure --prefix="$HOME/fuzzing_xpdf/install/"
make
make install
gdb --args $HOME/fuzzing_xpdf/install/bin/pdftotext $HOME/fuzzing_xpdf/out/default/crashes/<your_filename> $HOME/fuzzing_xpdf/output
r
bt
getObj메소드를 재귀적으로 호출하면 Dos Attack에 이용될 가능성 있다고 봐서 CVE를 주었나보다.
'Pwnable > Fuzzer' 카테고리의 다른 글
[ Fuzzer ] Syzkaller 공부 자료들 (0) | 2022.08.18 |
---|---|
[ Fuzzer ] AFL Fuzzer 소스코드 분석 (0) | 2022.05.10 |
AFL++논문 리뷰 (오픈소스) (0) | 2022.03.09 |
[ Fuzzer ] AFL / AFL++ 정리 (0) | 2022.02.24 |
[ Fuzzer ] AFL퍼저로 dict 크래시부터 Exploit까지.. (0) | 2022.02.01 |