本文博客地址:http://blog.csdn.net/qq1084283172/article/details/70176583

下面的文章内容主要参考英文博客《Running Debian MIPS Linux in QEMU》,这篇博客发表的时间比较早,主要是讲述如何在QEMU虚拟机上运行Debian MIPS Linux系统;尽管很多的步骤已经过时了,但是还是比较有参考意义的。这里不会对原文进行生搬硬套的翻译,而是根据对原文的理解进行一次操作的实践和验证。

01.原文中在Ubuntu Linux主机上运行QEMU虚拟机,然后在QEMU虚拟机上启动运行Debian MIPS系统的一些步骤如下

提示:本文在 Ubuntu 14.04虚拟机 环境下进行实践和操作。

02.QEMU源码的下载和编译

从QEMU官方网址:http://wiki.qemu.org/Download,下载QEMU 1.50版本的源码;不推荐使用git下载源码,推荐直接到官网下载源码。QEMU源码在编译时,需要使用静态的方式进行编译,因为在运行固件文件系统里的MIPS程序时需要用使用
chroot 切换工作的目录,动态编译生成的QEMU不方便使用。在进行QEMU源码编译之前还需要修改源码文件,path掉QEMU的一个bug。

从QEMU官方源码下载地址:http://download.qemu-project.org/下载QEMU 1.5版本的源码,如下图所示:

执行下面命令,进行QEMU 1.5.0源码的下载:

# 下载QEMU 1.5.0的源码
$ wget http://download.qemu-project.org/qemu-1.5.0.tar.xz
$ tar xvJf qemu-1.5.0.tar.xz
$ ls -l
$ cd ./qemu-1.5.0

安装编译QEMU 1.5.0源码需要的依赖库文件。

# 安装需要的依赖库文件
$ sudo apt-get install autoconf automake libtool zlib1g-dev libglib2.0-dev

QEMU 1.5.0源码中的Makefile文件 需要进行修改,具体如下:

打开QEMU 1.5.0的源码根目录下 Makefile 文件,找到下面这一行:

pixman/Makefile: $(SRC_PATH)/pixman/configure
(cd pixman; CFLAGS="$(CFLAGS) -fPIC $(extra_cflags) $(extra_ldflags)" $(SRC_PATH)/pixman/configure $(AUTOCONF_HOST) --disable-gtk --disable-shared --enable-static)

截图如下:

将这一行修改为如下所示,然后保存、关闭文件。

pixman/Makefile: $(SRC_PATH)/pixman/configure
(cd pixman; aclocal; CFLAGS="$(CFLAGS) -fPIC $(extra_cflags) $(extra_ldflags)" $(SRC_PATH)/pixman/configure $(AUTOCONF_HOST) --disable-gtk --disable-shared --enable-static)

截图如下:

关于QEMU 1.5.0的Makefile文件需要修改的解释说明:

需要修改QEMU 1.5.0源码中的 linux-user/elfload.c 文件,具体原因如下:

具体 linux-user/elfload.c 文件 的修改如下,然后保存、关闭文件。

提示:关于这个bug的修复,在前面的博客中已经有详细提到,并且在最新版本的QEMU源码中已经修复了这个bug。

经过上面的操作,QEMU 1.5.0源码的修改和path已经完成,执行下面的命令进行编译:

# 编译配置为静态编译
$ sudo ./configure --static
$ sudo make
# sudo make install #as root

提示:在进行QEMU 1.5.0版本的源码的编译时,一定要用ubuntu 14.04,千万不要使用ubuntu的衍生版本如:ubuntu mate、xubuntu等,否则会出现下面的错误,google了好久都没有找到好的解决办法:

编译的时候可以使用ubuntu 16.04版本,但是可能也会出现错误,错误的截图如下:

有关这个错误的解决办法,可以参考网址:https://lists.gnu.org/archive/html/qemu-devel/2013-10/msg02627.html。具体的解决办法就是在进行QEMU源码的编译配置之前执行 export
ARFLAGS="rv"
命令即可解决。因此在ubuntu 16.04的系统上编译QEMU 1.5.0源码使用下面的命令进行编译,不过还是不推荐在ubuntu 16.04的系统上进行本文的实践和操作。由于ubuntu 16.04的默认网络接口为 ens33 的问题,又得进行一些网络相关的修改,麻烦。

# 解决ubuntu 16.04系统上编译出错的问题
$ export ARFLAGS="rv" # 编译配置为静态编译
$ sudo ./configure --static
$ sudo make
# sudo make install #as root


