本文博客地址: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. c++指针数组与二维数组的最大区别

    下面随笔是关于指针数组说明及与二维数组的最大区别. 指针数组 数组的元素是指针型 例 利用指针数组存放矩阵 1 #include 2 using namespace std; 3 int main() ...

  2. 剑指 Offer 22. 链表中倒数第k个节点

    剑指 Offer 22. 链表中倒数第k个节点 Offer 22 常规解法 常规解法其实很容易可以想到,只需要先求出链表的长度,然后再次遍历取指定长度的链接即可. package com.walega ...

  3. 漫漫Java路1—基础知识—初涉java

    前言 主学信息安全,在编程的路上还是一个孩子,还在一步一步探索,有些东西可能是站在自己的位置思考的,很可能会出现一些啼笑皆非的错误,如果有误,还希望各位斧正. Java安装 jdk的安装 甲骨文官网选 ...

  4. Maven基础&&Spring框架阶段常用工具类整理

    常用工具类 1.密码加密工具类: package com.itheima.utils; import java.security.MessageDigest; import sun.misc.BASE ...

  5. 局部莫兰指数的计算(运用ArcMap)

    做任务时需要运用到局部莫兰指数,卡在用Python计算的思路上好久,最后发现可以用ArcGIS进行处理,步骤简单易懂. 主要步骤为: 1.读入数据(一定要为shp文件),对于用ecognition直接 ...

  6. 非对称加密--密钥交换算法DHCoder

    /*  * 密钥交换算法,即非对称加密算法  * */ public class DHCoder {         //非对称加密算法         public static final Str ...

  7. PTA 两个有序链表序列的合并

    6-5 两个有序链表序列的合并 (15 分)   本题要求实现一个函数,将两个链表表示的递增整数序列合并为一个非递减的整数序列. 函数接口定义: List Merge( List L1, List L ...

  8. OpenCV图像处理中“找圆技术”的使用

    一.为什么"找圆"     圆是基本图形的一种,更为重要的是,自然情况下采集的图像,很少大量存在"圆":但凡存在的,大都是人工的,那么就必然代表特定的意义,从而 ...

  9. 仅仅使用Google就完成了人生第一次破解

    2021年2月6日21:17:09 begin 起因 在异乡的打工人,不善言谈,幸有一老同学,周末常邀吃饭,感恩之心铭记于心.她结婚时,为表心意欲做视频,视频需要制作字幕,搜索之,偶遇一字幕软件,但是 ...

  10. filesort排序原理

    在执行计划中,可能经常看到有Extra列有filesort,这就是使用了文件排序,这当然是不好的,应该优化,但是,了解一下他排序的原理也许很有帮助,下面看一下filesort的过程: 1.根据表的索引 ...