1. 程式人生 > >linux搭建ARM可調式環境

linux搭建ARM可調式環境

## 0x00 前言 本文中所介紹的方法目前只測試了單個的demo,並沒有拿大型的專案做測試,但是應該是大同小異。這裡介紹兩種方法,一種是有獨立的ARM硬體,另一種是依靠`qemu`實現的模擬化,其實其本質都是一樣的。如果是大型專案的話最好還是建議有一個原生的環境,畢竟模擬環境通常會遇到一些意外的事。 ## 0x01 依靠qemu搭建環境 環境準備 > * ubuntu 20.04 這裡我的物理機是ubuntu,虛擬機器一樣的。首先需要安裝一下qemu的環境和編譯ARM彙編機器碼的交叉gcc編譯器,其安裝命令如下 ```bash 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 ``` 然後我們編寫一個測試程式碼,來驗證編譯和執行的效果 ```c #include int main(void) { printf("hello\n"); return 0; } ``` 然後在編譯的時候新增一個`-static`選項,否則在程式執行時會出現動態連結庫找不到的情況 ```bash luna@ubuntu:~/study/c$ aarch64-linux-gnu-gcc -static -o test test.c ``` 然後執行檢視結果 ```bash luna@ubuntu:~/study/c$ ./test hello ``` 到目前為止執行是沒有什麼問題了,接下來就是除錯的問題,除錯我們需要安裝一下gdb的多架構支援版本,在ubuntu中只需要執行一下命令 ```bash sudo apt-get update && apt install gdb-multiarch -y ``` 然後就是除錯的設定了 ## 0x02 除錯 這裡由於本地執行除錯的話會出現問題,所以只能選擇遠端除錯的方式,除錯步驟如下,首先用qemu執行被除錯程式,指定gdb遠端除錯埠為`1234`,檔名為`test` ```bash luna@ubuntu:~/study/c$ qemu-aarch64 -L /usr/aarch64-linux-gnu/ -g 1234 ./test ``` 然後在另外一個終端中,我們開啟`gdb-multiarch`,然後鍵入如下的指令連結到遠端目標 ```bash pwndbg> target remote 127.0.0.1:1234 pwndbg> file ./test Reading symbols from ./test... ``` 這樣就可以通過原始碼除錯的方式來除錯程式了,結果如下圖所示
![](https://img2020.cnblogs.com/blog/1278763/202101/1278763-20210125174440297-1209157703.png)
## 0x03 動態連結的方式如何除錯 剛才的除錯環境基本接近完美,但是,問題是如過目標程式是動態連結的呢?這在實際的測試中是個大問題,解決的辦法是在開啟gdb以後指定一個路徑,如下 ```bash For AArch64: (gdb) set solib-search-path /usr/aarch64-linux-gnu/lib/ ``` ## 0x04 物理裝置 在搗鼓了模擬環境以後,突然看到了之前淘汰的一個小米手機,剛好可以拿來作為ARM64的實際環境,首先需要安裝一個[termux](https://termux.com/),安裝以後需要裝一下ssh,基本步驟如下(注意,是在termux中操作) ```bash #安裝OpenSSH $ pkg install openssh #執行SSH Server $ sshd #設定密碼 $ passwd #獲得Android IP $ ifconfig #PC端連線 $ ssh 使用者名稱@ip -p 8022 ``` 注意手機必須和PC在一個網段內,然後在其上安裝`gcc`,`gdb` ```bash $ pkg install gcc gdb ``` 然後就可以開心的除錯了,
![](https://img2020.cnblogs.com/blog/1278763/202101/1278763-20210125221300416-2053393959.png)
這裡的一個問題是不能安裝gdb的外掛,如果不習慣的話可以用之前的遠端除錯來達到目的 ```bash #在手機端 gdbserver :1234 a.out #PC端 pwndbg> target remote 192.168.0.100: