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]