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


IoT安全:调试环境搭建教程(AArch64篇)_第1张图片

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)


IoT安全:调试环境搭建教程(AArch64篇)_第2张图片
IoT安全:调试环境搭建教程(AArch64篇)_第3张图片

编译

$ 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

IoT安全:调试环境搭建教程(AArch64篇)_第4张图片

修改根文件系统,添加开机自启动挂载共享文件。

$ 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

IoT安全:调试环境搭建教程(AArch64篇)_第5张图片

设置Vmware虚拟机网络

IoT安全:调试环境搭建教程(AArch64篇)_第6张图片

测试能双向ping通

IoT安全:调试环境搭建教程(AArch64篇)_第7张图片
IoT安全:调试环境搭建教程(AArch64篇)_第8张图片

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 

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参数,再次编译。

IoT安全:调试环境搭建教程(AArch64篇)_第9张图片

客户机执行

$ ./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工具的安装可以参考这篇:

《ARM汇编基础教程番外篇——配置实验环境》(点击即可阅读)

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


原文作者:wooyoung

原文链接:https://bbs.pediy.com/thread-229581.htm

转载请注明:转自看雪学院


更多阅读:

[ScyllaHide] 03 PEB相关反调试

FPS网络游戏自动瞄准漏洞分析以及实现

LINUX0.11缓冲区机制详解

pwnable.kr horcruxes ROP利用

你可能感兴趣的:(IoT安全:调试环境搭建教程(AArch64篇))