Skip to content
KitploitKITPLOIT
工具博客
提交
工具博客
提交

黑客、渗透测试和网络安全工具,武装您的安全武器库!

Kitploit 是一个黑客、网络安全和渗透测试工具的目录。发现最新的项目更新,查找漏洞、分析系统、自动化测试并加强你的安全。

··订阅源·联系·隐私·© 2026 Kitploit

工具目录

分类

查看所有分类
Loading categories
JOP_ROCKET — This framework enables user to discover JOP gagdets and can automate building a complete JOP chain to bypass DEP. JOP ROCKET is the ultimate solution for Windows jump-oriented programming. JOP ROCKET also finds the novel two-gadget dispatcher, which greatly expands what is possible with JOP. | Kitploit
工具/GitHubGitHub/bw3ll/jop_rocket
ExploitationReverse EngineeringPapers & ResearchLearning & EducationPayload DevelopmentBinary ExploitationLabs & Practice
GitHubbw3ll/jop_rocket

JOP_ROCKET

查看仓库
116201年前Kitploit 审核通过

最受欢迎

查看全部 →

发现我们社区最常用的工具。

探索所有工具

浏览我们的工具集合

查看所有工具 →

关于

This framework enables user to discover JOP gagdets and can automate building a complete JOP chain to bypass DEP. JOP ROCKET is the ultimate solution for Windows jump-oriented programming. JOP ROCKET also finds the novel two-gadget dispatcher, which greatly expands what is possible with JOP.

分享

alt text

JOP ROCKET

注意:在 2.15 版本中,我们引入了双 gadget 调度器(two-gadget dispatcher)——这大大扩展了调度器 gadget 的可能性。2021 年 5 月 26 日发布的 2.15 版本增加了很多优化和新的功能。

更新:2021 年 11 月 29 日:我已上传了 @Hack(利雅得)的幻灯片,以及一篇关于无 Shellcode JOP 的白皮书。演讲中使用的无声演示视频可在此处找到:https://www.youtube.com/playlist?list=PLynyJsHgQaJ3AfQGKVkeZJ9cWa7mIqDMV

更新:2022 年 12 月 1 日:我在本 GitHub 的末尾添加了一个问答部分,其中包含资源链接(演讲和论文)。

当前版本:2.15

跳转导向编程逆向开放网络知识专家工具(Jump-oriented Programming Reversing Open Cyber Knowledge Expert Tool),简称 JOP ROCKET,是一款旨在帮助在 x86 Windows 环境中进行 JOP gadget 发现的工具。该工具在 DEF CON 27 上发布,并成为 Dr. Bramwell Brizendine 和 Dr. Josh Stroschein 演讲的主题。一个正在开发中的重大更新已于 2020 年 9 月发布,并计划在不久的将来进行小规模更新。

请访问 https://github.com/Bw3ll/JOP_ROCKET 以下载此工具。

目前已进行了多项重大更新。建议将 2.15 之前的任何版本更新到 2.15,以充分利用这些更新。这些更新包括自动 JOP 链生成、发现新型 gadget、新型调度器 gadget 以及双 gadget 调度器。JOP ROCKET 还进行了许多其他重要改进,以增强和优化其性能和速度。

JOP ROCKET 是一个使用 Capstone 反汇编引擎以及其他依赖项的 Python 程序。这款软件漏洞利用工具是一个功能完备的产物,旨在促进跳转导向编程(Jump-oriented Programming)。它设计为在 Windows 上运行。

除帮助菜单中的内容外,目前没有更多使用信息。构建 JOP 漏洞利用并非易事,且非常微妙,与 ROP 有一些相似之处,但也有很多不同之处。请参阅 DEF CON 演讲观看简要演示。https://www.youtube.com/watch?v=PMihX693mPE

该工具已在达科他州立大学(Dakota State University)的博士课程中讲授,作为 CSC 848:高级软件漏洞利用(Advanced Software Exploitation)的一部分,这是该课程体系中最具挑战性的课程。学生们完成了包括绕过 DEP 和 ASLR 在内的漏洞利用。

