官术网_书友最值得收藏!

  • 網絡空間攻防技術原理
  • 韓蘭勝 何婧瑗 朱東君 鄧賢君主編
  • 2648字
  • 2025-01-09 16:36:51

2.2.3 二進制環境搭建

1.GCC及交叉編譯環境

除了 Web 學習環境外,還需要搭建二進制相關賽題的學習環境,首先介紹二進制程序編譯環境的搭建。在Ubuntu系統下,通常選擇GCC(GNU Compiler Collection,GNU編譯套件)作為編譯器。GCC最初是一款GNU操作系統下的C語言程序編譯器,由于它開放了源代碼,因此開發人員可以自由地參與到對它的維護與更新中,這使得它快速發展。目前GCC 已經能夠支持 C、C++、Objective-C、Fortran、Ada、Go 等高級程序設計語言,以及x86、ARM、MIPS等多種體系結構,并且可以在絕大多數類Unix操作系統(如BSD、macOS等)和一些其他操作系統(如Windows)上使用。

Ubuntu 20.04 LTS默認安裝了GCC,可以通過執行命令“gcc -v”查看其版本及配置信息。但是,64位操作系統中的GCC默認只能編譯64位的程序,需要通過執行下面的命令為其安裝32位程序的適配庫,使其能夠編譯32位的程序。

sudo apt install gcc-multilib g++-multilib module-assistant

安裝完畢后,當需要編譯32位的程序時,可以使用下面的命令。

gcc sourcecode.c -o binaryfile -m32

可以將上面的編譯過程稱為本地編譯,也就是編譯在當前體系結構的計算機上執行的程序。由于在CTF競賽中可能涉及其他體系結構的可執行程序,因此還需要為GCC安裝相應的交叉編譯工具鏈,使其能夠編譯不同體系結構的程序。以64位的 ARM 體系結構為例,首先通過執行下面的命令查看可供安裝的交叉編譯工具鏈。

# sudo apt search aarch64 | grep gcc
gcc-10-aarch64-linux-gnu/focal-updates,focal-security 10.3.0-1ubuntu1~20.04cross1
amd64
gcc-10-aarch64-linux-gnu-base/focal-updates,focal-security
10.3.0-1ubuntu1~20.04cross1 amd64
gcc-10-plugin-dev-aarch64-linux-gnu/focal-updates,focal-security
10.3.0-1ubuntu1~20.04cross1 amd64
gcc-8-aarch64-linux-gnu/focal 8.4.0-3ubuntu1cross1 amd64
gcc-8-aarch64-linux-gnu-base/focal 8.4.0-3ubuntu1cross1 amd64
gcc-8-plugin-dev-aarch64-linux-gnu/focal 8.4.0-3ubuntu1cross1 amd64
gcc-9-aarch64-linux-gnu/focal-updates,focal-security  9.3.0-17ubuntu1~20.04cross2
amd64
gcc-9-aarch64-linux-gnu-base/focal-updates,focal-security
9.3.0-17ubuntu1~20.04cross2 amd64
gcc-9-plugin-dev-aarch64-linux-gnu/focal-updates,focal-security
9.3.0-17ubuntu1~20.04cross2 amd64
gcc-aarch64-linux-gnu/focal 4:9.3.0-1ubuntu2 amd64
gccgo-10-aarch64-linux-gnu/focal-updates,focal-security
10.3.0-1ubuntu1~20.04cross1 amd64
gccgo-8-aarch64-linux-gnu/focal 8.4.0-3ubuntu1cross1 amd64
gccgo-9-aarch64-linux-gnu/focal-updates,focal-security
9.3.0-17ubuntu1~20.04cross2 amd64
gccgo-aarch64-linux-gnu/focal 4:10.0-1ubuntu2 amd64

根據需要選擇一個版本,假設是“gcc-aarch64-linux-gnu”,通過 apt 對其進行安裝,并查看版本及配置信息。

交叉編譯工具鏈安裝完畢,可以用它來編譯 arm64體系結構的程序。以下面的 C 語言代碼為例。

/* sample_arm64.c */
#include <stdio.h>
int main() {
    printf("This is an arm64 program.\n");
    return 1;
}

交叉編譯的方法與本地編譯方法基本類似。分別進行靜態編譯和動態編譯,并通過Linux的file工具查看得到的可執行程序文件,具體如下。

