
Эта платформа позволяет пользователю обнаруживать JOP-гаджеты и может автоматизировать построение полной JOP-цепочки для обхода DEP. JOP ROCKET — это идеальное решение для jump-oriented программирования в Windows. JOP ROCKET также находит новый двухгаджетный диспетчер, который значительно расширяет возможности JOP.

ПРИМЕЧАНИЕ: В версии 2.15 мы представляем двухгаджетный диспетчер — это значительно расширяет возможности с диспетчерскими гаджетами. 26 мая 2021 года в версии 2.15 было добавлено множество оптимизаций и новых функций.
Обновление: 29 ноября 2021 г.: Я загрузил слайды для @Hack в Эр-Рияде, а также технический доклад (white paper) о JOP без шелл-кода. Тихое демо-видео, использованные в выступлении, можно найти здесь: https://www.youtube.com/playlist?list=PLynyJsHgQaJ3AfQGKVkeZJ9cWa7mIqDMV
Обновление: 1 декабря 2022 г.: Я добавил раздел «Вопросы и ответы» в конец этого GitHub-репозитория, который включает ссылки на ресурсы (выступления и статьи).
Текущая версия: 2.15
Инструмент Jump-oriented Programming Reversing Open Cyber Knowledge Expert Tool, или JOP ROCKET, предназначен для облегчения поиска JOP-гаджетов в среде x86 Windows. Этот инструмент был представлен на DEF CON 27, где он стал темой доклада доктора Брэмвелла Бризендайна и доктора Джоша Строшайна. Крупное обновление, которое находилось в разработке, было выпущено в сентябре 2020 года, с планами небольших обновлений в ближайшем будущем.
Пожалуйста, перейдите по адресу https://github.com/Bw3ll/JOP_ROCKET, чтобы загрузить этот инструмент.
Произошёл ряд крупных обновлений. Рекомендуется обновить любую версию, предшествующую 2.15, чтобы воспользоваться многочисленными обновлениями. Они включают автоматическую генерацию JOP-цепей, обнаружение новых типов гаджетов, новые типы диспетчерских гаджетов и двухгаджетные диспетчеры. JOP ROCKET также претерпел множество других важных изменений, направленных на повышение производительности и скорости.
JOP ROCKET — это программа на Python, использующая дизассемблерный движок Capstone, а также другие зависимости. Этот инструмент для эксплуатации программного обеспечения является полнофункциональным продуктом, предназначенным для облегчения Jump-oriented Programming. Предполагается, что он будет запускаться в Windows.
Информация об использовании в настоящее время недоступна, кроме той, что есть в меню справки. Создание JOP-эксплойтов непросто и требует тонкого понимания; здесь есть некоторые параллели с ROP, но и много отличий. Обратитесь к выступлению на DEF CON, чтобы увидеть краткую демонстрацию. https://www.youtube.com/watch?v=PMihX693mPE
Этот инструмент преподавался в Университете штата Дакота в докторской программе, в рамках курса CSC 848: Advanced Software Exploitation, самого сложного курса в программе. Студенты выполняли эксплойты, включавшие обход DEP и ASLR.
Благодарим Остина Бэбкока за помощь с различными вопросами, связанными с JOP ROCKET, включая его инструкции по установке. Он мастер JOP.
Мы загрузили архив здесь, JOP ROCKET challenge - toy binaries.zip, чтобы заинтересованные стороны могли протестировать и попрактиковаться в JOP на некоторых образцах игрушечных бинарных файлов с помощью JOP ROCKET. Сможете ли вы обойти Data Execution Prevention (DEP)? Это хорошо, если вы хотите попрактиковаться в JOP на бинарном файле, который, как вы знаете, гарантированно уязвим и содержит нужные гаджеты. Есть более лёгкая и более сложная версии одного и того же бинарного файла. Хотя JOP, вероятно, будет сложнее в первый раз, пока кто-то не освоится. Как только вы освоите JOP на этих бинарных файлах, вы можете попробовать его на некоторых реальных гаджетах, при условии, что в них достаточно гаджетов. Если вы используете парадигму диспетчерских гаджетов, имейте в виду, что вам действительно нужен диспетчерский гаджет. JOP также можно смешивать с ROP, используя JOP-гаджет, указывающий на RET, так что JMP EDX может иметь EDX, указывающий на RET. Это более полезно, если вам нужно всего один или два JOP-гаджета, чтобы заставить ROP работать. Бинарные файлы в архиве должны позволить вам использовать парадигму диспетчерских гаджетов несколькими разными способами!
С парадигмой диспетчерских гаджетов JOP вы можете на 100% исключить ROP, хотя проще всего начать с двух ROP-гаджетов, чтобы загрузить диспетчерскую таблицу и диспетчерский гаджет. Готовая JOP-цепь сделает это за вас автоматически, при условии, что они присутствуют. После этого может использоваться чистый JOP, с непрямыми переходами и непрямыми вызовами (JMP EBX, CALL EDX и т.д.).
Установите Python 2.7. Проще всего это сделать с сайта: https://www.python.org/download/releases/2.7/
Если у вас уже установлен Python 3, вам всё равно понадобится Python 2.7, так как инструмент не будет работать должным образом с Python 3.
Если у вас есть оба, вам нужно добавить специальный комментарий:
#!python2
в верхней части rocket.py. Затем запускайте с помощью «py rocket.py» вместо «python rocket.py». Это гарантирует, что программа будет запущена с использованием Python 2.7. В качестве альтернативы можно просто выполнить py -2 rocket.py

