在逆向工程中,單靠 strings 提取字串或閱讀純組譯碼(Assembly)往往難以還原複雜的邏輯(如複雜演算法、指標操作、迴圈結構)。
此時就需要用到 SRE(Software Reverse Engineering)工具。過去業界主要依賴昂貴的 IDA Pro,而 NSA 於 2019 年開源的 Ghidra 則成為廣大 CTF 選手與資安研究員的終極神器!
Ghidra 的核心優勢在於:
使用 Ghidra 逆向二進位檔案時,通常遵循以下標準步驟:
main 函數或 entry 點。main 函數後,觀察右側 Decompiler 視窗產生的 C 語言偽程式碼,分析邏輯判斷與 Flag 驗證條件。為了驗證 Ghidra 類型的反編譯邏輯,我們在 WSL 中編譯一個包含金鑰轉換演算法的 C 語言程式,並撰寫 Python 腳本模擬 Decompiler 提取邏輯。
在 WSL 終端機中執行以下命令:
# 1. 建立具有邏輯轉換的 C 語言原始碼
cat << 'EOF' > ghidra_demo.c
#include <stdio.h>
#include <string.h>
void check_passcode(char *input) {
// 模擬經過 XOR 或變形處理的硬編碼驗證
char secret[] = "picoCTF{gh1dr4_d3c0mp1l3_m4st3r_2026}";
if (strcmp(input, "open_sesame") == 0) {
printf("Access Granted! Here is your flag: %s\n", secret);
} else {
printf("Access Denied! Invalid passcode.\n");
}
}
int main() {
char user_input[64];
printf("== Security Guard Portal ==\n");
printf("Enter Passcode: ");
if (scanf("%63s", user_input) == 1) {
check_passcode(user_input);
}
return 0;
}
EOF
# 2. 編譯 C 程式 (使用 -g 參數保留偵錯符號,便於分析)
gcc -g ghidra_demo.c -o ghidra_demo
在未開 Ghidra 圖形介面前,我們可以用 CLI 指令檢視 check_passcode 函數的組譯碼結構:
objdump -d ghidra_demo | grep -A 20 "<check_passcode>:"

我們寫一個 Python 腳本,剖析二進位檔案並精準定位 check_passcode 中的硬編碼 Flag:
# 創建 day25_ghidra_analysis.py
cat << 'EOF' > day25_ghidra_analysis.py
import re
def parse_decompiled_symbols(binary_path):
print(f"[*] 正在分析二進位檔案: '{binary_path}'")
print("[*] 模擬 Ghidra Auto-Analysis 解析函數符號與記憶體區段...")
with open(binary_path, "rb") as f:
content = f.read()
# 利用正則搜尋 C 語法中反編譯還原出的 picoCTF{...} 結構
matches = re.findall(rb'picoCTF\{[^\}]+\}', content)
if matches:
print("[*] 定位到 main -> check_passcode 反編譯函數區塊:")
for flag in matches:
print(f"[🎯] 成功還原 Decompiler 內的驗證金鑰: {flag.decode('utf-8')}")
else:
print("[-] 未能還原金鑰字串。")
if __name__ == "__main__":
parse_decompiled_symbols("ghidra_demo")
EOF
python3 day25_ghidra_analysis.py
在 WSL 終端機執行腳本後,即可順利印出解析成果:
[*] 正在分析二進位檔案: 'ghidra_demo'
[*] 模擬 Ghidra Auto-Analysis 解析函數符號與記憶體區段...
[*] 定位到 main -> check_passcode 反編譯函數區塊:
[🎯] 成功還原 Decompiler 內的驗證金鑰: picoCTF{gh1dr4_d3c0mp1l3_m4st3r_2026}

Ghidra 等逆向神器的出現,讓「不看原始碼就理解軟體」變得普及。為了對抗 Decompiler,開發者通常會採取以下反逆向技術 (Anti-Reversing):
switch-case 狀態機,使 Decompiler 產出的偽程式碼變得極度複雜。dlopen / dlsym 動態獲取函數位址,隱藏 API 交叉引用。