---
# System prepended metadata

title: AFL QEMU_MODE(一)
tags: [afl]

---

###### 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在虛擬的時候用到的東西有關，可以再研究一下~~