感谢 Austin Babcock 在 JOP ROCKET 相关各种问题上的帮助,包括他的安装说明。他是 JOP 大师。

我们在这里上传了一个压缩包,JOP ROCKET challenge - toy binaries.zip,以便有兴趣的人使用 JOP ROCKET 在一些示例玩具二进制文件上测试和练习 JOP。你能绕过数据执行保护(DEP)吗?如果你想在一个已知保证存在漏洞且具有合适 gadget 的二进制文件上练习 JOP,这很适合。同一个二进制文件有一个较简单的版本和一个较难的版本。不过,JOP 第一次可能会更难,直到有人掌握它的窍门。一旦你用这些二进制文件掌握了 JOP,你就可以尝试在一些真实世界的 gadget 上使用它,前提是它们有足够的 gadget。如果你采用调度器 gadget 范式,请记住你确实需要一个调度器 gadget。JOP 也可以与 ROP 混合使用,用一个 JOP gadget 指向 RET,因此 JMP EDX 可以让 EDX 指向 RET。如果你只需要一两个 JOP gadget 来让 ROP 生效,这更有用。不过,压缩包中的二进制文件应该允许你以几种不同的方式使用调度器 gadget 范式!

使用 JOP 的调度器 gadget 范式,你可以 100% 消除 ROP,尽管最轻松的开局方式是用两个 ROP gadget 来加载分派表和调度器 gadget。预构建的 JOP 链会自动为你完成这项工作(假设它们存在)。从那时起,就可以是纯 JOP,同时使用间接跳转和间接调用(JMP EBX、CALL EDX 等)。

JOP ROCKET 的基本安装说明

步骤 1:

安装 Python 2.7。最简单的方法是从该网站安装:https://www.python.org/download/releases/2.7/

如果你已经有 Python 3,你仍然需要安装 Python 2.7,因为该工具在 Python 3 下无法正常工作。

如果两者都有,你需要在 rocket.py 的顶部添加特殊注释:

#!python2

然后使用 "py rocket.py" 而不是 "python rocket.py" 运行。这将确保程序使用 Python 2.7 运行。或者,你也可以直接运行 py -2 rocket.py

alt text

步骤 2:

如果 Python 没有自带 pip,请安装 pip。

  • https://pip.pypa.io/en/stable/installing/

你需要按照链接上的说明保存提供的脚本并运行它。如果遇到错误,请尝试使用"备用"(alternate)脚本。

如果 pip 仍然无法工作,请尝试将 "C:\python27\Scripts"(或你的相应目录)添加到你的 Path 系统变量中:

  • 开始
  • 右键单击"计算机"
  • 属性
  • 高级系统设置
  • "高级"选项卡
  • 环境变量

alt text

步骤 3:

开始使用 pip 安装依赖项!

注意:使用 pip 安装应该在 Windows 终端中有效,但在 Cygwin 环境中可能无效。如果使用 Cygwin,你可能需要改从源代码安装。这可能是一个更耗时的过程,请参考各依赖项制造商的最新文档。

  • pip install capstone

  • pip install pefile2

    • 你很可能已经随 Python 2.7 安装了 pefile,但这个版本很旧。

    • Pefile2 才是你需要的。

    • 你可能需要 pip uninstall pefile 才能让程序使用 pefile2。

  • 等等……本文件底部可以找到依赖项列表。如果尚未安装,每一项都必须安装。

  • 以上两个很可能就是你唯一需要自己安装的。

许多依赖项已经随 Python 附带。要列出可用的模块,请打开一个提示符:

alt text

浏览列表,检查你是否拥有所有依赖项。对于没有的依赖项,请使用 pip 或通过源代码安装。

依赖项:

  • Capstone
  • pywin32
  • Pefile2
  • Ctypes

注意:pywin32 用于 Win32file 和 Win32api

所需文件:

你应该在一个目录中拥有全部五个文件:rocket.py、lists,py、checkIt.py、ui.py 和 stackpivot.py。要开始使用该工具,请在命令行运行 python rocket.py filename.exe —— filename.exe 是你希望为其获取 JOP gadget 或 JOP 链的程序。

