본문 바로가기

pwanble

[Fuzzing101] Exercise 2

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