이전에 진행했던 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 |