错误:

如果你遇到类似 "SyntaxError: Missing parentheses in call to 'print'" 的错误,很可能是正在使用 Python 3 运行。请尝试执行步骤 1 中概述的修复,使程序使用 Python 2。

与"lists"或"ui"相关的错误很可能是由 lists.py 和 ui.py 文件的位置引起的。请确保这些文件与 rocket.py 位于同一目录中。

更高级的安装步骤

要在 Cygwin 环境中使用此工具,你可能需要从源代码安装 Capstone。有多种方法可以做到,Capstone 的文档提供了帮助。Cygwin 最初在工具开发期间被使用,尽管现在已不再使用。JOP ROCKET v2.0 未在 Cygwin 上进行过测试,命令提示符是 JOP ROCKET 的推荐使用方法。注意:Cygwin 的使用不再被明确支持,也不再推荐将此程序与 Cygwin 一起使用。

基本用法

更详细的使用信息即将发布。请参阅 DEF CON 27 演讲和帮助子菜单以获取帮助。

不过,要开始使用,你需要将五个 Python 文件放在同一目录中:rocket.py、ui.py、stackpivot.py、checkIt.py 和 lists.py。然后从命令行运行。你可以提供安装目录中的本地文件,但它将无法找到模块/DLL。为了找到这些文件,程序必须已安装,并且应用程序的绝对路径可以作为输入放在文本文件中,该文本文件可以作为命令行参数提供,例如:

python rocket.py input.txt

在 input.txt 中,我们可以写入绝对路径,例如 C:\rocket2\sample_binary.exe。通过提供绝对路径,你还可以提取要扫描的模块(如果需要的话)。如果你只想将 JOP ROCKET 与本地目录中的程序一起使用,它将只会为映像可执行文件本身找到 gadget,即不包含 DLL。要以这种方式使用它,请使用以下语法:

python rocket.py sample_binary.exe

如果可执行文件位于同一目录中,你可以按照上述方式使用 JOP ROCKET

确保你获取二进制文件的所有模块/DLL

在加载要分析的可执行文件或 DLL 时,有两种方法。第一种是简单地将可执行文件放在同一目录中并运行程序,将其作为参数,例如 python rocket.py binary.exe。这将使用户能够识别和提取许多系统模块。但是,它不会找到某些非系统二进制文件。为了全面覆盖,用户必须在文本文件中提供应用程序的绝对路径,并将其作为 ROCKET 的输入,例如 python rocket.py input.txt。这将使 ROCKET 能够定位、提取和搜索与目标应用程序关联的非系统 DLL。因此,通常建议通过文本文件提供二进制文件作为输入,否则某些 DLL 可能会被排除。例如,python rocket.py binaryToScan.txt。binaryToScan.txt 应该包含二进制文件的路径:C:\Users\CoolPerson\Desktop\Instructions\targetBinary.exe

超大二进制文件的内存问题

32 位 Python 在处理非常大的二进制文件时会卡住。要能够处理这些文件,你必须使用 64 位 Python。

以下是 Austin 关于从 32 位 Python 切换到 64 位 Python 的一些说明:要安装 64 位版本的 python2.7,首先确保旧的安装已被卸载。安装 64 位版本后,在导入库时你可能会遇到一些错误,例如 "DLL load failed: %1 is not a valid Win32 application"。这些错误的发生是因为 Python 试图加载先前安装的 32 位版本。要解决此问题,请使用 pip 卸载该库。如果同时安装了 Python 2 和 3,请确保使用正确的 pip 版本,方法是以 "py -2 -m pip " 的形式使用它。

修复 capstone 的问题很简单:

py -2 -m pip uninstall capstone

py -2 -m pip install capstone

与 win32api 导入相关的错误与 pywin32 有关。卸载该库更困难,因为 pip 可能无法自动完成该过程。可能需要手动卸载,方法是删除 ...\Python27\Lib\site-packages 中的 PyWin32 文件。

