qemu环境搭建

qemu环境搭建

VMware的安装

固件分析利器binwalk

Kali下自带的binwalk并不是具备完整功能的binwalk,从github上获得binwalk以后,按照INSTALL.md里的说明安装就好,最后执行 sudo python setup.py install。最好安装所有的binwalk依赖项,这样binwalk在解包固件的时候,才能辨别固件的文件格式。

首先,确保更新源(/etc/apt/sources.list)没有问题,如果无法update,多更换一下源:

1
2
sudo apt-get update
sudo apt-get install build-essential autoconf git

Debian/Ubuntu用户一键安装所有依赖:

1
2
$ sudo ./deps.sh
python setup.py install

这样binwalk的安装就完成了。安装过程中哪个安装包出现问题,去github上git clone对应安装包,安装INSTALL.md或者README.md安装好即可。

安装qemu

1
2
git clone git://git.qemu-project.org/qemu.git
git submodule update --init dtc

由于相关的submodule pixman没有了,所以去github上下载后,按照INSTALL里的说明安装即可。

1
2
git clone https://github.com/servo/pixman.git
./configure && make && make install

以上都安装成功以后,进行相关依赖文件的安装:

1
2
3
sudo apt-get install libglib2.0 libglib2.0-dev
sudo apt-get install autoconf automake libtool
sudo ./configure --static &&sudo make &&sudo make install

即可安装成功。

交叉编译环境Buildroot

使用Buildroot搭建交叉编译环境,安装会有一个多小时,且每一次只能搭建一种交叉编译环境。比如一开始需要的是mips小端序的编译环境,如果后来需要mips大端序的编译环境,需要clean掉原环境,安装新环境。命令如下:

1
2
3
4
5
6
7
wget http://buildroot.uclibc.org/downloads/snapshots/buildroot-snapshot.tar.bz2
tar -jxvf buildroot-snapshot.tar.bz2
cd buildroot
sudo apt-get install libncurses5-dev patch
make clean
make menuconfig #对要生成的编译环境进行配置,注意将"Kernel Headers"改成机器环境的Kernel版本或者低于机器环境的Kernel版本。
sudo make #开始漫长的等待

漫长的等待以后,在output目录下会生成所有的文件,在

1
/output/host/usr/bin

目录下能找到编译成功的编译器mips-linux-gcc(以编译mips大端序环境为例)

qemu user-mode下运行文件

静态文件

生成

1
mips-linux-gcc -c test.c -o test -static

运行

1
2
cp $(which qemu-mips) ./
./qemu-mips test

依赖动态库的文件

生成

1
mips-linux-gcc -c test.c -o test

运行

1
2
cp $(which qemu-mips) ./
sudo chroot . ./qemu-mips test #注意:当前目录应该是拥有相关嵌入式系统文件的根目录,因为依赖动态库文件的运行会根据当前系统环境变量去寻找依赖的动态库加载程序

解释一下$(which qemu-mips)是qemu安装好以后,相关bin文件的默认目录,可以看看其所在路径:

1
echo $(which qemu-mips) #/usr/local/bin/qemu-mips

qemu system-mode

这种模式下,就和VMware安装一个操作系统感觉一样,会运行一个独立的操作系统。首先我们下载mips虚拟机,访问http://people.debian.org/~aurel32/qemu/,选择内核文件vmlinux-2.6.32-5-4kc-malta和磁盘镜像debian_squeeze_mips_standard.qcow2

1
$ sudo qemu-system-mips -kernel vmlinux-3.2.0-4-4kc-malta -hda debian_wheezy_mips_standard.qcow2 -append "root=/dev/sda1 console=ttyS0" -nographic

即可启动mips虚拟机。用户名:root,密码:root。启动之前需要配置mips系统网络,qemu-system-mips命令和上面那个不同,具体的可以网上百度和参考资料。

需要mips虚拟机启动的文件,需要通过scp命令上传到mips虚拟机上执行,或者在mips虚拟机上下载。

简单测试

以D-link的固件为例,《揭秘家用路由器0day漏洞挖掘技术》一书资源在http:/www.boardview.com.cn/26392注册了即可下载。

下载固件

google搜索:

1
inurl:dlink + (firmware or download) + (ftp or ftp2)

能搜到dlink官网,能在官网下载固件,也可以从ftp服务上下载。

ftp://ftp2.dlink.com/PRODUCTS/DIR-605L/REVA/DIR-605L_FIRMWARE_1.13.ZIP为例。

解包固件

1
2
3
4
unzip DIR-605L_FIRMWARE_1.13.ZIP
binwalk -e dir605L_FW_113.bin
cd _dir605L_FW_113.bin.extracted/
cd squashfs-root-0/

就来到了固件的系统根目录,ls一下能看到熟悉的根目录下的相关内容。

嵌入式系统的系统命令均指向BusyBox的符号链接,BusyBox是一个经过裁剪的Shell。

1
file ./bin/busybox

可以看到解开固件的系统架构,以我的为例,是:
./bin/busybox: ELF 32-bit MSB executable, MIPS, MIPS-I version 1 (SYSV), dynamically linked (uses shared libs), corrupted section header size

1
2
cp $(which qemu-mips) ./
sudo chroot . ./qemu-mips ./bin/ls #示例

即可运行相关程序(不包括依赖硬件的程序)

运行web服务

在固件解包目录/bin/boa是启动80端口的web服务,根据每次运行时core dump,使用LD_PRELOAD环境变量hook相关函数的方式启动boa程序,这个示例是揭秘0day安全漏洞一书上的示例,故更详细的说明可以看此书。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#include<stdio.h>
#include<stdlib.h>
#define MIB_IP_ADDR 170
#define MIB_HW_VER 0x250
#define MIB_CAPTCHA 0x2C1
int apmib_init(void)
{
return 1;
}
int fork(void)
{
return 0;
}
void apmib_get(int code,int *value)
{
switch(code)
{
case MIB_HW_VER:
*value = 0xF1;
break;
case MIB_IP_ADDR:
*value = 0x7F000001;
break;
case MIB_CAPTCHA:
*value = 1;
break;
}
return ;
}
1
2
./mips-linux-gcc -fPIC -shared apmib.c -o apmib-ld.so -ldl
sudo chroot . ./qemu-mips -E LD_PRELOAD="./apmib-ld.so" ./bin/boa

运行以后

1
ps aux | grep 80

可以看到80端口服务已经开启,但是直连没有相应,问题还在进一步处理之中。

远程动态调试

1
sudo chroot . ./qemu-mips -E LD_PRELOAD="./apmib-ld.so" -g [port] ./bin/boa

ida 选择remote gdb debugger,debug options里和远程调试x86 x64linux文件一样的设置方法,确定以后,开始调试即可。

目前遇到的困难

80端口无响应

正尝试从system-mode下运行,以及分析程序代码。

部分固件无法解开

无法解开可能是文件格式或者其他方面(加密等)的原因

参考资料:《揭秘家用路由器0day漏洞挖掘技术》