zoukankan      html  css  js  c++  java
  • 路由器逆向分析------Running Debian MIPS Linux in QEMU

    本文博客地址: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
    "
      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

  • 相关阅读:
    html单引号,双引号转义
    把文章里边的html标签去掉(去掉文字的样式,显示css设置的样式)
    java缓存适合使用的情况
    Java内存缓存
    springmvc怎么重定向,从一个controller跳到另一个controller
    jquery 获取标签名(tagName)
    jQuery判断checkbox是否选中的3种方法
    判断一组checkbox中是否有被选中的
    在O(N)时间内求解 正数数组中 两个数相加的 最大值
    两种方法求解 正数数组中 两个数相减 的最大值
  • 原文地址:https://www.cnblogs.com/csnd/p/11800619.html
Copyright © 2011-2022 走看看