首页
社区
课程
招聘
[原创]IoT安全:调试环境搭建教程(AArch64篇)
2018-7-4 13:54 21202

[原创]IoT安全:调试环境搭建教程(AArch64篇)

2018-7-4 13:54
21202

0x001 前言


    IoT设备固件的调试环境搭建坑比较多,发现网上还没有比较完善的各架构的调试环境的入门贴,于是就有了这篇文章,希望能方便到刚上手的新人吧。本文只是该教程的第一篇,因篇章过长不得不分开,整个教程会包含ARM、MIPS、x86、x64等等qemu调试环境的搭建。


0x002  AArch64


主机:Ubuntu 16.04 LST(可以是VM里跑的虚拟系统,也可以用真实机器)

虚拟机版本: qemu 2.8.0

Linux内核版本:4.10

BusyBox版本:1.24.2

交叉编译工具链:gcc-linaro-aarch64-linux-gnu-4.9-2014.07_linux

gdb版本:7.11.1

根文件系统:aarch64_rootfs.tar


以上工具已经打包好,下载地址如下

链接:https://pan.baidu.com/s/1MVZhhTlhrNQH9KkvqFLSMw 密码:bzmx


先安装这些包

$ sudo apt-get install libcap-dev
$ sudo apt-get install libpixman-1-dev
$ apt-get install libncurses5-dev
$ sudo apt-get install libasound2-dev libasound2
$ sudo apt-get install libglib2.0-dev
$ sudo apt install u-boot-tools

编译qemu
$ tar -xf qemu-2.8.0.tar.xz
$ cd qemu-2.8.0
$ mkdir build
$ cd build
$ ../configure --target-list=arm-softmmu,aarch64-softmmu,mips-softmmu,mipsel-softmmu,i386-softmmu,x86_64-softmmu,arm-linux-user,aarch64-linux-user,i386-linux-user,x86_64-linux-user,mips-linux-user,mipsel-linux-user --audio-drv-list=alsa --enable-virtfs
$ make -j8
$ sudo make install

配置linux内核选项
$ tar -xf linux-4.10.tar.xz

$ cross_compile=/root/toolchain/gcc/gcc-linaro-aarch64-linux-gnu-4.9-2014.07_linux/bin/aarch64-linux-gnu-
$ make CROSS_COMPILE=$cross_compile ARCH=arm64 O=./out_aarch64 defconfig
$ sudo gedit .config

# CONFIG 9P
CONFIG_NET_9P=y
CONFIG_NET_9P_VIRTIO=y
CONFIG_NET_9P_DEBUG=y
CONFIG_9P_FS=y
CONFIG_9P_FS_POSIX_ACL=y
CONFIG_PCI=y
CONFIG_VIRTIO_PCI=y

# CONFIG PCI and virtio
CONFIG_PCI=y
CONFIG_VIRTIO_PCI=y
CONFIG_PCI_HOST_GENERIC=y

$ make CROSS_COMPILE=$cross_compile ARCH=arm64 O=./out_aarch64 menuconfig

General setup  --->
    [*] Initial RAM filesystem and RAM disk (initramfs/initrd) support

Device Drivers  --->
    [*] Block devices  --->
        <*>   RAM block device support
        (65536) Default RAM disk size (kbytes)




编译
$ make CROSS_COMPILE=$cross_compile ARCH=arm64 O=./out_aarch64 Image -j4

制作根文件系统
$ tar -xjvf busybox-1.24.2.tar.bz2

$ make menuconfig

Build Options  --->
    [*] Build BusyBox as a static binary (no shared libs)
    (/root/toolchain/gcc/gcc-linaro-aarch64-linux-gnu-4.9-2014.07_linux/bin/aarch64-linux-gnu-)Cross Compiler prefix

$ make && make install


修改根文件系统,添加开机自启动挂载共享文件
$ sudo gedit ./etc/init.d/rcS

mkdir /nfsroot
mount -t 9p -o trans=virtio,version=9p2000.L hostshare /nfsroot
因为采用9p的方式挂载共享文件,必须在编译内核和qemu时添加9p支持

制作启动用的ramdisk,注意修改交叉编译链的路径
$ tar -xzvf aarch64_ramdisk_rootfs.tar.gz

