QEMU System环境

14 篇文章 3 订阅


文档:https://www.qemu.org/docs/master/

Wiki: https://wiki.qemu.org/Main_Page

Qemu Mips文档:https://www.qemu.org/docs/master/system/target-mips.html

1. 安装

本文以mips小端版本为例:

sudo apt install qemu-system-mipsel -y

然后下载mips的内核和镜像:

内核文件 vmlinux-2.6.32-5-4kc-malta
磁盘镜像 debian_squeeze_mips_standard.qcow2 

有两个地址:

  • https://people.debian.org/~aurel32/qemu/mips/, 开发人员使用;
  • http://ftp.debian.org/debian/dists/stable/main/installer-mipsel/current/images/malta/netboot/, debian的ftp,有临时根文件系统initd, 但没有提供磁盘镜像。

从第一个开发网站上下载即可, 下载页面还提供了启动qemu的指令。

启动虚拟机:

sudo qemu-system-mips -M malta -kernel vmlinux-2.6.32-5-4kc-malta -hda debian_squeeze_mips_standard.qcow2 -append "root=/dev/sda1 console=tty0"
sudo qemu-system-mips -M malta -kernel vmlinux-3.2.0-4-4kc-malta -hda debian_wheezy_mips_standard.qcow2 -append "root=/dev/sda1 console=tty0"
sudo qemu-system-mips64 -M malta -kernel vmlinux-2.6.32-5-5kc-malta -hda debian_squeeze_mips_standard.qcow2 -append "root=/dev/sda1 console=tty0"
sudo qemu-system-mips64 -M malta -kernel vmlinux-3.2.0-4-5kc-malta -hda debian_wheezy_mips_standard.qcow2 -append "root=/dev/sda1 console=tty0"

登录root/root

2. 网络配置

宿主机安装网络依赖:

sudo apt-get install bridge-utils 
sudo apt-get install uml-utilities	# 提供tunctl工具

有一种修改/etc/network/interfaces的方法,容易失败,推荐brctl的方法。

# 创建网桥
sudo brctl addbr br0
sudo ifconfig br0 192.168.122.1/24 up

# 创建tap接口,名字为tap0,并添加到网桥
sudo tunctl -t tap0
sudo ifconfig tap0 192.168.122.11/24 up
sudo brctl addif br0 tap0

启动虚拟机:

sudo qemu-system-mips -M malta -kernel vmlinux-2.6.32-5-4kc-malta -hda debian_squeeze_mips_standard.qcow2 -append "root=/dev/sda1 console=tty0" -nographic  -netdev tap,id=tapnet,ifname=tap0,script=no -device rtl8139,netdev=tapnet

# 输入root/root进入虚拟机,设置ip:
ifconfig eth0 192.168.122.12/24 up

网络通了之后,就可以把文件拷进去了:

$ scp -r squashfs-root/ root@192.168.122.12:/root/

关于tap网卡

普通的网卡一端连接物理链路,一端连接内核协议栈。当数据通过物理链路进来后,到达内核协议栈做进一步的处理:

  • 对于一些错误的数据包,协议栈可以选择丢弃;
  • 对于不属于本机的数据包,协议栈可以选择转发;
  • 对于属于本机的数据,协议栈就会通过Socket API告知上层正在等待的应用程序。

普通的物理网卡是通过物理链路来收发数据,而tun/tap 是通过/dev/net/tun来收发数据,一端连着/dev/net/tun,一端连着协议栈。

tap网卡主要是两部分组成:

  • 字符设备驱动:把数据写入/dev/net/tun,然后通知用户进程从/dev/net/tun里面拿数据实现数据交互
  • 虚拟网卡驱动:负责和网络协议栈的数据打交道

3. 其它使用方法

退出:ctrl+a, x。 不过配好网卡之后退出,居然就没法再启动了,后来参考firmadyne是因为没有删除网卡。所以后面直接用firmadyne的run.sh改了一下:

#!/bin/bash

set -u

ARCHEND=mipseb
IID=1

