首页
社区
课程
招聘
[原创]IoT安全:调试环境搭建教程(AArch32篇)
2018-7-4 14:39 5310

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

2018-7-4 14:39
5310

本文是 《IoT安全:调试环境搭建教程》的第二篇,不多说直接上内容吧。

0x003  AArch32


主机:Ubuntu 16.04 LST

虚拟机版本: qemu 2.8.0

Linux内核版本:3.16

BusyBox版本:1.24.2

交叉编译工具链: arm-2014.05-29-arm-none-linux-gnueabi-i686-pc-linux-gnu

gdb版本:7.11.1

根文件系统:aarch32_rootfs.tar


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

链接:https://pan.baidu.com/s/1saWaHWh-3oIl35MPHkr6xQ 密码:u3l5


上一篇已经有的工具不再重复,可自行前往下载

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


安装qemu和依赖

# 已经安装过的,输入以下命令会出现提示
$ qemu-system-arm
qemu-system-arm: No machine specified, and there is no default
Use -machine help to list supported machines

编译linux内核
$ tar -xf linux-3.16.tar.xz

$ cross_compile=/root/toolchain/gcc/arm-2014.05/bin/arm-none-linux-gnueabi-
$ make CROSS_COMPILE=$cross_compile ARCH=arm O=./out_aarch32 vexpress_defconfig
$ make CROSS_COMPILE=$cross_compile ARCH=arm O=./out_aarch32 menuconfig
$ make CROSS_COMPILE=$cross_compile ARCH=arm O=./out_aarch32 zImage -j4

Kernel Features  --->
    Memory split (3G/1G user/kernel split)  --->
    [*] High Memory Support
Device Drivers  --->
    [*] Block devices  --->
        <*>   RAM block device support
        (8192)  Default RAM disk size (kbytes)
System Type  --->
    [ ] Enable the L2x0 outer cache controller



添加开机自启动挂载共享文件
$ sudo gedit ./etc/init.d/rcS

$ mkdir /nfsroot
$ mount -t nfs -o nolock 192.168.1.156:/nfsroot /nfsroot
这里 不知道为什么 ,貌似不能用9p的方式共享

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

Build Options  ---> 
    [*] Build BusyBox as a static binary (no shared libs)
    (/root/toolchain/gcc/arm-2014.05/bin/arm-none-linux-gnueabi-) Cross Compiler prefix

$ make && make install

制作启动用的ramdisk
$ tar -xzvf aarch32_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 cp -arf /root/toolchain/gcc/arm-2014.05/arm-none-linux-gnueabi/libc/lib rootfs/
sudo rm -rf rootfs/lib/*.a
sudo /root/toolchain/gcc/arm-2014.05/bin/arm-none-linux-gnueabi-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=8
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

提示"mkimage:找不到命令"
$ sudo apt install u-boot-tools

启动
# run.sh
qemu-system-arm \
    -M vexpress-a9 \
    -m 1024M \
    -smp 2 \
    -kernel ./zImage \
    -nographic \
    -append "root=/dev/mmcblk0 rw console=ttyAMA0 init=/linuxrc" \
    -sd ./a9rootfs.ext3 \
    -net nic,vlan=0 -net tap,vlan=0,ifname=tap0 \
    -redir tcp:2333::2333


若提示提示
EXT4-fs (ram0): mounted filesystem with ordered data mode. Opts: (null)
VFS: Mounted root (ext4 filesystem) readonly on device 1:0.
Freeing unused kernel memory: 1024K
mkdir: can't create directory '/var/lock': Read-only file system

config kernel后重新编译
Device Drivers —>
Generic Driver Options —>
(/sbin/hotplug) path to uevent helper
[*] Maintain a devtmpfs filesystem to mount at /dev
[*] Automount devtmpfs at /dev, after the kernel mounted the rootfs
[*] Select only drivers that don’t need compile-time external firmware
[*] Prevent firmware from being built
-*- Userspace firmware loading support
[ ] Include in-kernel firmware blobs in kernel binary
() External firmware blobs to build into the kernel binary
[ ] Driver Core verbose debug messages
[ ] Managed device resources verbose debug messages

配置主机nfs服务
$ sudo apt-get update
$ sudo apt-get install nfs-kernel-server

$ mkdir /nfsroot
$ sudo gedit /etc/exports
/nfsroot *(rw,sync,no_root_squash,no_subtree_check)

$ sudo /etc/init.d/rpcbind restart
$ sudo /etc/init.d/nfs-kernel-server restart

编译gdb-7.11.1
$ CC="arm-linux-gnueabi-gcc-5" CXX="arm-linux-gnueabi-g++-5" ./configure --target=arm-linux-gnueabi --host="arm-linux-gnueabi" --prefix="/root/toolchain/gdb/gdb-7.11.1/gdb/gdbserver/out_aarch32"
$ make install

交叉编译测试例程
$ mkdir build
$ nano hello.c
#include <stdio.h>

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

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

guest机启动调试
$ ./gdbserver_aarch32 0.0.0.0:2333 ./hello_aarch32

host机附加上去,报错
$ gdb
gef➤ gef-remote -q 192.168.1.20:2333
warning: while parsing target description (at line 10): Target description specified unknown architecture "arm"
warning: Could not load XML target description; ignoring
Remote 'g' packet reply is too long: 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030feffbe000000005c8b0000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

改成用gdb-multiarch
$ gdb-multiarch
gef➤ set architecture arm
The target architecture is assumed to be arm
gef➤ gef-remote -q 192.168.1.20:2333

至此,调试环境已经搭建好了,其实也可以直接Raspberry镜像,具体参考这篇文章

ARM汇编基础教程番外篇——配置实验环境


[培训]二进制漏洞攻防(第3期);满10人开班;模糊测试与工具使用二次开发;网络协议漏洞挖掘;Linux内核漏洞挖掘与利用;AOSP漏洞挖掘与利用;代码审计。

收藏
点赞1
打赏
分享
打赏 + 2.00雪花
打赏次数 1 雪花 + 2.00
 
赞赏  junkboy   +2.00 2018/07/04
最新回复 (0)
游客
登录 | 注册 方可回帖
返回