前言
心得筆記
Reverse 的挑戰
- 過去關注 c/c++,依賴對組合語言的了解
Rust 的崛起
- Rust 是記憶體安全導向的語言,不用垃圾回收機制且比 c 的性能好
- Rust 的跨平台邊益能力和強大的套件管理,讓他越來越受到惡意程式開發者的歡迎
- 越來越多 APT 和勒索軟體使用 Rust 做開發
- Rust 支援各種呼叫方式,增加逆向的困難
- 講者表示沒人喜歡逆向 Rust ,顯示其逆向的困難度
Go 的啟示
- 過去 Go 語言也曾因逆向的困難而被忽視,導致惡意軟體大量採用。
- 為了應對 Go 語言的挑戰,他們開發了 Alpha Goang 工具,該工具透過一系列小型腳本來分析 binary
- Alpha Goang 的方法包括識別 Go 二進制檔案,重建 pcln 表,恢復函數名,修復字串引用,以及提取類型資訊。
- 他們的方法是先儘可能提取結構和推斷的資訊,再讓分析師介入。
Project Oxalic 的 Rust 逆向工程方法
- 受到 Alpha Goang 的啟發,講者也試圖以類似的步驟解決 Rust 的問題。
- 首先識別 Rust 二進制檔案,並發現編譯器會留下 Rust 編譯器版本和 Cargo 依賴項的資訊(commit id)。
- 研究 Rust 中的字串和切片結構,並在 IDA 中創建相應的結構來輔助解析。
- 講者發現 Rust 的堆疊展開(unwind)元資料中包含有用的資訊,如函數的 prologue 大小和所使用的暫存器。
Rust 的巨集驅動特性及其影響
- Rust 的巨集(macros)會自動執行許多安全檢查,在二進制檔案中留下許多資訊,這些資訊可能是攻擊者不知道的。
- 分析這些巨集產生的訊息,可以找到程式碼的來源檔案、行數和列數,這有助於理解程式的執行流程。
- Rust 程式碼會通過堆疊引用來執行,這在其他程式語言中可能不被允許。
IDA 和反編譯器的限制
- 現有的反編譯器(例如 IDA Pro, Ghidra, Binary Ninja)在處理 Rust 時仍然存在問題,會產生大量「幽靈變數」和錯誤的類型轉換
- IDA 的新版本(IDA 9)引入了 Flirt Signature Manager,可以更好地管理和應用程式碼簽章,但仍然需要開發更多客製化的簽章處理 Rust 依賴項
相關資料參考
轉載請註明來源