# if [ -e ./firmadyne.config ]; then
#     source ./firmadyne.config
# elif [ -e ../firmadyne.config ]; then
#     source ../firmadyne.config
# elif [ -e ../../firmadyne.config ]; then
#     source ../../firmadyne.config
# else
#     echo "Error: Could not find 'firmadyne.config'!"
#     exit 1
# fi

# IMAGE=`get_fs ${IID}`
IMAGE="debian_wheezy_mips_standard.qcow2"
# KERNEL=`get_kernel ${ARCHEND}`
KERNEL="vmlinux-3.2.0-4-4kc-malta"
# QEMU=`get_qemu ${ARCHEND}`
QEMU=qemu-system-mips
# QEMU_MACHINE=`get_qemu_machine ${ARCHEND}`
QEMU_MACHINE=malta
# QEMU_ROOTFS=`get_qemu_disk ${ARCHEND}`
# armel)
#         echo "/dev/vda1"
#         ;;
#     mipseb)
#         echo "/dev/sda1"
#         ;;
#     mipsel)
#         echo "/dev/sda1"
#         ;;
QEMU_ROOTFS="/dev/sda1"
# WORK_DIR=`get_scratch ${IID}`
WORK_DIR="./"

TAPDEV_0=tap${IID}_0
HOSTNETDEV_0=${TAPDEV_0}
echo "Creating TAP device ${TAPDEV_0}..."
sudo tunctl -t ${TAPDEV_0} -u ${USER}


echo "Bringing up TAP device..."
sudo ip link set ${HOSTNETDEV_0} up
sudo ip addr add 192.168.0.100/24 dev ${HOSTNETDEV_0}

echo "Adding route to 192.168.0.99..."
sudo ip route add 192.168.0.99 via 192.168.0.99 dev ${HOSTNETDEV_0}


function cleanup {
    pkill -P $$
    
    echo "Deleting route..."
    sudo ip route flush dev ${HOSTNETDEV_0}

    echo "Bringing down TAP device..."
    sudo ip link set ${TAPDEV_0} down


    echo "Deleting TAP device ${TAPDEV_0}..."
    sudo tunctl -d ${TAPDEV_0}

}

trap cleanup EXIT

echo "Starting firmware emulation... use Ctrl-a + x to exit"
sleep 1s

sudo ${QEMU} -m 256 -M malta \
    -kernel ${KERNEL} \
    -hda ${IMAGE} \
    -append "root=/dev/sda1 console=tty0" \
    -nographic \
    # -netdev tap,id=net0,ifname=${TAPDEV_0},script=no \
    # -device e1000,netdev=net0
    -net nic -net tap,ifname=${TAPDEV_0},script=no

# ${QEMU} -m 256 \
#     -M ${QEMU_MACHINE} \
#     -kernel ./${KERNEL} \
#     # -hda ${IMAGE} \
#     -drive if=ide,format=raw,file=${IMAGE}
#     # -append "root=${QEMU_ROOTFS} console=ttyS0" \
#     -append "root=${QEMU_ROOTFS} console=ttyS0 nandsim.parts=64,64,64,64,64,64,64,64,64,64 rw debug ignore_loglevel print-fatal-signals=1 user_debug=31 firmadyne.syscall=0"
#     -nographic \
#     -netdev tap,id=net0,ifname=${TAPDEV_0},script=no \
#     -device e1000,netdev=net0 \
#     -netdev socket,id=net1,listen=:2001 \
#     -device e1000,netdev=net1 \
#     -netdev socket,id=net2,listen=:2002 \
#     -device e1000,netdev=net2 \
#     -netdev socket,id=net3,listen=:2003 \
#     -device e1000,netdev=net3 | tee ${WORK_DIR}/qemu.final.serial.log

进入qemu后,登录root/root,执行以下命令修改ip,顺利的话就能与其它机器ping通了:

ifconfig eth0 192.168.0.99/24

注意:

  • -nographic可能导致启动时不显示console;
  • VirtualBox导致qemu的ip固定为10.0.2.15(nat)。

4. 参考资料

mips-pwn环境搭建 | e3pem’s Blog

从一道mips题目学习搭建mips环境及ROP - 云+社区 - 腾讯云 (tencent.com)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值