установите pip, если он ещё не включён в Python.
Вам нужно сохранить предоставленный скрипт и запустить его, как указано в инструкциях по ссылке. Если возникнет ошибка, попробуйте использовать «альтернативный» скрипт.
Если pip всё ещё не работает, попробуйте добавить «C:\python27\Scripts» (или ваш соответствующий каталог) в системную переменную Path:

Начните установку зависимостей с помощью pip!
Примечание: Установка с помощью pip должна работать в терминале Windows, но может не работать в среде Cygwin. Если вы используете Cygwin, возможно, потребуется устанавливать из исходного кода. Это может занять больше времени; обращайтесь к последней документации от различных разработчиков зависимостей.
pip install capstone
pip install pefile2
И т.д. Список зависимостей можно найти в конце этого документа. Каждая из них должна быть установлена, если ещё не установлена.
Две указанные выше зависимости, вероятно, единственные, которые вам нужно установить самостоятельно.
Многие зависимости уже входят в состав Python. Чтобы вывести список доступных модулей, откройте командную строку:

Просмотрите список и проверьте, есть ли у вас все зависимости. Те, которых нет, установите с помощью pip или из исходного кода.
Примечание: pywin32 используется для Win32file и Win32api
В одном каталоге у вас должны находиться все пять файлов: rocket.py, lists,py, checkIt.py, ui.py и stackpivot.py. Чтобы начать использовать инструмент, выполните в командной строке python rocket.py filename.exe, где filename.exe — программа, для которой вы хотите получить JOP-гаджеты или 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 рекомендуется использовать командную строку Windows. Примечание: использование 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 только с программой в локальном каталоге, он найдёт гаджеты только для самого исполняемого образа, то есть без 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.
Вот некоторые инструкции от Остина по переходу с 32-битного на 64-битный Python: Чтобы установить 64-битную версию python2.7, сначала убедитесь, что старая установка удалена. После установки 64-битной версии при импорте библиотек могут возникать ошибки, например "DLL load failed: %1 is not a valid Win32 application". Они возникают из-за того, что Python пытается загрузить ранее установленные 32-битные версии. Чтобы исправить эту проблему, используйте pip для удаления библиотеки. Если установлены и Python 2, и Python 3, убедитесь, что используется правильная версия pip, вызывая её как "py -2 -m pip ".
Исправить проблему для capstone просто:
py -2 -m pip uninstall capstone
py -2 -m pip install capstone
Ошибки, связанные с импортом win32api, относятся к pywin32. Удаление этой библиотеки сложнее, поскольку pip может не автоматизировать этот процесс. Возможно, её придётся удалить вручную, удалив файлы PyWin32 в ...\Python27\Lib\site-packages.
Затем выполните:
py -2 -m pip install pywin32
После этого завершите установку, выполнив ...\Python27\Scripts\pywin32_postinstall.py -install
Вопрос: Что такого особенного в JOP ROCKET?
О: JOP ROCKET находит все необходимые гаджеты, включая диспетчерский гаджет. Мне неизвестно о других инструментах, которые ищут диспетчерские гаджеты. Кроме того, он представляет новые типы гаджетов и инновации в JOP. JOP ROCKET также может генерировать полную JOP-цепь для обхода DEP, используя новую вариацию парадигмы диспетчерских гаджетов, включающую серию множественных перестановок стека (stack pivots). Реалистично говоря, было бы очень трудно выполнить JOP-эксплойт с использованием подхода диспетчерских гаджетов без JOP ROCKET. Есть некоторые другие ROP-инструменты, которые могут предоставлять более ограниченные JOP-гаджеты, но они в основном являются заглушками для будущей работы, и вы не смогли бы завершить JOP-эксплойт без некоторых гаджетов, найденных с помощью JOP ROCKET.
Вопрос: Кажется, я уже видел 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). Для каждой из них обычно есть технический доклад (white paper) и видео (для @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-эксплойта?
О: Остин опубликовал один на Exploit DB: https://www.exploit-db.com/exploits/49959
Вы можете увидеть видео о нём и его рассказ на нашей презентации HITB 2021. Этот реальный JOP-эксплойт представлял особые сложности, поэтому на него стоит посмотреть и изучить. Хотя Остин написал его вручную, на самом деле автоматическая генерация JOP-цепей для JOP ROCKET выполнила бы большую часть работы. (Всё равно потребовалась бы дополнительная специальная настройка для компенсации некоторых сложностей.) Это также пример нашей новой вариации подхода с диспетчерскими гаджетами, использующей серию множественных перестановок стека. Этот эксплойт был создан менее чем за день.
Вопрос: Сложно ли делать JOP?
О: Нет, не сложно, но он сильно отличается от ROP. В некоторых местах действуют иные «правила», которые могут быть не сразу очевидны. Мы подробно пишем о них в разных статьях или рассказываем в наших выступлениях. Что иногда может быть сложным, так это наличие достаточного количества гаджетов. Существуют разные стили JOP, и если вы пытаетесь использовать подход с диспетчерскими гаджетами — который позволяет выполнить полноценный JOP-эксплойт без ROP — то у вас обязательно должен быть диспетчерский гаджет.
Вопрос: Разве JOP — это не просто ROP под другим названием?
О: JOP очень гибкий. Может быть и так. Можно загрузить RET в JOP-гаджет, и тогда, например, каждый раз, когда вы делаете JMP EBX, это будет эквивалентно RET. В этом смысле вы можете использовать JOP просто как способ расширить ROP, и вам не нужен диспетчерский гаджет. Строить целый эксплойт таким образом было бы утомительно, хотя это возможно, если очень захотеть. Мы также пишем о других стилях JOP, хотя большая часть нашей работы сосредоточена на подходе с диспетчерскими гаджетами.
Вопрос: Что такое диспетчерский гаджет? Легко ли его найти? Что такое двухгаджетный диспетчер?
О: Это был относительно редкий гаджет, который не всегда легко найти; в некоторых бинарных файлах не было жизнеспособных диспетчерских гаджетов. Обратите внимание, что здесь используется прошедшее время. Мы представили альтернативные диспетчерские гаджеты и, что более важно, двухгаджетный диспетчер, о котором мы писали в статье HITB. Он берёт два распространённых гаджета и соединяет их в цепочку, поэтому диспетчерский гаджет больше не является редкостью. Один из требуемых гаджетов настолько распространён, что обычно существуют его вариации почти для всех регистров; другой тоже очень распространён, но не настолько. Впрочем, могут быть и другие практические ограничения: если вы используете двухгаджетный диспетчер, это займёт ещё один регистр. (При необходимости можно переключать диспетчерские гаджеты и используемые регистры во время эксплойта.)
Вопрос: Встроена ли двухгаджетная парадигма в автоматическую генерацию JOP-цепей JOP ROCKET?
О: Нет, не встроена. Автоматическая генерация JOP-цепей была трудоёмкой в создании, а концепцию двухгаджетного диспетчера я придумал уже после этого. Возможно, я попытаюсь добавить её когда-нибудь, но не в ближайшем будущем. Скорее всего, она была бы добавлена только при полной переработке JOP ROCKET. По умолчанию JOP ROCKET создаёт различные вариации JOP-цепей для всех доступных регистров, даже если традиционный диспетчерский гаджет не найден. Поэтому кому-то не составит большого труда добавить собственный двухгаджетный диспетчер. Правда, нужно будет обращать внимание на регистры, которые необходимо сохранять для двухгаджетного диспетчера, поскольку инструмент не будет делать это автоматически.
Вопрос: Я хочу попробовать создать свою собственную JOP-цепь. Могу ли я это сделать?
О: Конечно. Для учебных целей на GitHub доступен бинарный файл — в двух вариантах — с искусственно созданными JOP-гаджетами: простая и сложная версии. В сложной версии есть ограничения на нулевые байты. Вы можете попробовать сделать цепь без автоматической генерации JOP-цепей, проверив, сможете ли вы найти собственные гаджеты. Также можно попробовать с автоматической генерацией. При автоматической генерации JOP-цепей вам придётся проделать дополнительную работу при борьбе с нулевыми байтами. Полагаю, это может стать областью для будущей работы — автоматизировать хотя бы часть этого.
Вопрос: Почему JOP ROCKET использует старую версию Python? Собираетесь ли вы перейти на современный Python?
О: Он был создан несколько лет назад, и тогда у меня не было намерения когда-либо делиться им. Я отправил его на DEFCON изначально случайно. К сожалению, различия между современным и старым Python таковы, что изменить JOP ROCKET было бы весьма нетривиально, и есть много сложных функций, где эти различия играют роль. JOP ROCKET также очень большой, и я не обязательно помню навскидку все места, где потребуются изменения. Скорее всего, я бы сделал полную переработку JOP ROCKET, сделав его части гораздо более модульными и компактными, чем сейчас. Если бы я это сделал, я бы хотел добавить несколько новых функций, и мог бы реализовать некоторые очень интересные вещи. В ближайшем будущем таких планов нет, но это может произойти в ближайшие один-три года. Однако никогда не говори «никогда», потому что иногда я могу очень быстро переписать код. В течение этого времени я могу вносить и другие обновления в текущий JOP ROCKET, поскольку небольшие обновления проще, чем полная переработка.
Вопрос: Кто такие «мы»?
О: Создатель JOP ROCKET — доктор Брэмвелл Бризендайн. Изначально это было темой его докторской диссертации, но с тех пор проект значительно вырос и изменился. Один из его студентов, Остин Бэбкок, заинтересовался исследованиями JOP ещё будучи бакалавром и продолжал заниматься ими во время получения степени магистра компьютерных наук. В то время Остин был соавтором нескольких статей и содокладчиком на нескольких мероприятиях. Остин внёс важный вклад в понимание механики работы JOP. Позже он присоединился к JOP ROCKET в качестве контрибьютора, в основном внедряя оптимизации и улучшения кода. Остин создал несколько JOP-эксплойтов. Один из них есть на ExploitDB.
**Вопрос: Какие «новейшие» достижения в JOP вы сделали?**О: Что ж, есть диспетчер из двух гаджетов, что делает JOP возможным для множества бинарных файлов, поскольку диспетчерский гаджет больше не является чем-то малодоступным. Это огромно — ведь во многих случаях отсутствие подходящего диспетчерского гаджета было бы ограничением; теперь этого больше нет. Мы также представили несколько альтернативных одиночных диспетчерских гаджетов, хотя большинство из них, похоже, не являются общеупотребительными (за некоторые из них можно поблагодарить Эндрю Крамера). Мы также представили «JOP без шеллкода», который устраняет необходимость обхода DEP и включает функциональность шеллкода непосредственно в JOP. Мы немного делаем это на HITB и больше на @Hack 2021 (Black Hat MEA). @Hack не снимался на видео, хотя по нему есть очень подробная статья. Клип с его работой можно увидеть в некоторых беззвучных демо-видео для @Hack 2021: https://www.youtube.com/playlist?list=PLynyJsHgQaJ3AfQGKVkeZJ9cWa7mIqDMV . У меня было несколько студентов, которые приняли вызов JOP без шеллкода — это то, что может требовать большего мастерства и владения атаками с повторным использованием кода.
В: Работает ли JOP ROCKET с бинарными файлами Linux?
О: Нет, к сожалению, не работает.
В: Работает ли JOP ROCKET с 64-битными бинарными файлами?
О: Нет, пока нет.
В: Каков общий подход JOP?
О: Читайте наши статьи или смотрите наши выступления. Мы проделали огромную работу, расширяя возможности JOP. До нашего исследования документации по JOP практически не существовало, и мы создали множество новых практических техник для JOP.
В: Я академический исследователь и хочу сделать что-то с JOP, например статью или презентацию. Могу ли я связаться с вами?
О: Конечно, вы можете связаться с нами, если планируете статью или какой-то новый проект. Вы можете написать мне на bramwell.brizendine AT gmail . Я передам Остину, если ему будет интересно. Возможно, мы даже заинтересуемся сотрудничеством. Пожалуйста, цитируйте нас, если вы в той или иной форме используете наши исследования для JOP. Вероятно, самый практичный подход к исследованиям, связанным с JOP, — это создание защит или мер смягчения против JOP. С нами уже связывались.
В: Занимался ли кто-то ещё JOP?
О: Это не распространено, а до нашего первого выступления на DEFCON было крайне редко. Мы, безусловно, значительно повысили осведомлённость об этом. Я ранее преподавал это на докторском курсе Advanced Software Exploitation в течение трёх лет, так что десятки студентов создали JOP-эксплойты. Я не знаю, сколько людей делают это в реальном мире — конечно, теперь люди могут делать это с помощью JOP ROCKET. У меня также были разные студенты бакалавриата, которые делали JOP-эксплойты. Нет особой причины, по которой это должен быть именно докторант — подойдёт любой, кто уверенно владеет эксплуатацией и атаками с повторным использованием кода. С учётом количества наших выступлений и статей, а также таких инноваций, как диспетчер из двух гаджетов, нет причин, по которым человек, умело работающий с ROP, не смог бы освоить JOP.
В: Почему JOP ROCKET был необходим?
О: Без JOP ROCKET вы бы обнаружили лишь малую часть JOP-гаджетов, и они были бы разрозненны, так что поиск чего-либо был бы подобен поиску иголки в стоге сена. Многие реальные JOP-гаджеты — это непреднамеренные гаджеты, не встречающиеся естественным образом, поэтому, если бы вы не были каким-то очень преданным делу савантом и не создали собственные инструменты или скрипты, вы бы многое упустили, пытаясь сделать полноценный JOP-эксплойт без ROP-гаджетов. Есть также такие вещи, как диспетчерские гаджеты, которые вам пришлось бы каким-то образом магическим образом находить самостоятельно, даже в непреднамеренной форме. Есть веская причина, по которой JOP был очень редким и о нём редко говорили до нашей работы. Это не значит, что сейчас он стал обычным делом. До JOP ROCKET вам пришлось бы преодолеть несколько серьёзных проблем, чтобы написать эксплойт. Теперь с JOP ROCKET эти проблемы решены, и вы можете собрать собственный с помощью JOP-гаджетов или, возможно, адаптировать JOP-цепочку, созданную с помощью автоматической генерации JOP-цепочек.
В: Может ли JOP быть проще, чем ROP?
О: Вообще-то я слышал от некоторых студентов, что JOP проще, чем ROP, — и так может быть — при правильном гаджете и использовании нашего нового подхода к диспетчерскому гаджету с несколькими stack pivot. Обратите внимание: ключевое слово здесь — «может быть». Это верно только при особых обстоятельствах, например при отсутствии ограничений на нулевые байты и обилии stack pivot-гаджетов, а также при условии наличия валидного диспетчерского гаджета.
В: Для кого предназначен JOP?
О: Я думаю, в первую очередь для людей, которые хорошо владеют атаками с повторным использованием кода и хотят испытать себя, попробовав что-то передовое, — хотя не весь JOP обязательно должен быть «сложным». Если вы умеете делать JOP, это значок почёта. Если вы создали JOP-эксплойт, опубликуйте его на ExploitDB и сошлитесь на JOP ROCKET, чтобы повысить осведомлённость. JOP также может быть для тех, кто просто хочет избежать использования ROP — возможно, существует средство защиты, обнаруживающее ROP-гаджеты. JOP — это не ROP, и вы можете сделать полноценный JOP-эксплойт без единого ROP-гаджета.
В: Я запустил автоматическую генерацию JOP-цепочек, и она создала много разных цепочек для VirtualAlloc и VirtualAlloc. Почему их так много?
О: Я подхожу к JOP исходя из того, что определённые регистры будут содержать указатель на диспетчерский гаджет и указатель на таблицу диспетчеризации, так что эти регистры оказываются занятыми. Функциональные гаджеты (более похожие на обычные ROP-гаджеты) вызывают диспетчерский гаджет, который затем продвигает позицию в таблице диспетчеризации. Таким образом, JOP ROCKET создаёт разные цепочки, используя разные комбинации регистров. Некоторые регистры будут «зарезервированы» для диспетчерского гаджета и таблицы диспетчеризации, хотя при желании вы можете переключаться между ними сколько угодно. У некоторых регистров могут быть более предпочтительные JOP-цепочки — в том смысле, что в них, возможно, есть гаджеты, которые «проще» использовать. Поэтому мы предпочитаем предоставлять варианты. По умолчанию JOP ROCKET генерирует по пять для каждой, так что если с одной возникнет проблема, у вас, возможно, будут другие для рассмотрения. Кроме того, JOP ROCKET генерирует их, даже если желаемый диспетчерский гаджет не найден, поскольку всегда могут быть альтернативы или диспетчеры из двух гаджетов. (JOP ROCKET находит диспетчеры из двух гаджетов, но в настоящее время не включает их в генерацию JOP-цепочек.) Итак, возвращаясь к вопросу: JOP ROCKET старается предоставить множество вариантов, и пользователю решать, оценивать их и определять, какой из них наиболее желателен или проще всего в работе.
В: JOP ROCKET не даёт мне хороших результатов автоматической генерации JOP-цепочек. Почему так?
О: В некоторых случаях могут быть баги, но также важно помнить, что автоматическая генерация JOP-цепочек работает исходя из того, что вы используете несколько stack pivot (см. выступления и статьи). Вы должны указать желаемую величину pivot, поскольку результат генерируется только на основе значения по умолчанию. Может существовать выдающийся stack pivot, который очень велик, и вы можете его упустить, потому что он вне вашего диапазона. Поэтому вам обязательно нужно рассчитать диапазон допустимых stack pivot, указав минимум и максимум. Позже всё всегда можно скорректировать с помощью padding — точность не обязательна.
В: Есть ли какие-то «уязвимости» JOP в компиляторах?
О: Вообще-то, да: в VisualStudio 2015 все бинарные файлы, которые, как мы обнаружили, были скомпилированы с помощью Developer Prompt, содержали пару очень желательных диспетчерских гаджетов, которые присутствовали всегда! Я собирался включить подробную информацию об этом в одно выступление, но его сократили из-за нехватки времени. Возможно, я включу это отдельно позже. Плохая новость в том, что мы проверили все бинарные файлы, созданные другими выпусками Visual Studio за другие годы, вплоть до примерно года назад, и не увидели повторения этого. Хотя иметь отличные диспетчерские гаджеты приятно, они не обязательны, как описано в другом месте, благодаря новому диспетчеру из двух гаджетов, который мы представили. Кроме того, это на самом деле не уязвимость, а просто способ гарантировать, что JOP будет легко доступен, если существует какая-то настоящая уязвимость.
В: JOP ROCKET — это автономный инструмент? Работает ли он с отладчиком?
О: Да, это автономный инструмент, основанный на статическом анализе, и нет, его нельзя интегрировать с отладчиком типа Mona. В JOP ROCKET есть опция поиска по DLL-файлам, которые он может найти, и он может искать по ним, хотя, очевидно, большинство системных DLL Windows не будут пригодны из-за мер защиты. Вы можете настроить JOP ROCKET на исключение или включение на основе мер защиты. Поскольку это статический анализ, хотя он может опционально искать по DLL, он может пропустить некоторые из тех, что не найдены в IAT или чьё местоположение сложно определить JOP ROCKET. Это неотъемлемое ограничение статического анализа. По умолчанию JOP ROCKET ищет только по самому образу, т.е. по .exe, а не по DLL, чтобы сэкономить время. Если вы пытаетесь проанализировать бинарный файл и посмотреть на несистемные DLL, то соответствующее приложение должно быть установлено, и вы должны указать его путь. Если DLL вас не интересуют, то устанавливать бинарный файл не нужно.
В: Можете ли вы прокомментировать следующую цитату: «JOP ROCKET — это инструмент, опубликованный в 2019 году [Bri19], который, как утверждается, генерирует полные JOP-цепочки полностью автоматическим образом. При более внимательном рассмотрении видно, что любой реальный вариант использования его техники состоит из смешанной ROP- и JOP-цепочки, где лишь небольшая часть результата состоит из чистых JMP-гаджетов, а остальная часть — из гаджетов, оканчивающихся инструкцией RET, необходимых для настройки JOP-цепочки»?
О: К сожалению, вышеприведённое отражает плохое понимание JOP. JOP использует парадигму диспетчерского гаджета, которая требует таблицы диспетчеризации и диспетчерского гаджета. Адрес диспетчерского гаджета и таблицы диспетчеризации должны быть загружены в соответствующие регистры для настройки JOP. Хотя это можно было бы сделать через JOP, из соображений совместимости это делалось с помощью двух ROP-гаджетов с использованием pop. Таким образом, после этой инициализации, состоящей всего из двух ROP-гаджетов, дополнительные ROP-гаджеты не используются. Количество используемых JOP-гаджетов может варьироваться от одного до десятков в зависимости от входных данных, предоставленных пользователем. Проблема здесь не в инструменте, а в непонимании инструмента и JOP. JOP ROCKET действительно создаёт эксплойты, пригодные для реальных приложений, если вы предоставите соответствующие входные данные. Действительно, это использовалось в курсе Advanced Software Exploitation, который ранее вёл автор, и студенты должны были использовать JOP ROCKET для создания различных JOP-эксплойтов. Обидно, что вышеприведённые комментарии были сделаны в академическом исследовании, поскольку для каждой JOP-цепочки используется максимум два ROP-гаджета. Единственный известный нам реальный JOP-эксплойт на Exploit_DB — это эксплойт одного из нас, Остина Бэбкока, и, как он объяснил на Hack in the Box Amsterdam 2021, его эксплойт очень близко повторяет то, что нашёл JOP ROCKET. В большинстве практических случаев не имеет большого значения, используете ли вы два ROP-гаджета для настройки. Иногда могут не найтись подходящие JOP-гаджеты для бинарного файла в соответствии с парадигмой диспетчерского гаджета для настройки JOP. Мы предпочли бы, чтобы JOP был потенциально применим к каждому бинарному файлу, чем ограничивать его из желания иметь 100% чистый JOP. Одно из самых больших ограничений JOP, в конце концов, — это недостаток JOP-гаджетов. Пишу в 2024 году: в JOP ROCKET не вносятся активные обновления, и в любой возможной новой версии, которая была бы гораздо более продвинутой и созданной по образцу гораздо более нового ROP ROCKET, вероятно, была бы опция для чистого JOP.