// 靜態編譯
# aarch64-linux-gnu-gcc -static sample_arm64.c -o sample_arm64_s
# file sample_arm64_s
sample_arm64_s: ELF 64-bit LSB executable, ARM aarch64, version 1 (GNU/Linux),
statically  linked,  BuildID[sha1]=5906a0e7fd294cfbda30eb59e27cb7267ac8de89,  for
GNU/Linux 3.7.0, not stripped
// 動態編譯
# aarch64-linux-gnu-gcc sample_arm64.c -o sample_arm64_d
# file sample_arm64_d
sample_arm64_d: ELF 64-bit LSB shared object, ARM aarch64, version 1 (SYSV), dynamically
linked, interpreter /lib/ld-linux-aarch64.so.1, BuildID[sha1]=51e64a8461334e650ca0f
1930340e7c4643b7a72, for GNU/Linux 3.7.0, not stripped

編譯成功,分別得到了64位的基于ARM體系結構的靜態鏈接可執行程序sample_arm64_s和動態鏈接可執行程序sample_arm64_d,嘗試運行這兩個程序,具體如下。

# ./sample_arm64_s
-bash: ./sample_arm64_s: cannot execute binary file: Exec format error
# ./sample_arm64_d
-bash: ./sample_arm64_d: cannot execute binary file: Exec format error

兩個程序均運行失敗。容易想到,個人計算機并采用 ARM 體系結構,無法運行基于ARM 體系結構的程序。那么,既然能夠在當前體系結構下編譯其他體系結構的程序,能不能想個辦法,讓這些程序也能在當前體系結構下運行呢?答案是肯定的,這就是下面要講的QEMU環境。

2.QEMU環境

QEMU 是開源跨平臺二進制程序動態執行模擬器,它可以模擬 x86、ARM、MIPS、PowerPC 等多種體系結構的動態執行。QEMU 的原理是將可執行文件的二進制代碼翻譯為TCG 微操作形式的中間代碼,再根據中間代碼編譯得到目標體系結構的二進制代碼,最后執行這些新的二進制代碼。對于基于ARM、MIPS等非當前體系結構的可執行程序,QEMU能夠幫助讀者方便地搭建模擬執行環境。

QEMU主要有兩種模擬方式,即用戶模式和系統模式。用戶模式下的QEMU相當于一個進程級別的虛擬機,能夠執行不同體系結構的二進制程序,在Ubuntu 20.04系統中可以通過執行命令“sudo apt install qemu-user”來安裝;系統模式下的QEMU則能夠模擬完整的操作系統,包括處理器及配套的外設等,在Ubuntu 20.04系統中,可以通過執行命令“sudo apt install qemu-system”來安裝。在路徑“/usr/bin”下可以通過執行“ls | grep qemu”命令查看QEMU能夠支持且當前已經安裝的體系結構。

QEMU 安裝完畢后,一些靜態鏈接的非當前體系結構的程序就可以成功運行了,例如我們之前編譯的靜態鏈接可執行程序sample_arm64_s,具體如下。

# qemu-aarch64 ./sample_arm64_s
This is an arm64 program.
# ./sample_arm64_s
This is an arm64 program.

無論是執行命令“qemu-arm ./sample_arm64_s”還是直接運行sample_arm64_s都沒有問題,非常方便。然而,對于動態鏈接的可執行程序,上述方法仍無法成功,例如前面編譯的動態鏈接可執行程序sample_arm64_d,具體如下。

# qemu-aarch64 ./sample_arm64_d
/lib/ld-linux-aarch64.so.1: No such file or directory

提示找不到文件“/lib/ld-linux-aarch64.so.1”,該文件是arm64體系結構所需要的動態鏈接庫文件。事實上,當我們安裝交叉編譯工具鏈時,arm64體系結構所需要的庫文件及頭文件已經安裝到/usr目錄下,只需通過設置-L參數把路徑告訴QEMU即可成功運行動態鏈接的可執行程序。

# qemu-aarch64 -L /usr/aarch64-linux-gnu/ ./sample_arm64_d
This is an arm64 program.

