###### 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,那結果就會變成 ![](https://i.imgur.com/8a9qVWi.png) ![](https://i.imgur.com/0z6xIfl.png) 之後就可以成功的看到他成功的在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`這個路徑下看到所有可以用的指令集架構 ![](https://i.imgur.com/c2lonoK.png) 編譯完成之後,再試試看能不能對不一樣架構的binary做fuzzing,但是結果還是一樣: ![](https://i.imgur.com/uMTn1iR.png) ## afl-showmap 看來上面的方法不行之後,就後續再查了一陣子,看看可以怎麼解 後來發現用`afl-showmap`這個指令可以看細節,看看到底qemu在虛擬mips架構的busybox的時候,發生了什麼事情,再一個一個來解決 指令:`afl-showmap -m none -o dev/null -Q bin/busybox` ![](https://i.imgur.com/fI0BiFK.png) 他這邊說/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在虛擬的時候用到的東西有關,可以再研究一下~~