
注意:在 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 等)。
安装 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

如果 Python 没有自带 pip,请安装 pip。
你需要按照链接上的说明保存提供的脚本并运行它。如果遇到错误,请尝试使用"备用"(alternate)脚本。
如果 pip 仍然无法工作,请尝试将 "C:\python27\Scripts"(或你的相应目录)添加到你的 Path 系统变量中:

开始使用 pip 安装依赖项!
注意:使用 pip 安装应该在 Windows 终端中有效,但在 Cygwin 环境中可能无效。如果使用 Cygwin,你可能需要改从源代码安装。这可能是一个更耗时的过程,请参考各依赖项制造商的最新文档。
pip install capstone
pip install pefile2
你很可能已经随 Python 2.7 安装了 pefile,但这个版本很旧。
Pefile2 才是你需要的。
你可能需要 pip uninstall pefile 才能让程序使用 pefile2。
等等……本文件底部可以找到依赖项列表。如果尚未安装,每一项都必须安装。
以上两个很可能就是你唯一需要自己安装的。
许多依赖项已经随 Python 附带。要列出可用的模块,请打开一个提示符:

浏览列表,检查你是否拥有所有依赖项。对于没有的依赖项,请使用 pip 或通过源代码安装。
注意: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 时,有两种方法。第一种是简单地将可执行文件放在同一目录中并运行程序,将其作为参数,例如 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 换了个名字吗?