https://github.com/antonio-morales/Fuzzing101/tree/main/Exercise%202
Fuzzing101/Exercise 2 at main · antonio-morales/Fuzzing101
An step by step fuzzing tutorial. A GitHub Security Lab initiative - antonio-morales/Fuzzing101
github.com
libexif를 타겟으로 한다.
우선 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
빌드한다.
cd libexif-libexif-0_6_14-release/
sudo apt-get install autopoint libtool gettext libpopt-dev
autoreconf -fvi
./configure --enable-shared=no --prefix="$HOME/fuzzing_libexif/install/"
make
make install
libexif는 라이브러리이므로 이 라이브러리를 사용하고 퍼징할 다른 애플리케이션이 필요하다.
cd $HOME/fuzzing_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.gz8
# 빌드 -> exif명령줄 유틸리티
cd exif-exif-0_6_15-release/
autoreconf -fvi
./configure --enable-shared=no --prefix="$HOME/fuzzing_libexif/install/" PKG_CONFIG_PATH=$HOME/fuzzing_libexif/install/lib/pkgconfig
make
make install
#테스트
cd exif-exif-0_6_15-release/
autoreconf -fvi
./configure --enable-shared=no --prefix="$HOME/fuzzing_libexif/install/" PKG_CONFIG_PATH=$HOME/fuzzing_libexif/install/lib/pkgconfig
make
make install
완료하면

다음과 같이 나온다.
이제 시드를 생성한다.
Exif샘플을 가져온다.
cd $HOME/fuzzing_libexif
wget https://github.com/ianare/exif-samples/archive/refs/heads/master.zip
unzip master.zip
다음과 같이 테스트를 한다.
$HOME/fuzzing_libexif/install/bin/exif $HOME/fuzzing_libexif/exif-samples-master/jpg/Canon_40D_photoshop_import.jpg

이제 afl-clang-lto 계측을 한다.
afl-clang-lto를 컴파일러로 사용해 libexif를 빌드한다.
rm -r $HOME/fuzzing_libexif/install
cd $HOME/fuzzing_libexif/libexif-libexif-0_6_14-release/
make clean
export LLVM_CONFIG="llvm-config-11"
CC=afl-clang-lto ./configure --enable-shared=no --prefix="$HOME/fuzzing_libexif/install/"
make
make install
cd $HOME/fuzzing_libexif/exif-exif-0_6_15-release
make clean
export LLVM_CONFIG="llvm-config-11"
CC=afl-clang-lto ./configure --enable-shared=no --prefix="$HOME/fuzzing_libexif/install/" PKG_CONFIG_PATH=$HOME/fuzzing_libexif/install/lib/pkgconfig
make
make install
이제 퍼징을 실행한다.
export LD_LIBRARY_PATH=$HOME/fuzzing_libexif/install/lib:$LD_LIBRARY_PATH
afl-fuzz -i $HOME/fuzzing_libexif/exif-samples-master/jpg/ \
-o $HOME/fuzzing_libexif/out/ \
-s 123 -- \
$HOME/fuzzing_libexif/install/bin/exif @@
하지만 오류가 났다.
그래서
sudo su
echo core >/proc/sys/kernel/core_pattern
exit
다음과 같이 해결하였다.

7분 돌렸더니 16개의 크래시가 나왔다.


그런데 이상한 부분에서 크래시가 났다.
다시 처음부터 해보았다.

gdb --args $HOME/fuzzing_libexif/install/bin/exif id:000001,sig:11,src:000000,time:10104,execs:10914,op:arith32,pos:34,val:-9


이렇게 다음과 같은 부분에서 크래시가 난다.
지금
Program received signal SIGSEGV, Segmentation fault.
exif_get_sshort (
buf=0x5556557b7605, order=EXIF_BYTE_ORDER_INTEL) at exif-utils.c:94
94 return ((buf[1] << 8) | buf[0]);
이 부분에서 문제가 난다.
buf가 가리키는 주소 0x5556557b7605는 유효하지 않아 buf[1] 접근 시 segfault가 난다.
#0 exif_get_sshort
#1 exif_get_short
#2 exif_data_load_data
#3 exif_loader_get_data
#4 main
exif_loader_get_data() → exif_data_load_data() 내부에서 TIFF/EXIF 데이터를 파싱하다가 exif_get_sshort() 호출 시 잘못된 포인터를 전하게 된다.
// exif_get_sshort() 함수
exif_get_sshort (const unsigned char *buf, ExifByteOrder order)
{
if (!buf) return 0;
switch (order) {
case EXIF_BYTE_ORDER_MOTOROLA:
return ((buf[0] << 8) | buf[1]);
case EXIF_BYTE_ORDER_INTEL:
return ((buf[1] << 8) | buf[0]);
}
return 0;
}
이를 보면 buf가 NULL이 아닌지만 체크하고 길이는 검증하지 않는다.
exif_data_load_data에서 경계 검증 없이 임의의 오프셋을 buf로 넘기면 조작한 JPEG/EXIF입력에서 경계 밖 포인터가 생성될 수 있다.
if (!buf || remaining < 2) return 0;
이렇게 패치를 하면 Out-of-bounds Read를 해결할 수 있다.
'pwanble' 카테고리의 다른 글
| [How2Heap] - house_of_lore.c (0) | 2025.10.30 |
|---|---|
| [How2Heap] - house_of_spirit.c (0) | 2025.10.28 |
| [Fuzzing101] - Exercise 1 (0) | 2025.09.19 |
| 06. [How2Heap] - unsafe_unlink.c (0) | 2025.09.09 |
| 05. [How2Heap] fastbin_dup_consolidate.c (0) | 2025.09.05 |