小貼士:在沒有安裝交叉編譯工具鏈的情況下,也可以單獨為QEMU安裝所需要的庫文件及頭文件。首先通過執行形如“sudo apt search libc6 | grep arm”的命令查看可供安裝的庫,然后通過執行如“sudo apt install libc6-arm64-cross”的命令安裝所需要的庫,之后可以在/usr目錄下找到相應的文件夾。如果留心觀察交叉編譯工具鏈的安裝情況,就會發現類似libc6-arm64-cross這樣的庫其實是作為交叉編譯工具鏈的依賴項同時安裝的。

在 QEMU 的用戶模式下,不同體系結構的程序都可以按照類似上面的方法來運行,這正是QEMU為我們帶來的方便之處。限于篇幅,關于QEMU的更多使用方法,尤其是它在系統模式下的使用,這里就不再展開介紹了,讀者可以自行查閱 QEMU 使用文檔。現在,已經得到了一個完整的、可跨平臺的二進制學習環境,該環境能夠支持編寫、編譯及運行不同體系結構的可執行程序。

3.Docker環境

通過前面的學習可以發現,搭建二進制程序的編譯及運行環境是比較復雜的,即使在GCC和QEMU的幫助下,這仍然不是一件很容易的事情。在一些CTF競賽中,為了避免將寶貴的時間耗費在復雜的環境搭建上,可能采用Docker來發布CTF競賽題目或提供運行環境,下面簡單介紹Docker的安裝及使用。

Docker 是一個開源的容器化平臺,它允許構建、測試并作為可移動的容器去部署應用程序。一個 Docker 就是一個應用程序的運行環境,包含程序運行所需要的所有依賴條件,并且可以在任何系統上運行。顯然,使用 Docker 將極大地方便我們快速部署各種程序運行環境。

一般推薦從倉庫安裝到更新 Docker,與包管理工具的更新源類似,使用國內的 Docker倉庫能夠更好地保證安裝的速度和穩定性。以某大學的 Docker 倉庫為例,可以通過執行下面的命令來安裝Docker。

// 安裝依賴項
sudo apt install ca-certificates curl gnupg lsb-release
// 信任 Docker 的 GPG 公鑰
curl -fsSL https://download.×××.com/linux/ubuntu/gpg | sudo apt-key add
// 添加 Docker 倉庫
sudo add-apt-repository "deb [arch=amd64] \
  https://mirrors.tuna.×××.edu.cn/docker-ce/linux/ubuntu \
  $(lsb_release -cs) stable"
// 安裝 Docker
sudo apt install docker-ce

安裝完畢后,嘗試執行命令“sudo docker run hello-world”,出現下面的提示表明安裝成功。

# sudo docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
2db29710123e: Pull complete
Digest: sha256:cc15c5b292d8525effc0f89cb299f1804f3a725c8d05e158653a563f15e4f685
Status: Downloaded newer image for hello-world:latest
Hello from Docker!
This message shows that your installation appears to be working correctly.
...

在默認情況下,必須具有sudo權限才能夠執行Docker命令,用起來不夠方便。為了簡化操作,可以通過執行命令“sudo usermod -aG docker $USER”將當前用戶添加到Docker用戶組中,其中docker即Docker用戶組,它是在Docker的安裝過程中自動創建的,$USER代表當前用戶的環境變量。重啟Ubuntu系統以刷新用戶組信息,之后無須提供sudo權限就可以直接執行Docker命令了。

關于Docker的更多使用方法,可以查閱Docker使用文檔。

其他二進制相關賽題可能用到的工具還包括靜態分析工具、動態調試工具及一些輔助工具等,它們的安裝及使用后續再進行講解。現在,讀者已經搭建好一個最基本的 CTF 學習環境,是時候來嘗試拿下“First Blood”了。

主站蜘蛛池模板: 封丘县| 重庆市| 武陟县| 搜索| 永清县| 吉木乃县| 昔阳县| 新和县| 新化县| 崇仁县| 岑溪市| 滨海县| 全椒县| 潍坊市| 连城县| 庆元县| 庆城县| 锦屏县| 旌德县| 类乌齐县| 鄢陵县| 东港市| 遵化市| 彭阳县| 策勒县| 祁东县| 东山县| SHOW| 普宁市| 兴和县| 亚东县| 垣曲县| 定南县| 容城县| 商河县| 三穗县| 固安县| 新安县| 佛教| 淮北市| 大邑县|