- 網絡空間攻防技術原理
- 韓蘭勝 何婧瑗 朱東君 鄧賢君主編
- 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”了。
- 數字身份與元宇宙信任治理
- Learning Python for Forensics
- API安全實戰
- INSTANT Windows PowerShell
- 計算機病毒原理與防范(第2版)
- Python Penetration Testing Cookbook
- 網絡安全三十六計:人人該懂的防黑客技巧
- 模糊測試:強制發掘安全漏洞的利器
- 網絡空間安全實驗
- Advanced Penetration Testing for Highly:Secured Environments(Second Edition)
- CTF特訓營:技術詳解、解題方法與競賽技巧
- Learning Pentesting for Android Devices
- VMware vCloud Security
- 數據恢復技術深度揭秘
- 數據安全實踐:能力體系、產品實現與解決方案