美文网首页网络安全
IoT安全:调试环境搭建教程(AArch64篇)

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

作者: 看雪学院 | 来源:发表于2019-02-12 17:59 被阅读5次


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

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

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

    原文作者:wooyoung

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

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

    更多阅读:

    [ScyllaHide] 03 PEB相关反调试

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

    LINUX0.11缓冲区机制详解

    pwnable.kr horcruxes ROP利用

    相关文章

      网友评论

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

        本文链接:https://www.haomeiwen.com/subject/dabkeqtx.html