03.下载 Debian QEMU 虚拟机镜像文件

Debian QEMU 虚拟机镜像文件的下载地址为:http://people.debian.org/~aurel32/qemu/,并且下载大端格式的Debian QEMU 虚拟机镜像文件到 ~/debian-qemu/be 目录下,下载小端格式的Debian QEMU 虚拟机镜像文件到 ~/debian-qemu/le
目录下。当然啦,关于Debian QEMU 虚拟机镜像文件的下载和使用也可以参考前面的博客《路由器逆向分析------QEMU的基本使用方法(MIPS)》中的详细介绍。

有关Debian QEMU 虚拟机镜像文件的下载和相关的要求说明如下:

04.设置网络桥接

为了让QEMU虚拟机能够与ubuntu 14.04主机的网络进行相连,还需要进行网络相关的配置。安装需要的依赖库文件,示例如下:

$ sudo apt-get install uml-utilities bridge-utils 

建立一个系统组用于将QEMU虚拟机连接到到主机ubuntu系统,然后将ubuntu主机当前用户添加到该系统组。

# 创建一个系统组
$ sudo groupadd -r tuntap # 添加当前用户到该系统组
$ sudo usermod -a -G tuntap androidcode

提示:上述命令中的 androidcode 为当前ubuntu系统的登陆用户名,每个人的都不一样,根据自己的ubuntu系统环境进行相应的修改。执行上述的命令操作之后,还需要 "Log Out "注销退出当前用户的登陆,然后再次使用该用户登陆进入ubuntu主机系统,使上面添加用户组的操作生效。

编辑ubuntu主机的网络接口配置文件 /etc/network/interfaces  的内容如下,然后保存、关闭。

# 打开、编译/etc/network/interfaces
$ sudo gedit /etc/network/interfaces

修改  /etc/network/interfaces 文件的内容如下:

# interfaces(5) file used by ifup(8) and ifdown(8)
auto lo
iface lo inet loopback auto eth0
iface eth0 inet dhcp #auto br0
iface br0 inet dhcp
pre-up tunctl -t tap0 -g tuntap
pre-up tunctl -t tap1 -g tuntap
pre-up ip link set tap0 up
pre-up ip link set tap1 up
bridge_ports eth0 tap0 tap1
bridge_stp off
bridge_maxwait 0
bridge_fd 0
post-down ip link set tap0 down
post-down ip link set tap1 down
post-down tunctl -d tap0
post-down tunctl -d tap1 iface eth1 inet dhcp

操作结果截图:



编写启用桥接网络的脚本文件 bridge.sh ,脚本命令如下,在后面的步骤会用到:

#!/bin/sh

# bridge.sh 脚本
sudo ifdown eth0
sudo ifup br0

编写启动QEMU MIPS虚拟机的脚本文件 debqemu.sh,脚本命令如下:

#!/bin/sh