然后,运行:

py -2 -m pip install pywin32

之后,通过运行 ...\Python27\Scripts\pywin32_postinstall.py -install 完成安装。

问答

问:JOP ROCKET 有什么特别之处?

答: JOP ROCKET 能找到所有必需的 gadget,包括调度器 gadget。据我所知,没有其他工具会搜索调度器 gadget。此外,它还引入了新型 gadget 和对 JOP 的创新。JOP ROCKET 还可以使用调度器 gadget 范式的一种新变体(涉及一系列多次堆栈迁移)生成完整的 JOP 链来绕过 DEP。实际上,如果不使用 JOP ROCKET,使用调度器 gadget 方法进行 JOP 漏洞利用将非常困难。还有其他一些 ROP 工具可能会提供较有限的 JOP gadget,但它们大多是未来工作的占位符,如果没有 JOP ROCKET 找到的一些 gadget,你无法完成 JOP 漏洞利用。

问:我觉得我以前在某次演讲中见过 JOP ROCKET?在哪里?

答: 我们曾在多个会议上演讲过:DEF CON 27(2019)、Wild West Hackin' Fest(2020)、Hack in the Box Amsterdam(2021)、Black Hat Asia(2021)和 @Hack(2021)(现已更名为 Black Hat Middle East and Africa)。每次会议通常都有一篇白皮书和一个视频(@Hack 没有视频)。此外还有一些学术会议。每次演讲和白皮书都不同,通常至少包含 60-70% 的新内容。它们涉及 JOP 的许多不同主题。我们目前没有新的演讲计划,除非我们有新的内容可以分享,否则不会再做演讲,因为我们不喜欢重复自己。

以下是一些 JOP 资料的有限列表。这些并不是相同的演讲或论文,因为我们不断在发展和添加新的创新。每一项都有新颖的贡献。

DEF CON 27 2019 视频:https://www.youtube.com/watch?v=PMihX693mPE

Wild West Hackin' Fest 2020 视频:https://www.youtube.com/watch?v=ZQuxSSBfeHM

Black Hat Asia 视频:https://www.youtube.com/watch?v=NYgTw-h6GT8

Black Hat Asia 论文:https://i.blackhat.com/asia-21/Thursday-Handouts/as-21-Brizendine-Babcock-Prebuilt-Jop-Chains-With-The-Jop-Rocket-wp.pdf

Hack in the Box Amsterdam 2021 视频:https://www.youtube.com/watch?v=MxIySXHvKyE

Hack in the Box Amsterdam 2021 论文:http://magazine.hitb.org/wp-content/uploads/2021/06/HITBMag-Issue-12-June-2021-.pdf

高清版:http://magazine.hitb.org/wp-content/uploads/2021/06/HITBMag-Issue-12-June-2021-Hi-res.pdf

@Hack 2021(已更名为 Black Hat Middle East and Africa)论文:https://blackhatmea.com/content-hub/advanced-code-reuse-attacks-jump-oriented-programming

如果你是一名学术研究人员,也请引用其中一些资料或我们的学术论文。:-)

问:真实世界的 JOP 漏洞利用有什么例子吗?

答: Austin 在 Exploit DB 上发布了一个:https://www.exploit-db.com/exploits/49959

你可以在我们做的 HITB 2021 演讲中看到它的视频以及他对此的讲解。那个真实世界的 JOP 漏洞利用带来了一些特殊的挑战,所以值得一看和研究。虽然 Austin 是手工编写的,但实际上 JOP ROCKET 的自动 JOP 链生成本可以完成大部分工作。(仍然需要额外的特殊设置来弥补某些挑战。)这也是我们调度器 gadget 方法新颖变体的一个例子,使用了一系列多次堆栈迁移。这个漏洞利用用了不到一天就完成了。

问:JOP 很难做吗?

