本文博客地址: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. 记录mysql查询数据遇到的一个小问题

    今天在测试的时候,需要使用mysql对插入的数据进行检验,但是写完查询语句的时候执行会报错.原因很简单,这个表名是order(订单),在MySQL语言中order是用来排序的关键字,原则上讲是不能作为 ...

  2. css标题文字和下划线重叠

    <view class="text"> <text class="textCon">标题</text> <text c ...

  3. JQGrid 应用

    jqGrid 原理 jqGrid是典型的B/S架构,服务器端只是提供数据管理,客户端只提供数据显示.换句话说,jqGrid可以以一种更加简单的方式来展现你数据库的信息,而且也可以把客户端数据传回给服务 ...

  4. [个人总结]pytorch中model.eval()会对哪些函数有影响?

    来源于知乎:pytorch中model.eval()会对哪些函数有影响? - 蔺笑天的回答 - 知乎 https://www.zhihu.com/question/363144860/answer/9 ...

  5. C# 应用 - 多线程 7) 处理同步数据之 Synchronized code regions (同步代码区域): Monitor 和 lock

    目录: System.Threading.Monitor:提供同步访问对象的机制; lock 是语法糖,是对 Monitor Enter 和 Exit 方法的一个封装 lock 案例 1. Monit ...

  6. PTE 准备之 Personal introduction

    Task strategies Be prepared! This is your opportunity to give the admissions officers a first impres ...

  7. HDU_6695 Welcome Party 【思维】

    一.题目 Welcome Party 二.分析 最开始的时候分析错了,认为只要找两个类型中的最小差值就可以了,忽略了是求两个类型中最大值的最小差值. 那么可以对第一个类型进行从大到小排序,枚举这个类型 ...

  8. go中sync.Mutex源码解读

    互斥锁 前言 什么是sync.Mutex 分析下源码 Lock 位运算 Unlock 总结 参考 互斥锁 前言 本次的代码是基于go version go1.13.15 darwin/amd64 什么 ...

  9. mysql 单机多实例重启数据库服务

    1.# cat db.txtbackend 3310base 3320storage 3330payment 3340promotion 3350 2.# cat restart_mysql_slav ...

  10. Linux内核模块驱动加载与dmesg调试

    因为近期用到了Linux内核的相关知识,下面随笔将给出内核模块的编写记录,供大家参考. 1.运行环境 Ubuntu 版本:20.04 Linux内核版本:5.4.0-42-generic gcc版本: ...