###### tags: `afl`
# AFL QEMU_MODE(一)
因為afl跟firmadyne都是用qemu來模擬不一樣arch,然後讓我們可以在x86上去模擬一些其他arch的系統或是module,所以我就想,如果某個firmware是firmadyne可以成功模擬起來的,那我應該就可以成功的用afl-qemu的方式,對這個firmware的某個特定module做fuzzing。
有這樣的想法之後,我就決定用firmadyne拿來特範例的那個firmware('WNAP320 Firmware Version 2.0.3.zip')來當作我實驗afl-qemu的目標,也因為他是mips的架構,應該會比書銘還有智威學長在做的ARMv7架構,更少了一些問題。
一開始先用firmadyne試了一下,有成功的虛擬化起來,所以我就確定他是可以用qemu虛擬化成功的。接下來就要看看他裡面的一些binary是不是我也可以拿來用afl-qemu模擬,然後成功對他們fuzzing。
## 自己解壓縮
在images的路徑底下有一個**1.tar.gz**,應該就是這個firmware的file_system,所以我就把他複製一份,然後自己把他extract到另外一各地方(image),然後看到他有bin這個路徑,所以我就對裡面的檔案用file看一下他們的檔案格式是什麼。然後他說是這個格式:
`ln: symbolic link to busybox`
後來開會的時候問了一下智威學長,他說真正的bin會放在sbin裡面,這邊我想說先留著,之後如果有時候的話再來看看是不是也可以fuzzing其他的bin程式。
再看一下busybox的格式:
`busybox: ELF 32-bit MSB executable, MIPS, MIPS32 version 1 (SYSV), dynamically linked, interpreter /lib/ld-, stripped`
看到這邊他是真的寫executable,然後是`mips 32bit`的架構,我就決定先從這個binary下手,如果busybox可以成功fuzzing的話,後續再來看看其他firmware裡的bin程式能不能也成功的用AFL fuzzing。
因為一開始fuzzing的時候,qemu_mode的架構是指定在x86_64底下的,
如果我對x86-64的busybox fuzzing,那結果就會變成


之後就可以成功的看到他成功的在fuzzing了,所以透過這個方式,我們就可以在windows的x86的平台上,對mips-32bit的binary做fuzzing,而且不用需要有source code。
但是如果我是對mips架構的busybox下fuzzing的指令的話,就會變成:
```
$ afl-fuzz -i fuzz_in -o fuzz_out/ -Q ./busybox
...
[-] Hmm, looks like the target binary terminated before we could complete a
handshake with the injected code. There are two probable explanations:
- The current memory limit (200 MB) is too restrictive, causing an OOM
fault in the dynamic linker. This can be fixed with the -m option. A
simple way to confirm the diagnosis may be:
( ulimit -Sv $[199 << 10]; /path/to/fuzzed_app )
Tip: you can use http://jwilk.net/software/recidivm to quickly
estimate the required amount of virtual memory for the binary.
- Less likely, there is a horrible bug in the fuzzer. If other options
fail, poke <lcamtuf@coredump.cx> for troubleshooting tips.
[-] PROGRAM ABORT : Fork server handshake failed
Location : init_forkserver(), afl-fuzz.c:2253
```
下面錯誤的地方就顯示在forkserver,應該是代表一開始連要fork都不行,所以我們要回到AFL/qemu_mode底下,重新編譯一下afl-qemu_mode的程式,編譯的時候下以下的指令。
`CPU_TARGET=mips ./build_qemu_support.sh`
CPU_TARGET的選項,可以在`/AFL/qemu_mode/qemu-2.10.0/linux-user`這個路徑下看到所有可以用的指令集架構

編譯完成之後,再試試看能不能對不一樣架構的binary做fuzzing,但是結果還是一樣:

## afl-showmap
看來上面的方法不行之後,就後續再查了一陣子,看看可以怎麼解
後來發現用`afl-showmap`這個指令可以看細節,看看到底qemu在虛擬mips架構的busybox的時候,發生了什麼事情,再一個一個來解決
指令:`afl-showmap -m none -o dev/null -Q bin/busybox`

他這邊說/etc/ld.so.caahe is corrupt,可是在1.tar.gz這個firmadyne用binwalk得到的filesystem裡面的/etc的路徑底下,也沒有`ld.so.cache`這個東西,這邊先留一個問題?
第二個地方他說不能load `libm.so.0`這個libary的link我有在filesystem的/lib這個路徑下找到,可是我找他跟他連結到的`libm-0.9.29.so`一起複製到根目錄的/lib底下,之後再試一次afl-showmap的指令,可是還是沒有過,可能會跟firmadyne在虛擬的時候用到的東西有關,可以再研究一下~~