答: 不,不难,但它与 ROP 非常不同。有些地方存在不同的"规则",这些规则可能不会立即显现。我们在不同的论文中广泛地写过它们,或者在我们做过的不同演讲中讨论过它们。然而,有时具有挑战性的是拥有足够的 gadget。JOP 有不同的风格,如果你试图采用调度器 gadget 方法——它可以让你在不使用 ROP 的情况下完成完整的 JOP 漏洞利用——那么你必须有一个调度器 gadget。

问:JOP 不就是 ROP 换了个名字吗?

答: JOP 非常灵活。它可以(被视作 ROP)。你可以将 RET 加载到 JOP gadget 中,因此例如每当你执行 JMP EBX 时,它就等同于 RET。从这个意义上说,你可以将 JOP 仅仅作为扩展 ROP 的一种方式,并且你不需要调度器 gadget。以这种方式构建整个漏洞利用似乎很繁琐,尽管如果你真的想的话,你也可以这样做。我们也写过其他风格的 JOP,尽管我们的大部分工作集中在调度器 gadget 方法上。

问:什么是调度器 gadget?它容易找到吗?什么是双 gadget 调度器?

答: 那是一种相对罕见的 gadget,并不总是容易找到;一些二进制文件可能没有可行的调度器 gadget。请注意这里使用的是过去时态。我们已经引入了替代的调度器 gadget,更重要的是,引入了双 gadget 调度器,我们在 HITB 论文中对此进行了阐述。这需要将两个常见的 gadget 链接在一起,因此调度器 gadget 不再罕见。其中一个必需的 gadget 非常常见,通常几乎所有寄存器都有它的变体;另一个也非常常见,但没有那么常见。不过,可能还有其他实际限制,例如如果你使用双 gadget 调度器,那将占用另一个寄存器。(如果需要在漏洞利用期间切换调度器 gadget 和正在使用的寄存器,这是可以的。)

问:双 gadget 范式是否已内置到 JOP ROCKET 的自动 JOP 链生成中?

答: 不,没有。自动 JOP 链生成的创建非常耗时,而我是在完成此功能之后才创建了双 gadget 调度器的概念。我可能会在某个时候尝试将其添加进去,但不会在近期内。更可能的情况是,只有当我完全重写 JOP ROCKET 时才会添加它。默认情况下,JOP ROCKET 会为所有可用的寄存器创建不同变体的 JOP 链,即使找不到传统的调度器 gadget 也是如此。因此,有人自己去添加他们自己的双 gadget 调度器并不需要太多精力。不过,需要注意双 gadget 调度器需要保护的寄存器,因为该工具不会自动做到这一点。

问:我想尝试制作自己的 JOP 链?可以吗?

答: 当然可以。出于教程目的,我们在 GitHub 上提供了一个二进制文件——两种形式——带有刻意创建的 JOP gadget——一个简单版本和一个困难版本。困难版本有 null 字节限制。你可以尝试在不使用自动 JOP 链生成的情况下制作一个,看看能否找到自己的 gadget。你也可以尝试使用自动 JOP 链生成。使用自动 JOP 链生成时,在处理 null 字节时你需要做额外的工作。我想这可能是未来额外工作的一个领域——将其中一些自动化。

问:为什么 JOP ROCKET 使用旧版 Python?你打算把它改成现代 Python 吗?

答: 它最初是几年前创建的,当时我完全没有打算分享它。我最初提交到 DEFCON 只是出于偶然。不幸的是,现代和旧版 Python 之间的差异使得修改 JOP ROCKET 变得非常复杂,而且有许多复杂函数会涉及这些差异。JOP ROCKET 也非常庞大,我不一定能凭记忆想起所有需要修改的地方。更有可能的是,我会完全重写 JOP ROCKET,同时使其各部分比现在更加模块化和紧凑。如果我这样做,我想添加几个新功能,而且我也可以做一些非常酷的事情。我近期内没有计划,但可能在未来一到三年内。不过永远不要说不,因为有时我可以非常快速地重写代码。在那段时间里,我可能会对当前的 JOP ROCKET 进行其他更新,因为较小的更新比完全重写更容易。

问:"我们"是谁?

