
Unicorn과 LibFuzzer 기반의 비공개 소스 바이너리 퍼징 도구
uniFuzzer는 Unicorn과 LibFuzzer를 기반으로 한 폐쇄형 바이너리용 퍼징 도구입니다. 현재 ARM/MIPS의 32비트 LSB ELF 파일(주로 IoT 기기에서 볼 수 있음)을 퍼징할 수 있습니다.
대상 바이너리를 리버스 엔지니어링하여 퍼징할 흥미로운 함수를 찾습니다.
callback 디렉토리에 .c 파일을 생성합니다. 이 파일은 다음 콜백을 포함해야 합니다.
void onLibLoad(const char *libName, void *baseAddr, void *ucBaseAddr): 각 의존 라이브러리가 Unicorn에 로드될 때 호출됩니다.int uniFuzzerInit(uc_engine *uc): 모든 바이너리가 Unicorn에 로드된 직후 호출됩니다. 여기서 스택/힙/레지스터를 설정할 수 있습니다.int uniFuzzerBeforeExec(uc_engine *uc, const uint8_t *data, size_t len): 각 퍼징 실행 라운드 전에 호출됩니다.int uniFuzzerAfterExec(uc_engine *uc): 각 퍼징 실행 라운드 후에 호출됩니다.make를 실행하면 uf라는 퍼징 도구가 생성됩니다.
uniFuzzer는 다음 환경 변수를 매개변수로 사용합니다.
UF_TARGET: 대상 ELF 파일의 경로UF_PRELOAD: 프리로드 라이브러리의 경로. 라이브러리가 대상과 동일한 아키텍처인지 확인하십시오.UF_LIBPATH: 의존 라이브러리가 있는 경로. 여러 경로는 :로 구분합니다.그리고 다음 명령어를 사용하여 퍼징을 시작할 수 있습니다.
UF_TARGET=<target> [UF_PRELOAD=<preload>] UF_LIBPATH=<libPath> ./uf
기본 사용법을 위한 데모가 제공됩니다. 데모에는 다음 파일이 포함됩니다.
vuln()을 포함합니다.printf()와 단순화된 malloc()/free()를 정의합니다.vuln() 함수를 퍼징하는 데 필요한 콜백을 정의합니다.먼저, mipsel용 gcc를 설치하십시오 (데비안에서는 gcc-mipsel-linux-gnu 패키지). 데모를 빌드합니다:
# the target binary
# '-Xlinker --hash-style=sysv' tells gcc to use 'DT_HASH' instead of 'DT_GNU_HASH' for symbol lookup
# since currently uniFuzzer does not support 'DT_GNU_HASH'
mipsel-linux-gnu-gcc demo-vuln.c -Xlinker --hash-style=sysv -no-pie -o demo-vuln
# the preload library
mipsel-linux-gnu-gcc -shared -fPIC -nostdlib -Xlinker --hash-style=sysv demo-libcpreload.c -o demo-libcpreload.so
또는 위 명령어로 컴파일된 demo-vuln 및 demo-libcpreload.so 파일을 사용할 수 있습니다.
다음으로, make를 실행하여 uniFuzzer를 빌드합니다. MIPS 데모를 직접 컴파일한 경우 일부 주소가 미리 빌드된 것과 다를 수 있으므로 demo-callback.c를 그에 맞게 업데이트해야 합니다.
마지막으로, MIPS의 libc 라이브러리가 준비되었는지 확인합니다. 데비안에서는 libc6-mipsel-cross 패키지를 설치한 후 /usr/mipsel-linux-gnu/lib/에 있으며, 이것이 UF_LIBPATH로 설정되어야 합니다.
UF_TARGET=<path to demo-vuln> UF_PRELOAD=<path to demo-libcpreload.so> UF_LIBPATH=<lib path for MIPS> ./uf
Unicorn은 이 이슈로 인해 QEMU의 JIT 캐시를 지우므로, 각 실행 라운드마다 대상 바이너리를 JIT 재컴파일해야 하므로 퍼징 속도가 느려집니다.
성능을 위해 해당 이슈에 설명된 대로 tb_flush(env);를 주석 처리할 수 있습니다.
GNU_HASH 지원IFUNC 지원