在 Ghidra 中转储 PCode 以获得特定的反编译功能

逆向工程 拆卸 吉德拉
2021-07-06 18:26:22

我正在为低级代码开发一个自动漏洞利用生成系统,我想在现实世界的代码上尝试一下。

我认为 PCode 可能是一个不错的起点,因为它抽象了许多细节,例如 x86 处理的细节。

我已经安装了 Ghidra,并且能够将二进制文件反编译为 C,但我希望从二进制文件中获取特定反编译函数的 PCode。

这里有一个先前的问题,在别处与此相关,但链接的脚本不再适用于最新版本的 Ghidra。

谁能提供一些关于如何让 Ghidra 在反编译后生成 PCode 的建议?

1个回答

我假设您想一次完全通过脚本获取整个函数的 PCode。在我对您链接的问题的回答中解释了通过 GUI 选择的反编译器中特定行的 PCode。

转储函数的整个(反编译)PCode 以供人工检查的最简单方法是Graph AST Control Flow隐藏在反编译器窗口右上角的小菜单中的 Action

在此处输入图片说明

这将呈现一个 CFG,其中基本块由 PCode 组成。它很好地与 GUI 同步,即单击一个节点将选择反编译器和列表中的相应行,反之亦然。这可能对调试非常有用。如果您单击反编译器窗口中的任何标记,您还可以轻松地获取实际对应的PCodeAST对象currentLocation.token.pcodeOp

从插件/脚本中获取实际的 PCode 对象:基本思想是您需要HighFunction一个函数对象,对象具有HighFunction.getPcodeOps()返回PcodeOpAST对象迭代器的方法烦人的部分是获取HighFunction. 以下代码来自GraphAST.javaGhidraScript 文件:

DecompileOptions options = new DecompileOptions();
DecompInterface ifc = new DecompInterface();
ifc.setOptions(options);

if (!ifc.openProgram(this.currentProgram)) {
    throw new DecompileException("Decompiler", "Unable to initialize: " + ifc.getLastMessage());
}
ifc.setSimplificationStyle("normalize");
DecompileResults res = ifc.decompileFunction(func, 30, null);
high = res.getHighFunction();