答: JOP ROCKET 的创建者是 Dr. Bramwell Brizendine。这原本是他博士论文的主题,但从那时起它已经成长和变化了很多。他的一个学生 Austin Babcock 在本科阶段就参与了 JOP 研究,并在攻读计算机科学硕士学位期间一直继续这项工作。在那段时间里,Austin 是几篇论文的合著者,也是几个活动的联合演讲者。Austin 对 JOP 的工作原理机制做出了重要贡献。他后来成为 JOP ROCKET 的贡献者,主要引入了优化和代码改进。Austin 已经制作了几个 JOP 漏洞利用。其中一个在 ExploitDB 上。

**问:你们在 JOP 方面做的最新的事情是什么?**A: 嗯,存在双 gadget 调度器(two-gadget dispatcher),它使得 JOP 在众多二进制文件中成为可能,因为调度器 gadget 不再难以寻觅。这非常重要——因为在许多情况下,缺乏有效的调度器 gadget 会成为限制因素——而这种情况现在已经不复存在了。我们还引入了一些替代性的单 gadget 调度器,尽管大多数似乎并不常见(其中一部分归功于 Andrew Kramer)。我们还提出了“无 shellcode 的 JOP”(shellcodeless JOP),它避免了绕过 DEP 的需要,并将 shellcode 的功能直接整合到 JOP 中。我们在 HITB 上做了一小部分相关演示,在 @Hack 2021(Black Hat MEA)上则展示了更多内容。@Hack 的演讲没有被录制,不过有一篇非常详细的论文。相关的实际运行片段可以在 @Hack 2021 的一些无声演示视频中看到:https://www.youtube.com/playlist?list=PLynyJsHgQaJ3AfQGKVkeZJ9cWa7mIqDMV 。我已有一些学生接受了无 shellcode JOP 的挑战——这确实需要更高的技能和对代码复用攻击的熟练掌握。

Q: JOP ROCKET 是否适用于 Linux 二进制文件?

A: 不适用,很遗憾它目前不支持。

Q: JOP ROCKET 是否适用于 64 位二进制文件?

A: 不,目前还不支持。

Q: JOP 的总体方法是什么?

A: 请阅读我们的论文或观看我们的演讲。我们在扩展 JOP 的可行性方面做了大量工作。在我们的研究之前,关于 JOP 的文档几乎为零,而我们创建了许多新的实用 JOP 技术。

Q: 我是一名学术研究人员,想基于 JOP 做些工作,例如写论文或做报告。我可以联系你们吗?

A: 当然可以,如果你计划写论文或开展新项目,可以联系我们。你可以通过 bramwell.brizendine AT gmail 联系我。如果 Austin 感兴趣,我可以转达给他。我们甚至可能有兴趣合作。如果你在研究中的某种方式使用了我们的 JOP 成果,请引用我们。对于涉及 JOP 的研究,最实用的方向大概是为 JOP 引入一些防御或缓解措施。我们之前也曾被人联系过。

Q: 还有其他人做过 JOP 吗?

A: 这并不常见,而在我们第一次 DEFCON 演讲之前,更是极为罕见。我们确实极大地提高了人们对它的认识。我之前在一门博士层次的《高级软件漏洞利用》课程中教授了三年 JOP,因此有几十名学生创建了 JOP 漏洞利用。我不知道实际有多少人在真实环境中使用它——不过现在有了 JOP ROCKET,人们显然可以做到。我还指导过不同的本科生完成 JOP 漏洞利用。并没有特殊理由要求必须是博士生——任何在漏洞利用和代码复用攻击方面具备扎实能力的人都可以。鉴于我们做过的演讲和写过的论文数量——再加上诸如双 gadget 调度器这样的创新——任何熟练掌握 ROP 的人都没有理由不能掌握 JOP。

Q: 为什么需要 JOP ROCKET?

