
TriforceAFL(즉, AFL 및 QEMU)을 사용한 OpenBSD amd64 시스템 콜 퍼징
이것은 TriforceAFL(즉, AFL 및 QEMU)을 사용하여 OpenBSD amd64의 시스템 콜 퍼징을 수행하는 데 사용되는 파일 모음입니다. 이를 사용하려면 TriforceAFL(https://github.com/nccgroup/TriforceAFL), FlashRD 2.0 배포판(http://www.nmedia.net/flashrd/), 드라이버와 디스크 이미지를 빌드할 OpenBSD 시스템, 그리고 퍼저를 실행할 Linux 호스트가 필요합니다(다른 퍼저 호스트에서도 작동할 수 있지만, 우리는 Linux 호스트, 특히 Debian/Ubuntu에서만 TriforceAFL을 실행해 보았습니다).
OpenBSD 시스템에서는 모든 작업을 root로 수행할 것입니다. 이 시스템은 환경을 부트스트랩하는 데만 사용되기 때문입니다. 이미 OpenBSD 시스템이 있다면 root로 수행하는 작업을 줄여도 됩니다. OpenBSD 사용 경험이 풍부한 사용자라면 이 내용의 상당 부분이 지나치게 장황하게 느껴질 수 있습니다. 어쨌든 계속 진행합니다!
OpenBSD 시스템에서:
export PKG_PATH=http://mirrors.sonic.net/pub/OpenBSD/$(uname -r)/packages/$(uname -m)/
pkg_add git
pkg_add python # pick python 2.7
다음으로 OpenBSD 소스와 커널 소스를 내려받은 후 압축을 풀어야 합니다:
cd ~
ftp http://mirrors.sonic.net/pub/OpenBSD/5.9/src.tar.gz
ftp http://mirrors.sonic.net/pub/OpenBSD/5.9/sys.tar.gz
cd /usr/src; tar -xzpf $HOME/src.tar.gz; tar -xzpf $HOME/sys.tar.gz;
이미 설치 CD가 있다면 다음 파일들을 내려받을 필요가 없습니다($CDMOUNT/5.9/amd64/*.tgz에 있으니까요). $DISTDIR만 적절히 설정하면 됩니다. 그렇지 않다면...
cd ~
ftp http://mirrors.sonic.net/pub/OpenBSD/5.9/amd64/base59.tgz
ftp http://mirrors.sonic.net/pub/OpenBSD/5.9/amd64/man59.tgz
ftp http://mirrors.sonic.net/pub/OpenBSD/5.9/amd64/comp59.tgz
ftp http://mirrors.sonic.net/pub/OpenBSD/5.9/amd64/game59.tgz
export DISTDIR=~
이제 필요한 의존성이 설치되었으므로 빌드를 시작할 수 있습니다.
TriforceOpenBSDFuzzer 디렉터리로 들어가십시오. OpenBSD 파일(targ)과 퍼저 호스트 파일(fuzzHost)이 들어 있는 별도의 디렉터리가 있습니다.
OpenBSD 호스트에서 targ 디렉터리로 들어가 make를 실행하십시오. 또한 이 디렉터리에서 입력 파일을 빌드해야 합니다.
mkdir inputs
./gen.py # build simple tests
./genTempl.py templ.txt # build most syscall tests
./gen2.py # build complex syscall tests
tar -czf ../inputs.tgz inputs
다음으로 FlashRD 배포판(http://www.nmedia.net/flashrd/)을 사용하여 드라이버가 포함된 디스크 이미지를 빌드해야 합니다. OpenBSD 호스트(위 섹션에서와 같이 /usr/src에 소스가 있고 /usr/src/sys에 커널 소스가 있는 상태)에서 이제 몇 가지 작업을 수행할 것입니다:
cd ~ #make sure this is on your /home parition, you will need significant disk space for this
ftp http://www.nmedia.net/flashrd/flashrd-2.0.tar.gz
tar xzf flashrd-2.0.tar.gz
cd flashrd-2.0
patch -p1 < $FUZZER/image-diff.txt #set $FUZZER to where you cloned TriforceOpenBSDFuzzer
mkdir obsd
cd obsd
tar xzpf $DISTDIR/base59.tgz
tar xzpf $DISTDIR/man59.tgz
tar xzpf $DISTDIR/comp59.tgz
tar xzpf $DISTDIR/game59.tgz
tar xzpf /var/sysmerge/etc.tgz
cp $FUZZER/image-etc-rc etc/rc
cp $FUZZER/targ/inputs/ex1 root/ex1
cd ..
이제 다음 명령을 실행하여 이미지를 만들 수 있습니다:
cp $FUZZER/targ/driver obsd/bin/driver
./flashrd obsd
mv flashimg* $FUZZER/flashimg.bin
mv bsd.gdb $FUZZER/bsd.gdb
flashimg.bin과 bsd.gdb의 사본을 저장해 두십시오. 퍼저 호스트에서 필요합니다.
디버깅을 위해 대화형 셸을 실행할 수 있는 두 번째 이미지를 만들고 싶을 수도 있습니다. obsd/etc/rc를 편집하여 /bin/driver -v를 /bin/sh -i로 바꾼 다음 두 번째 이미지를 만드십시오. 그런 다음 나중을 위해 flashimg-sh.bin과 bsd-sh.gdb의 사본을 저장합니다.
./flashrd obsd
mv flashimg* $FUZZER/flashimg-sh.bin
mv bsd.gdb $FUZZER/bsd-sh.gdb
이제 OpenBSD 시스템에서 나와 퍼저 호스트로 돌아갈 수 있습니다(퍼저 호스트에서 사용할 수 있도록 $FUZZER를 복사해 두십시오).
퍼저는 Linux 호스트에서 실행합니다(TriforceAFL이 빌드되고 실행되는 모든 호스트에서 작동해야 하지만, 특히 Linux가 아닌 호스트에서는 결과가 다를 수 있습니다). 퍼저 호스트에서 TriforceAFL을 ../TriforceAFL에 설치하십시오. flashimg*.bin과 bsd*.gdb를 fuzzhost 디렉터리로 복사하고, 입력 파일을 fuzzHost 디렉터리에 압축 해제하십시오:
cd TriforceOpenBSDFuzzer # this should now have the files we made on the BSD host in it
cp flashimg* fuzzHost/
cp bsd* fuzzHost/
cd fuzzhost
tar xzf ../inputs.tgz
이제 퍼징을 시작할 준비가 되었습니다! fuzzHost 디렉터리로 들어가 ./runFuzz -M M0으로 퍼저를 시작하십시오.
runFuzz 스크립트는 항상 마스터/슬레이브 모드로 실행되므로 마스터 또는 슬레이브 이름을 요구합니다. 자세한 사용 정보는 runFuzz 스크립트를 참조하십시오.
테스트 케이스(예: 크래시)를 재현하려면 퍼저 호스트에서 다음을 실행하십시오:
./runTest inputs/ex1
./runTest outputs/crashes/id*
또한 에뮬레이션 환경 밖에서 드라이버를 실행할 수 있습니다. -t 옵션으로 드라이버를 실행하고, -vv로 상세 로깅을 활성화하며, -x로 시스템 콜을 실제로 수행하지 않을 수 있습니다. 예를 들어 OpenBSD 호스트에서 다음을 실행하십시오:
./driver -tvvx < inputs/ex1
ktrace ./driver -t < inputs/ex1
커널을 부팅하고 테스트를 대화형으로 실행할 수 있으면 때때로 유용합니다. ./runSh를 실행하여 대화형 셸로 부팅할 수 있습니다.
테스트를 위해 flashimg-sh.bin 파일에 추가 파일(예: 테스트 케이스)을 넣고 싶을 것입니다. 이렇게 하려면 OpenBSD 호스트에서 추가 파일을 flashrd-2.0/obsd/root로 복사하고 플래시 이미지를 다시 빌드하십시오. 파일을 퍼저 호스트로 다시 전송한 후 runSh를 다시 실행하십시오. 추가 파일은 /root 디렉터리에서 찾을 수 있습니다. 또한 이미지를 생성한 후 OpenBSD 호스트에서 root로 플래시 이미지에 파일을 추가할 수도 있습니다:
vnconfig vnd0 ./flashimg.bin
mount /dev/vnd0a /mnt
cp file /mnt
umount /mnt
vnconfig -u vnd0
여기에 추가된 파일은 이미지가 부팅될 때 /flash에 나타납니다.
앞서 flashrd 배포판에 적용한 패치는 커널 빌드 시 디버깅을 활성화하고 최적화를 비활성화합니다. 이렇게 하면 디버깅이 훨씬 쉬워집니다.
fuzzHost에서 커널을 디버깅하려면 OpenBSD 호스트에서 /usr/src/sys의 사본을 만들고 bsd-sh.gdb를 sys/x/x/x/x에 복사하십시오. 한 창에서 ./runSh를 실행하고 시스템이 부팅된 후 다음을 실행하십시오:
cd sys
mkdir -p x/x/x/x
cd x/x/x/x
cp $FUZZER/bsd-sh.gdb .
gdb -ex "target remote :1234" ./bsd-sh.gdb