본문 바로가기

보안, 해킹/_Fuzzing

[Fuzzing101] Exercise2 (CVE-2009-3895, CVE-2012-2836)

이전에 진행했던 Xpdf에대한 취약점을 퍼징으로 찾는것에서는 하나의 취약한 실행파일 뭉치를 통해서 퍼징 사용법을 익혔다.

 

이번에는 library 와 실행파일 을 함께 묶어서 퍼징하는 것에 대하여 배운다.

즉, library 종류의 파일들에 대한 퍼징을 어떻게 진행해야하는지, 특정 부분만 떼어서 퍼징하는 것을 배우는 것이다.

 

이전 과 동일하게

 

1. 환경 구축

2. 타겟 계측 및 빌드

3. 시드 코퍼스 준비

4. 퍼징 실행

5. 결과 분석

6. 보고 및 수정

 

퍼징 단계에 맞춰서 진행한다.

 

1. 환경 구축

# 1. libexif 0.6.14 (취약한 버전) 다운로드 및 압축 해제
wget https://github.com/libexif/libexif/archive/refs/tags/libexif-0_6_14-release.tar.gz
tar -xzvf libexif-0_6_14-release.tar.gz

# 2. exif 0.6.15 (인터페이스 프로그램) 다운로드 및 압축 해제
# libexif 함수를 호출해줄 실행 파일이 필요해서 받습니다.
wget https://github.com/libexif/exif/archive/refs/tags/exif-0_6_15-release.tar.gz
tar -xzvf exif-0_6_15-release.tar.gz

 

2.타겟 계측 및 빌드

# 1. 라이브러리 빌드
# 필요 의존성 설치
sudo apt-get update && sudo apt-get install -y autopoint libtool gettext libpopt-dev

# 빌드 설정 생성
autoreconf -fvi

# AFL 컴파일러 지정 및 설치 경로 설정 ($HOME/fuzzing_ex2/install)
# M4 Mac(ARM)에서도 afl-clang-lto는 잘 동작합니다.
CC=afl-clang-lto ./configure --enable-shared=no --prefix="$HOME/fuzzing_ex2/install/"

# 컴파일 및 설치
make
make install

# 2. 인터페이스 빌드
autoreconf -fvi

# PKG_CONFIG_PATH를 통해 방금 빌드한 libexif의 위치를 알려줍니다.
PKG_CONFIG_PATH=$HOME/fuzzing_ex2/install/lib/pkgconfig \
CC=afl-clang-lto \
./configure --enable-shared=no --prefix="$HOME/fuzzing_ex2/install/"

make
make install

 

 

3.시드 코퍼스 준비

wget -O input/sample.jpg \
https://raw.githubusercontent.com/ianare/exif-samples/master/jpg/Canon_40D.jpg

 

4.퍼징 실행

afl-fuzz -i input/ -o output/ -D -M master -- \
$HOME/[본인 퍼징 경로]/install/bin/exif @@

 

5. 결과 분석

퍼징 결과

#crash 값 실행에 대한 gdb 분석
Program received signal SIGSEGV, Segmentation fault.
0x0000fffff7dc1b8c in ?? () from /lib/aarch64-linux-gnu/libc.so.6
(gdb) bt
#0  0x0000fffff7dc1b8c in ?? () from /lib/aarch64-linux-gnu/libc.so.6
#1  0x0000aaaaaaaae294 in exif_data_load_data_content (data=data@entry=0xaaaaaaae2a00, ifd=ifd@entry=EXIF_IFD_1, d=d@entry=0xaaaaaaae3a16 "II*", ds=ds@entry=2470, offset=998, offset@entry=996, recursion_depth=recursion_depth@entry=0)
    at exif-data.c:381
#2  0x0000aaaaaaaaee70 in exif_data_load_data (data=0xaaaaaaae2a00, d_orig=<optimized out>, ds_orig=<optimized out>) at exif-data.c:835
#3  0x0000aaaaaaab3038 in exif_loader_get_data (loader=loader@entry=0xaaaaaaae27d0) at exif-loader.c:387
#4  0x0000aaaaaaaa966c in main (argc=<optimized out>, argv=<optimized out>) at main.c:438
(gdb) list
307	 */
308	static unsigned int list_tags = 0, show_description = 0, machine_readable = 0;
309	static unsigned int xml_output = 0;
310	static unsigned int extract_thumbnail = 0, remove_thumbnail = 0;
311	static unsigned int remove_tag = 0;
312	static unsigned int list_mnote = 0, debug = 0;
313	static unsigned int show_version = 0;
314	static const char *set_value = NULL, *ifd_string = NULL, *tag_string = NULL;
315	static ExifIfd ifd = EXIF_IFD_0;
316	static ExifTag tag = 0;
(gdb) frame 1
#1  0x0000aaaaaaaae294 in exif_data_load_data_content (data=data@entry=0xaaaaaaae2a00, ifd=ifd@entry=EXIF_IFD_1, d=d@entry=0xaaaaaaae3a16 "II*", ds=ds@entry=2470, offset=998, offset@entry=996, recursion_depth=recursion_depth@entry=0)
    at exif-data.c:381
381						exif_data_load_data_thumbnail (data, d,
(gdb) list
376									       thumbnail_length);
377					break;
378				case EXIF_TAG_JPEG_INTERCHANGE_FORMAT_LENGTH:
379					thumbnail_length = o;
380					if (thumbnail_offset && thumbnail_length)
381						exif_data_load_data_thumbnail (data, d,
382									       ds, thumbnail_offset,
383									       thumbnail_length);
384					break;
385				default:
(gdb) p d
$1 = (const unsigned char *) 0xaaaaaaae3a16 "II*"
(gdb) p ds
$2 = 2470
(gdb) p thumbnail_offset 
$3 = 1090
(gdb) p thumbnail_length 
$4 = 4294967292
(gdb)

 

보면 length가 data size(ds) 보다 압도적인 큰값이 들어가는 것을 볼 수 있다. 이는 OOB 취약점을 의미한다.

 

이번 Exercise 2 를 통해 배울 수 있던 것은 Exercise 1 과 다르게 실제 라이브러리 파일을 퍼징하기 위해서는 어떤 방식을 사용해야 하는지를, 그리고 발견한 crash에 대한 분석을 어떻게 해석하는지를 알 수 있었다.

'보안, 해킹 > _Fuzzing' 카테고리의 다른 글

[Fuzzing101] Exercise 1 (CVE-2019-13288)  (0) 2026.01.31
Fuzzing  (0) 2026.01.03