Project 0xA11C: Deoxidizing the Rust Malware Ecosystem

  1. 前言
  2. Reverse 的挑戰
  3. Rust 的崛起
  4. Go 的啟示
  5. Project Oxalic 的 Rust 逆向工程方法
  6. Rust 的巨集驅動特性及其影響
  7. IDA 和反編譯器的限制
  8. 相關資料參考

前言

心得筆記

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 依賴項

相關資料參考

Source

Youtube


轉載請註明來源