# mk_ramdisk.sh
#!/bin/bash
sudo rm -rf rootfs
sudo rm -rf tmpfs
sudo rm -rf ramdisk*
sudo mkdir rootfs
sudo cp ../busybox-1.24.2/_install/*  rootfs/ -raf
sudo mkdir -p rootfs/proc/
sudo mkdir -p rootfs/sys/
sudo mkdir -p rootfs/tmp/
sudo mkdir -p rootfs/root/
sudo mkdir -p rootfs/var/
sudo mkdir -p rootfs/mnt/
sudo cp etc rootfs/ -arf
sudo mkdir -p rootfs/lib
sudo cp -arf /root/toolchain/gcc/gcc-linaro-aarch64-linux-gnu-4.9-2014.07_linux/aarch64-linux-gnu/libc/lib/aarch64-linux-gnu/* rootfs/lib/
sudo rm rootfs/lib/*.a
sudo /root/toolchain/gcc/gcc-linaro-aarch64-linux-gnu-4.9-2014.07_linux/bin/aarch64-linux-gnu-strip rootfs/lib/*
sudo mkdir -p rootfs/dev/
sudo mknod rootfs/dev/tty1 c 4 1
sudo mknod rootfs/dev/tty2 c 4 2
sudo mknod rootfs/dev/tty3 c 4 3
sudo mknod rootfs/dev/tty4 c 4 4
sudo mknod rootfs/dev/console c 5 1
sudo mknod rootfs/dev/null c 1 3
sudo dd if=/dev/zero of=ramdisk bs=1M count=16
sudo mkfs.ext4 -F ramdisk
sudo mkdir -p tmpfs
sudo mount -t ext4 ramdisk ./tmpfs/  -o loop
sudo cp -raf rootfs/*  tmpfs/
sudo umount tmpfs
sudo gzip --best -c ramdisk > ramdisk.gz
sudo mkimage -n "ramdisk" -A arm -O linux -T ramdisk -C gzip -d ramdisk.gz ramdisk.img

主机安装网络配置工具

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

在主机中查看/dev/net/tun文件

$ ls -l /dev/net/tun
crw-rw-rw- 1 root root 10, 200 Feb 27 03:36 /dev/net/tun

修改主机/etc/network/interfaces文件

# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).

# The loopback network interface
auto lo
iface lo inet loopback

# The primary network interface
auto eth0

auto br0
iface br0 inet dhcp
   bridge_ports eth0

为了方便请参考该文章把ens33网卡名改成eth0

ubuntu修改ens33网卡名为eth0


添加/etc/qemu-ifup

#!/bin/sh
echo sudo tunctl -u $(id -un) -t $1
sudo tunctl -u $(id -un) -t $1

echo sudo ifconfig $1 0.0.0.0 promisc up
sudo ifconfig $1 0.0.0.0 promisc up

echo sudo brctl addif br0 $1
sudo brctl addif br0 $1

echo brctl show
brctl show

sudo ifconfig br0 192.168.1.156    # 这里需要查看Ubuntu dhcp方式分配的ip,并与该ip保持一致,否则qemu起来后主机会连不上外部网络

添加/etc/qemu-ifdown

#!/bin/sh
echo sudo brctl delif br0 $1
sudo brctl delif br0 $1

echo sudo tunctl -d $1
sudo tunctl -d $1
 
echo brctl show
brctl show

ifdown br0
ifup br0

添加可执行权限

$ chmod +x /etc/qemu-ifup
$ chmod +x /etc/qemu-ifdown

重启网卡

$ sudo /etc/init.d/networking restart

运行

# run.sh
sudo qemu-system-aarch64 \
    -M  virt \
    -cpu cortex-a53 \
    -smp 2 \
    -m 4096M \
    -kernel ./Image \
    -nographic \
    -append "root=/dev/ram0 rw rootfstype=ext4 console=ttyAMA0 init=/linuxrc ignore_loglevel" \
    -initrd ./ramdisk.img \
    -fsdev local,security_model=passthrough,id=fsdev0,path=/nfsroot \
    -device virtio-9p-pci,id=fs0,fsdev=fsdev0,mount_tag=hostshare \
    -net nic,vlan=0 -net tap,vlan=0,ifname=tap0 \
    -redir tcp:2333::2333


设置Vmware虚拟机网络



测试能双向ping通




qemu起来后,ip不一定能分配到,而且这是精简内核,没有interfaces这文件,可以通过这条命令设置一下ip

ifconfig eth0 192.168.1.20

编译gdb-7.11.1

$ CC="/root/toolchain/gcc/aarch64/bin/aarch64-linux-gnu-gcc" CXX="/root/toolchain/gcc/aarch64/bin/aarch64-linux-gnu-g++" ./configure --target=aarch64-linux-gnu --host="aarch64-linux-gnu" --prefix="/root/toolchain/gdb/gdb-7.11.1/gdb/gdbserver/out_aarch64"
$ make install

交叉编译测试例程

$ mkdir build && cd build
$ nano hello.c
#include <stdio.h>

int main()
{
    printf("hello\n");
    return 0;
}

$ ./arm-none-linux-gnueabi-gcc -g hello.c -o hello_aarch64 -static

编译好的gdbserver与测试例程拷贝到虚拟机共享文件,执行

$ ./gdbserver-aarch64 0.0.0.0:2333 ./hello_aarch64

gdbserver报错,原因是没有编译静态文件

-/bin/sh: ./gdbserver-aarch64: not found

修改gdbserver的Makefile,添加-static参数,再次编译



客户机执行

$ ./gdbserver-aarch64 0.0.0.0:2333 ./hello_aarch64

主机中执行
$ gdb-multiarch
gef➤ set architecture aarch64
The target architecture is assumed to be aarch64
gef➤ gef-remote -q 192.168.1.20:2333
gef工具的安装可以参考这篇

至此,AArch64调试环境已经搭建好了,不知不觉已经写了这么多。本来打算将AArch32也放一起的,看来只能放在下篇了。


[CTF入门培训]顶尖高校博士及硕士团队亲授《30小时教你玩转CTF》,视频+靶场+题目!助力进入CTF世界

收藏
点赞4
打赏
分享
打赏 + 5.00雪花
打赏次数 1 雪花 + 5.00
 
赞赏  junkboy   +5.00 2018/07/04
最新回复 (16)
雪    币: 11716
活跃值: (133)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
junkboy 2018-7-4 15:00
2
0
谢谢分享
雪    币: 123
活跃值: (405)
能力值: ( LV2,RANK:15 )
在线值:
发帖
回帖
粉丝
伤字号 2018-7-4 15:02
3
0
请教师傅   直接用IoT设备的固件提取出来的文件系统可以仿真吗?
也是这样需要打包成tar.gz吗?
雪    币: 265
活跃值: (72)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
m0nshaw 2018-7-4 15:22
4
0
可以的,需要指定根文件系统为从固件提取出来的squashfs文件系统
雪    币: 123
活跃值: (405)
能力值: ( LV2,RANK:15 )
在线值:
发帖
回帖
粉丝
伤字号 2018-7-4 16:21
5
0
wooyoung 可以的,需要指定根文件系统为从固件提取出来的squashfs文件系统
师傅 求私信指点  我本地试了很多方法  可能是中间哪里出了问题  导致最后一直跑不起来
雪    币: 123
活跃值: (405)
能力值: ( LV2,RANK:15 )
在线值:
发帖
回帖
粉丝
伤字号 2018-7-4 16:29
6
0
我本地用了两种思路,都是网上博客看来的,第一种:
1.qemu-img create new.img
2.挂载new.img并写入root目录文件系统
3.使用网上下载的linux mipseb内核运行  
指令如下:
qemu-system-mips -m 256 -M malta \
-kernel vmlinux.mipseb \
-drive if=ide,format=raw,file=./new.img \
-append "root=/dev/mapper/loop1p1 console=ttyS0 nandsim.parts=64,64,64,64,64,64,64,64,64,64 debug ignore_loglevel print-fatal-signals=1 user_debug=31" \
-net nic, -net tap \
-nographic
报错是:VFS: Unable to mount root fs on unknown-block(0,0)
第二种尝试了您的步骤:
1.创建ramdisk,
2.挂载并格式化文件系统,写入根目录,
3.打包成gz并使用mkimage生成img,使用网上下载的mipseb内核运行
执行指令如下:
qemu-system-mips -m 512 \
-append "root=/dev/ram0 rw rootfstype=ext2 console=tty0" \
-initrd ramdisk.img \
-net nic,vlan=0 -net tap \
-kernel ../qemu-test/vmlinux.mipseb \
-nographic
因为没看明白您的步骤里面-kernel ./Image文件是什么所以我就用之前下载的内核运行了,然后内存越界了。。。
最后于 2018-7-4 16:30 被伤字号编辑 ,原因: 修改执行的指令以便于阅读
雪    币: 265
活跃值: (72)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
m0nshaw 2018-7-4 17:00
7
0
伤字号 我本地用了两种思路,都是网上博客看来的,第一种:1.qemu-img&nbsp;create&nbsp;new.img2.挂载new.img并写入root目录文件系统3.使用网上下载的 ...
可以看这篇https://bbs.pediy.com/thread-229583.htm,直接下载编译好的内核镜像和根文件磁盘就好了。 -kernel ./Image这个是我编译的linux-4.10的内核。
最后于 2018-7-4 17:02 被m0nshaw编辑 ,原因:
雪    币: 123
活跃值: (405)
能力值: ( LV2,RANK:15 )
在线值:
发帖
回帖
粉丝
伤字号 2018-7-4 17:03
8
0
wooyoung 伤字号 我本地用了两种思路,都是网上博客看来的,第一种:1.qemu-img&amp;nbsp;create&amp;nbsp;new.img ...
然后直接往编译好的文件磁盘里面写入根文件系统就好了嘛?
雪    币: 265
活跃值: (72)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
m0nshaw 2018-7-4 17:08
9
0
伤字号 然后直接往编译好的文件磁盘里面写入根文件系统就好了嘛?
-kernel 是指定内核,-initrd是指定需要挂载的文件系统,只是打包不需要编译的。还有其他命令也能指定挂载文件,比如-sd、-hda
雪    币: 123
活跃值: (405)
能力值: ( LV2,RANK:15 )
在线值:
发帖
回帖
粉丝
伤字号 2018-7-5 10:33
10
0
师傅我好像没找到openwrt的镜像下载地址。。
后来我用debian的mips内核,-initrd指定路由器的固件文件系统,也不行
是我文件系统的格式不对还是啥,内核和文件系统不兼容?
师傅要不我把固件发给你你试试。。。
雪    币: 265
活跃值: (72)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
m0nshaw 2018-7-5 23:11
11
0
伤字号 师傅我好像没找到openwrt的镜像下载地址。。 后来我用debian的mips内核,-initrd指定路由器的固件文件系统,也不行 是我文件系统的格式不对还是啥,内核和文件系统不兼容? 师傅要 ...
在这里下https://archive.openwrt.org/snapshots/trunk/malta/generic/
雪    币: 123
活跃值: (405)
能力值: ( LV2,RANK:15 )
在线值:
发帖
回帖
粉丝
伤字号 2018-7-9 09:45
12
0
wooyoung 在这里下https://archive.openwrt.org/snapshots/trunk/malta/generic/
多谢师傅多谢师傅
雪    币: 416
活跃值: (152)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
蓝色淡风 2 2018-7-31 21:09
13
0
配置内核的时候出了这么个错:“make: *** No rule to make target 'defconfig'。 停止。在网上找了一波没找到解决方案,还请师傅指导一波
雪    币: 19
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
mb_woxtvirn 2019-8-26 14:24
14
0
make CROSS_COMPILE=$cross_compile ARCH=arm64 O=./out_aarch64 Image -j4
老师,执行这步的时候老是报错,提示、root/toolchain/gcc/gcc-linaro-aarch64-linux-gnu-4.9-2014.07_linux/bin/aarch64-linux-gnu-gcc: not found,我尝试把解压的文件夹放到/root/toolchain/gcc下面,但是还是提示找不到
雪    币: 373
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
燕乘风 2023-3-20 15:29
15
0
伤字号 我本地用了两种思路,都是网上博客看来的,第一种:1.qemu-img&nbsp;create&nbsp;new.img2.挂载new.img并写入root目录文件系统3.使用网上下载的 ...
大佬,问题解决了吗,我仿真同样碰到了 报错是:VFS: Unable to mount root fs on unknown-block(0,0)
的问题
雪    币: 123
活跃值: (405)
能力值: ( LV2,RANK:15 )
在线值:
发帖
回帖
粉丝
伤字号 2023-4-10 10:21
16
0
这个是rootfs指定错误的问题,师傅可以检查一下qemu启动参数里面rootfs是否正确的分出来了
PS:居然过了这么多年了。。
雪    币: 123
活跃值: (405)
能力值: ( LV2,RANK:15 )
在线值:
发帖
回帖
粉丝
伤字号 2023-4-10 10:23
17
0

这个是rootfs指定错误的问题,师傅可以检查一下qemu启动参数里面rootfs是否正确的分出来了@燕乘风
PS:居然过了这么多年了。

最后于 2023-4-10 10:24 被伤字号编辑 ,原因: 回复bug
游客
登录 | 注册 方可回帖
返回