quit()
{
ret=0
if [ $# -gt 0 ];
then
ret=$1
shift
fi
if [ $# -gt 0 ];
then
printf "$1\n"
shift
fi
exit $ret
} image=""
kernel=""
if [ "x$1" = "xle" ];
then
qemu=qemu-system-mipsel
image="/home/androidcode/RouterRe/debian-qemu/le/debian_squeeze_mipsel_standard.qcow2"
kernel="/home/androidcode/RouterRe/debian-qemu/le/vmlinux-2.6.32-5-4kc-malta"
iface=tap1
# reset /etc/udev/rules.d/70-persistent-net.rules in qemu guest if you change mac addrs
macaddr="52:54:00:12:34:11"
elif [ "x$1" = "xbe" ];
then
qemu=qemu-system-mips
image="/home/androidcode/RouterRe/debian-qemu/be/debian_squeeze_mips_standard.qcow2"
kernel="/home/androidcode/RouterRe/debian-qemu/be/vmlinux-2.6.32-5-4kc-malta"
iface=tap0
# reset /etc/udev/rules.d/70-persistent-net.rules in qemu guest if you change mac addrs
macaddr="52:54:00:12:34:00"
else
quit 1 "Specify le or be endianness."
fi echo "Stopping eth0, starting br0." ./bridge.sh || quit 1 "Failed to start br0." echo "Starting Debian system QEMU session." $qemu -net nic,macaddr=$macaddr -net tap,ifname=$iface,script=no,downscript=no -nographic -M malta -kernel $kernel -hda $image -append "root=/dev/sda1 console=tty0"

提示:debqemu.sh脚本中的一些参数变量的值需要根据自己的实际文件路径来进行修改,具体需要修改的地方如下图所示:



05.启动和配置QEMU虚拟机

为了能同时运行大端格式和小端格式的 QEMU MIPS 虚拟机,必须修改上面提到的 debqemu.sh脚本文件中的 macaddr 的 MAC地址的值并且确保两个MAC地址的值还不能一样,必须不同。使用下面的命令启动 QEMU MIPS 虚拟机,如下:

$ sudo chmod a+x ./bridge.sh
$ sudo chmod a+x ./debqemu.sh # 启动小端格式的QEMU MIPS虚拟机
$ sudo ./debqemu.sh le # 启动大端格式的QEMU MIPS虚拟机
$ sudo ./debqemu.sh be

提示:当QEMU MIPS 虚拟机启动成功,需要登录进去,登录的用户名是root,登录的用户名密码也是root 。 

操作结果截图:

获取QEMU MIPS虚拟机的网络接口,示例如下。

root@debian-mipsel:~# ifconfig -a

从结果可以看出来,QEMU MIPS虚拟机的网络接口没有分配IP地址。

注意:实践了好几遍,最终都是这个结果,QEMU MIPS的网络配置都是失败得不到期望的结果。那就只说明了一个问题,原文中这些操作步骤已经失效了。

对于系统模式启动运行QEMU MIPS虚拟机的时候,设置了 macaddr 参数导致QEMU MIPS虚拟机的网络接口没有被分配IP地址的问题,可以通过下面的方法进行解决。具体的就是 删除掉 QEMU MIPS 虚拟机的 /etc/udev/rules.d/70-persistent-net.rules文件中的原有的网络接口的信息,然后重启QEMU MIPS虚拟机让其自动生成和分配网络接口的信息。当然了解决这个问题也可以使用《揭秘家用路由器0day漏洞挖掘技术》
69 页 提供的方法,在前面的博客中有提到。

如果上面的网络配置操作一切顺利,则QEMU MIPS虚拟机就可以和ubuntu主机进行网络通信,并且在ubuntu主机上通过 ssh能够访问和登陆QEMU MIPS虚拟机。在ubuntu主机上为了通过 ssh 访问QEMU MIPS虚拟机方便,可以使用 ssh-copy-id  将ssh的key放在远程的QEMU MIPS虚拟机上。在Linux系统上安装OpenSSH的命令如下:

$ apt-get update
$ apt-get install openssh-server

提示:为ubuntu主机系统设置 NFS(网络文件共享) ,这样QEMU MIPS虚拟机就可以ubuntu共享文件了,需要运行的固件文件系统中的MIPS程序就不用拷贝到QEMU MIPS虚拟机中了,在QEMU MIPS虚拟机中 mount 一下既可以访问和使用ubuntu主机上的固件文件系统中的MIPS程序。

原文中关于如何关闭QEMU MIPS虚拟机的方法,如下:

06.实践总结

英文原文的这篇博客篇幅不长,但是上面提到的信息量很大,需要自己仔细琢磨和查询别的资料才能搞明白。即使读懂了,一步步去实践也不一定能得到博客中提到的结果,我也是按照作者的步骤一步步的操作和实践了很多次,但是都没能达到预期的效果,主要是对Linux的网络配置这一块不是很熟悉。当然了,虽然按照本文中的方法不能实践成功,但是按照最新的代码和最新资料还是可以将原作者的实验思路给实践成功的,后面再写。

参考网址:http://shadow-file.blogspot.hk/2013/05/running-debian-mips-linux-in-qemu.html

路由器逆向分析------Running Debian MIPS Linux in QEMU的更多相关文章

  1. 路由器逆向分析------在QEMU MIPS虚拟机上运行MIPS程序(ssh方式)

    本文博客地址:http://blog.csdn.net/qq1084283172/article/details/69652258 在QEMU MIPS虚拟机上运行MIPS程序--SSH方式 有关在u ...

  2. 路由器逆向分析------MIPS系统网络的配置(QEMU)

    本文博客地址:http://blog.csdn.net/qq1084283172/article/details/69378333 MIPS系统网络的配置  使用QEMU 模拟正在运行的MIPS系统并 ...

  3. 路由器逆向分析------QEMU的下载和安装(Linux平台)

    本文博客地址:http://blog.csdn.net/qq1084283172/article/details/68953160 一.QEMU源码的下载和编译 QEMU源码的github下载地址:h ...

  4. 路由器逆向分析------QEMU的基本使用方法(MIPS)

    本文博客地址:http://blog.csdn.net/qq1084283172/article/details/69258334 一.QEMU的运行模式 直接摘抄自己<揭秘家用路由器0day漏 ...

  5. 路由器逆向分析------在Linux上安装IDA Pro

    本文博客地址:http://blog.csdn.net/qq1084283172/article/details/69665905 01.在Linux系统上安装Linux版本的IDA Pro Linu ...

  6. 路由器逆向分析------MIPS交叉编译环境的搭建(Buildroot)

    本文博客地址:http://blog.csdn.net/qq1084283172/article/details/68950682 为了能在我们熟悉的windows或者ubuntu下开发mips架构的 ...

  7. 路由器逆向分析------binwalk工具的安装

    本文博客链接:http://blog.csdn.net/qq1084283172/article/details/65441110 一.binwalk工具运行支持的平台 binwalk工具安装支持的平 ...

  8. 路由器逆向分析------sasquatch和squashfs-tools工具的安装和使用

    本文博客地址:http://blog.csdn.net/qq1084283172/article/details/68942660 一.sasquatch工具的安装和使用 sasquatch工具支持对 ...

  9. 路由器逆向分析------firmware-mod-kit工具安装和使用说明

    本文博客地址:http://blog.csdn.net/qq1084283172/article/details/68061957 一.firmware-mod-kit工具的安装 firmware-m ...

随机推荐

  1. 微信小程序弹出框滚动穿透问题

    1.在你的遮罩层最外层加 catchtouchmove="noneEnoughPeople" 里面是你的方法名2.noneEnoughPeople: function () { c ...

  2. C#后端接收前端的各种类型数据

    前端往后端提交数据的方式常用的就这么三种:1.form提交:2.url参数提交:3.json提交 1.针对表单form方式的提交 在后端使用Request.Form的方式接收,比如 前端代码片段: v ...

  3. Hi3559AV100 NNIE RFCN开发:V4L2->VDEC->VPSS->NNIE->VGS->VO系统整体动态调试实现

    下面随笔将给出Hi3559AV100 NNIE RFCN开发:V4L2->VDEC->VPSS->NNIE->VGS->VO系统整体动态调试实现,最终的效果是:USB摄像 ...

  4. 漏洞复现-ActiveMq反序列化漏洞(CVE-2015-5254)

          0x00 实验环境 攻击机:Win 10 靶机也可作为攻击机:Ubuntu18 (docker搭建的vulhub靶场) 0x01 影响版本 Apache ActiveMQ 5.13.0之前 ...

  5. 使用zap接收gin框架默认的日志并配置日志归档

    目录 使用zap接收gin框架默认的日志并配置日志归档 gin默认的中间件 基于zap的中间件 在gin项目中使用zap 使用zap接收gin框架默认的日志并配置日志归档 本文介绍了在基于gin框架开 ...

  6. gulp打包详解

    gulp的作用 删除文件中冗余的内容,压缩文件,减小文件体积 实际项目中运行的都是压缩完成以后的文件 减小加载响应时间 gulp打包压缩对象 html,css,js,sass,webserver 音频 ...

  7. HTML5中window.postMessage,在两个页面之间的数据传递

    HTML5中window.postMessage,在两个页面之间的数据传递 2015年11月3日 8536次浏览 关于postMessage window.postMessage虽然说是html5的功 ...

  8. java重写toString()方法

    toString()方法是Object类的方法,调用toString()会返回对象的描述信息. 1)为什么重写toString()方法呢? 如果不重写,直接调用Object类的toString()方法 ...

  9. 保姆级教程!使用k3d实现K3s高可用!

    你是否曾经想尝试使用K3s的高可用模式?但是苦于没有3个"备用节点",或者没有设置相同数量的虚拟机所需的时间?那么k3d这个方案也许你十分需要噢! 如果你对k3d尚不了解,它的名字 ...

  10. Python的多进程和多线程

    进程和线程 进程是系统进行资源分配的最小单位,线程是系统进行调度执行的最小单位: 一个应用程序至少包含一个进程,一个进程至少包含一个线程: 每个进程在执行过程中拥有独立的内存空间,而一个进程中的线程之 ...