A: 没有 JOP ROCKET,你只能发现 JOP gadget 的一小部分,而且它们会杂乱无章,因此寻找某个 gadget 就像大海捞针。许多真实世界中的 JOP gadget 是并非自然出现的非预期 gadget(unintended gadgets),所以除非你是某种极其专注的天才并创建了自己的工具或脚本,否则如果你想构建一个完全不使用 ROP gadget 的完整 JOP 漏洞利用,就会错过很多内容。还有一些诸如调度器 gadget 之类的东西,你必须在某种程度上神奇地自行找到它们,哪怕是非预期的形式。这就是为什么在我们的工作之前 JOP 非常罕见且很少被提及的重要原因。这并不意味着现在它已经很普遍了。在 JOP ROCKET 出现之前,编写漏洞利用需要克服几个重大难题。现在有了 JOP ROCKET,这些问题已经得到克服,你可以用 JOP gadget 自行构建利用,或者改编通过自动 JOP 链生成(automatic JOP chain generation)创建的 JOP 链。

Q: JOP 会比 ROP 更容易吗?

A: 实际上,我曾听一些学生说 JOP 比 ROP 更容易——而且确实可以如此——前提是拥有合适的 gadget,并采用我们新颖的多栈枢轴(multiple stack pivots)调度器 gadget 方法。注意这里的关键词是“可以如此”。这只在特殊情况下才成立,例如没有空字节限制、有充足的栈枢轴 gadget,并且假定存在有效的调度器 gadget。

Q: JOP 适合谁?

A: 我认为它主要适合那些精通代码复用攻击、想要挑战自我、尝试前沿技术的人——尽管并非所有 JOP 都必须“困难”。如果你能完成 JOP,那是一种值得骄傲的荣誉。如果你创建了 JOP 漏洞利用,把它发布到 ExploitDB 并附上 JOP ROCKET 的链接,以帮助提高人们的认识。JOP 也适合那些仅仅想避免使用 ROP 的人——也许存在某种用于检测 ROP gadget 的缓解措施。JOP 不是 ROP,你可以在不使用任何 ROP gadget 的情况下完成一个完整的 JOP 漏洞利用。

Q: 我进行了自动 JOP 链生成,它为 VirtualAlloc 生成了许多不同的链。为什么会有这么多?

A: 我从这样一个角度来处理 JOP:某些寄存器会持有指向调度器 gadget 的指针和指向调度表的指针,因此这些寄存器会被占用。功能 gadget(与普通 ROP gadget 更相似)会调用调度器 gadget,后者随后推进调度表中的位置。因此,JOP ROCKET 会使用不同的寄存器组合来创建不同的链。一些寄存器会被“保留”给调度器 gadget 和调度表,不过如果你愿意,可以随时来回切换。某些寄存器的 JOP 链可能更理想——也就是说,其中可能包含“更容易”使用的 gadget。所以我们喜欢提供多种选择。默认情况下,JOP ROCKET 会为每个目标生成五条链,因此如果某一条有问题,你或许还有其他的可以检查。此外,即使没有找到理想的调度器 gadget,JOP ROCKET 仍会生成这些链,因为总会有替代方案或双 gadget 调度器。(JOP ROCKET 能找到双 gadget 调度器,但目前并未将其纳入 JOP 链生成中。)所以回到这个问题上来,JOP ROCKET 会尽量提供大量选项,由用户自行评估,判断哪一条最理想或最容易使用。

Q: JOP ROCKET 在自动 JOP 链生成方面没有给我好的结果。这是为什么?

A: 在某些情况下,可能存在一些 bug,但同样重要的是要记住,自动 JOP 链生成依赖于你正在使用多个栈枢轴这一前提(参见相关演讲和论文)。你必须提供所需的枢轴量(pivot amount),因为它只会基于默认值生成结果。也许存在一个非常出色的栈枢轴,但因为你设置的范围不够而错过了它。因此,你绝对应该计算可接受的栈枢轴范围,并提供最小值和最大值。你之后随时可以通过填充(padding)进行调整——并不需要非常精确。

Q: 在编译器中是否存在与 JOP 相关的“漏洞”?

