linux搭建ARM可調試環境

0x00 前言

本文中所介紹的方法目前只測試了單個的demo,並沒有拿大型的項目做測試,但是應該是大同小異。這裡介紹兩種方法,一種是有獨立的ARM硬件,另一種是依靠qemu實現的模擬化,其實其本質都是一樣的。如果是大型項目的話最好還是建議有一個原生的環境,畢竟模擬環境通常會遇到一些意外的事。

0x01 依靠qemu搭建環境

環境準備

  • ubuntu 20.04

這裡我的物理機是ubuntu,虛擬機一樣的。首先需要安裝一下qemu的環境和編譯ARM彙編機器碼的交叉gcc編譯器,其安裝命令如下

luna@ubuntu:~$ sudo apt update -y && sudo apt upgrade -y
luna@ubuntu:~$ sudo apt install qemu-user qemu-user-static gcc-aarch64-linux-gnu binutils-aarch64-linux-gnu binutils-aarch64-linux-gnu-dbg build-essential

然後我們編寫一個測試代碼,來驗證編譯和執行的效果

#include <stdio.h>

int main(void) { 
    printf("hello\n"); 

    return 0;
}

然後在編譯的時候添加一個-static選項,否則在程序執行時會出現動態鏈接庫找不到的情況

luna@ubuntu:~/study/c$ aarch64-linux-gnu-gcc -static -o test test.c

然後執行查看結果

luna@ubuntu:~/study/c$ ./test 
hello

到目前為止執行是沒有什麼問題了,接下來就是調試的問題,調試我們需要安裝一下gdb的多架構支持版本,在ubuntu中只需要執行一下命令

sudo apt-get update && apt install gdb-multiarch -y

然後就是調試的設置了

0x02 調試

這裡由於本地執行調試的話會出現問題,所以只能選擇遠程調試的方式,調試步驟如下,首先用qemu運行被調試程序,指定gdb遠程調試端口為1234,文件名為test

luna@ubuntu:~/study/c$ qemu-aarch64 -L /usr/aarch64-linux-gnu/ -g 1234 ./test

然後在另外一個終端中,我們打開gdb-multiarch,然後鍵入如下的指令鏈接到遠程目標

pwndbg> target remote 127.0.0.1:1234
pwndbg> file ./test
Reading symbols from ./test...

這樣就可以通過源碼調試的方式來調試程序了,結果如下圖所示

0x03 動態鏈接的方式如何調試

剛才的調試環境基本接近完美,但是,問題是如過目標程序是動態鏈接的呢?這在實際的測試中是個大問題,解決的辦法是在打開gdb以後指定一個路徑,如下

For AArch64:
(gdb) set solib-search-path /usr/aarch64-linux-gnu/lib/

0x04 物理設備

在搗鼓了模擬環境以後,突然看到了之前淘汰的一個小米手機,剛好可以拿來作為ARM64的實際環境,首先需要安裝一個termux,安裝以後需要裝一下ssh,基本步驟如下(注意,是在termux中操作)

#安裝OpenSSH
$ pkg install openssh

#運行SSH Server
$ sshd

#設置密碼
$ passwd 

#獲得Android IP
$ ifconfig

#PC端連接
 $ ssh 用戶名@ip -p 8022

注意手機必須和PC在一個網段內,然後在其上安裝gccgdb

$ pkg install gcc gdb

然後就可以開心的調試了,

這裡的一個問題是不能安裝gdb的插件,如果不習慣的話可以用之前的遠程調試來達到目的

#在手機端
gdbserver :1234 a.out

#PC端
pwndbg> target remote 192.168.0.100:1234