ghostrings
Version 2.4
通過p代碼分析,用於恢復GO二進製文件中字符串定義的腳本。用X86,X86-64,ARM和ARM64測試。
這些可以在腳本管理器的Golang類別中找到。
GoDynamicStrings.javaGoFuncCallStrings.javaGoStaticStrings.javaGoKnownStrings.javadata/known_strings.json加載的。GoStringFiller.javago.string.*經過初步分析。動態字符串分析腳本也有幾個特殊變體:
GoDynamicStringsSingle.javaGoDynamicStrings.java執行相同的分析,但使用單個反編譯器過程。如果分析二進制,請使用此功能會導致並行的分解器過程排氣系統存儲器。GoDynamicStringsHigh.java這可以在腳本管理器中的PCODE類別中找到。
PrintHighPCode.java這是使用這些腳本在GO二進制中恢復字符串定義的一般流程:
.rodata , .rdata或__rodata中的所有字符串。然後右鍵單擊代碼列表中,然後選擇“清除代碼字節”。GoKnownStrings.java檢測一些標準字符串。GoStaticStrings.java 。GoFuncCallStrings.java (如果Ghidra的內置Golang功能支持Golang二進製版本) 。GoDynamicStrings.java 。GoStringFiller.java 。go.string.*在第一個字節字符串。go.string.*中的剩餘空白。GoStringFiller.java ,請確定字符串長度在未定義的字符串數據中的變化位置,並定義最接近該邊界的字符串。然後重新運行的GoStringFiller.java自動填充可以正確確定其餘未定義字符串的長度的點。在吉德拉:
使用Ghidradev插件的Eclipse:
用食物建造:
直接與Gradle建立:
$ cd Ghostrings
$ gradle -PGHIDRA_INSTALL_DIR= < ghidra_install_dir > 反向工程GO程序的一個眾所周知的問題是,在GO字符串中缺乏零件終止器,使從編譯的二進製文件中恢復了字符串定義。 GO程序的許多常數字符串值在編譯構建中存儲在一個巨型斑點中,而沒有內置的終端字符內置在字符串數據中以標記一個字符串結束,另一個字符串開始。即使是一個簡單的程序,它只是打印“ Hello World!”與GO運行時系統和其他標準庫有關,其中有1,500多個字符串。這可能會導致典型的ASCII字符串發現實現,例如Ghidra提供的實現,以創建誤報字符串定義,這些定義是數以萬計的字符。
Go使用由指針和長度值組成的字符串結構,而不是終止終止字符串。這些字符串結構中的許多是在程序的堆棧上創建的,因此恢復單個字符串啟動位置和長度值需要分析編譯的機器代碼。有一些現有的腳本通過檢查X86-64指令的某些模式來執行此分析,但是它們錯過了具有無與倫比的指令變化的結構,這些結構最終對堆棧產生相同的效果,並且也僅限於特定的ISA。
GhoStrings通過使用Ghidra的分解器分析生產的簡化,獨立的P代碼操作來避免這兩個問題。
版權2022 NCC組。根據GPLV3許可證發布(請參閱許可證)。
主要項目作者:James Chambers [email protected]