A: 实际上,有的。对于 Visual Studio 2015,我们发现在 Developer Prompt 下编译的所有内容中,总是存在几个非常理想的调度器 gadget!我曾打算在某次演讲中详细说明这一点,但因时间原因被删掉了。我可能会在稍后单独补充这部分内容。坏消息是,我们评估了截至大约一年前 Visual Studio 其他版本、其他年份生成的所有二进制文件,并没有看到这种情况再次出现。虽然拥有出色的调度器 gadget 很不错,但正如其他地方所述,借助我们引入的新颖双 gadget 调度器,这些并不是必需的。另外,这实际上并不算漏洞,而只是一种确保 JOP 易于使用的方式,前提是确实存在某个真实的漏洞。

Q: JOP ROCKET 是一个独立工具吗?它能与调试器一起使用吗?

A: 是的,它是一个独立的静态分析工具;不,它不能像 Mona 那样与调试器集成。JOP ROCKET 中有一个选项可以搜索它能够找到的 DLL,它也可以在这些 DLL 中进行搜索,不过显然大多数系统 Windows DLL 会因缓解措施而无法使用。你可以让 JOP ROCKET 根据缓解措施来排除或包含某些模块。由于它是静态分析,尽管它可以选择性地搜索 DLL,但它可能会遗漏一些未在 IAT 中找到或 JOP ROCKET 难以确定其位置的 DLL。这是静态分析的固有限制。默认情况下,JOP ROCKET 只搜索镜像本身,即 .exe,而不搜索 DLL,以节省时间。如果你要分析某个二进制文件并查看非系统 DLL,那么该应用程序必须已安装,并且你应提供其路径。如果你不关心 DLL,那么无需安装相关二进制文件。

Q: 您如何评价以下言论:“JOP ROCKET 是 [Bri19] 于 2019 年发布的一个工具,声称能以全自动方式生成完整的 JOP 链。经过更仔细的检查,我们可以看到其技术的任何真实世界用例都由混合的 ROP 和 JOP 链组成,其中只有一小部分结果由纯 JMP Gadget 组成,而其余部分则由以 RET 指令结尾的 Gadget 组成,这些 gadget 是 JOP 链初始化所需的。”

A: 遗憾的是,上述言论反映出对 JOP 的理解不够深入。JOP 使用调度器 gadget 范式,这需要调度表和调度器 gadget。调度器 gadget 的地址和调度表的地址必须加载到各自的寄存器中,才能完成 JOP 的初始化。虽然这也可以通过 JOP 来实现,但为了兼容性,我们使用两个 pop 类型的 ROP gadget 来完成。因此,在完成仅由两个 ROP gadget 组成的初始化之后,不会再使用额外的 ROP gadget。所使用的 JOP gadget 数量可以从一个到几十个不等,具体取决于用户提供的输入。这里的问题不在于工具本身,而在于对工具和 JOP 的误解。如果你提供适当的输入,JOP ROCKET 确实能够提供适用于真实世界应用的漏洞利用。事实上,作者之前讲授的《高级软件漏洞利用》课程就使用了该工具,要求学生使用 JOP ROCKET 创建不同的 JOP 漏洞利用。令人失望的是,上述言论出现在学术研究中,因为每条 JOP 链最多只使用了两个 ROP gadget。我们已知的 Exploit_DB 上唯一的真实世界 JOP 漏洞利用出自我们中的一员 Austin Babcock,正如他在 2021 年阿姆斯特丹 Hack in the Box 会议上所解释的那样,他的漏洞利用与 JOP ROCKET 的发现高度吻合。在大多数实际情况下,使用两个 ROP gadget 进行初始化并不会带来实质区别。有时,某个二进制文件可能没有合适的 JOP gadget,能够以符合调度器 gadget 范式的方式完成 JOP 初始化。我们宁愿让 JOP 在尽可能多的二进制文件上可行,也不愿因追求 100% 纯 JOP 而限制其应用。毕竟,JOP 最大的限制之一就是 JOP gadget 不足。写于 2024 年的今天,JOP ROCKET 已不再有积极的更新,而在任何可能的新版本中——它将更加先进,并以更新得多的 ROP ROCKET 为蓝本——很可能会提供纯 JOP 的选项。

下载工具