该仓库包含用于生成和查找扩展流保护(eXtended Flow Guard)哈希的脚本。
关于其工作原理的扩展文章可在《International Journal Of Proof Of Concept || GTFO》第 22 期中获取。
我在这个 PoC 上的工作得益于 Quarkslab 团队的极大简化,他们对微软编译器的相关部分进行了广泛的逆向工程。关于 XFG 哈希如何计算的深入分析可在此阅读:https://blog.quarkslab.com/how-the-msvc-compiler-generates-xfg-function-prototype-hashes.html
注意:这绝不是在“攻破”作为漏洞利用缓解措施的 XFG,而仅仅是利用其副作用来揭示没有符号的函数。
简而言之,Windows 上实现的 XFG 扩展并加强了控制流保护(Control Flow Guard)漏洞利用缓解措施,它将间接函数调用的可能目标不仅限制为有效的函数入口点,还限制为具有匹配签名的函数。为此,每个函数都会计算一个 XFG 哈希,并在运行时对其进行校验。哈希仅基于函数原型(即调用约定、参数及其类型)。因此,我们可以为已知类型预计算哈希,之后在未知二进制中查找函数对应的哈希。
如果查找成功,我们就能 100% 确定所有参数的确切数量和类型以及函数的返回值。这对于没有公开符号的二进制和函数来说极为有用。
我邀请您阅读 PoC||GTFO 中的完整文章,可从附近的镜像获取。
脚本如下:
要使用这些脚本,您首先需要修改 gen_function_prototypes.py,添加针对目标特定的“原始类型”、结构体或枚举。此外,您还需要选择要暴力破解的参数数量。最多 3 个参数只需一分钟,最多 4 个参数则需要一天……
生成所有组合的函数原型后,您需要运行 gen_hash_from_ast.py,它将逐行解析先前生成的文件并生成对应的 XFG 哈希。
完成后,您将获得一个包含函数原型及其匹配 XFG 哈希的 SQLite 数据库。xfg_analyzer.py 中包含一个非常简单的 Binary Ninja 插件。当针对受 XFG 保护的二进制运行时,它会查找所有 XFG 哈希,在数据库中检索它们,如果找到匹配项,则将新的函数原型应用于已定义的函数。
请知悉,这只是一个 PoC。要使其真正实用,需要生成一个巨大的哈希数据库(可能使用 Windows 头文件中的所有结构体/枚举名称作为种子),并提供在线查询功能。此外,将此思路扩展到 C++ XFG 哈希将是一个非常有趣的项目。
欢迎以任何方式使用本仓库中的代码。如果您觉得它有用,我很乐意听到您的反馈。