
Este framework permite al usuario descubrir gadgets JOP y puede automatizar la construcción de una cadena JOP completa para evadir DEP. JOP ROCKET es la solución definitiva para la programación orientada a saltos en Windows. JOP ROCKET también encuentra el novedoso dispatcher de dos gadgets, lo que amplía enormemente lo que es posible con JOP.

NOTA: Con la 2.15, introducimos el dispatcher de dos gadgets--esto expande significativamente las posibilidades con los dispatcher gadgets. Se han añadido muchas optimizaciones y nuevas características adicionales con la 2.15 el 26 de mayo de 2021.
Actualización: 29 de noviembre de 2021: He subido las diapositivas de @Hack en Riad y también un white paper sobre JOP sin shellcode. Los videos de demostración sin audio utilizados en la charla se pueden encontrar aquí: https://www.youtube.com/playlist?list=PLynyJsHgQaJ3AfQGKVkeZJ9cWa7mIqDMV
Actualización: 1 de diciembre de 2022: He añadido una sección de preguntas y respuestas al final de este GitHub, que incluye enlaces a recursos (charlas y documentos).
Versión actual: 2.15
La herramienta Jump-oriented Programming Reversing Open Cyber Knowledge Expert Tool, o JOP ROCKET, es una herramienta diseñada para facilitar el descubrimiento de gadgets JOP en un entorno x86 Windows. Esta herramienta se presentó en DEF CON 27, donde fue el tema de una charla del Dr. Bramwell Brizendine y el Dr. Josh Stroschein. Una actualización importante que estaba en desarrollo fue lanzada en septiembre de 2020, con actualizaciones menores planificadas en el futuro cercano.
Por favor, navegue a https://github.com/Bw3ll/JOP_ROCKET para descargar esta herramienta.
Han ocurrido varias actualizaciones importantes. Se recomienda que cualquier versión anterior a la 2.15 sea actualizada para aprovechar las muchas actualizaciones. Estas incluyen la generación automática de cadenas JOP, el descubrimiento de nuevos tipos de gadgets, nuevos tipos de dispatcher gadgets y los dispatchers de dos gadgets. JOP ROCKET también ha experimentado muchos otros cambios importantes para mejorar y optimizar su rendimiento y velocidad.
JOP ROCKET es un programa en Python que utiliza el motor de desensamblado Capstone, así como otras dependencias. Esta herramienta de explotación de software es un artefacto con todas las funciones diseñado para facilitar la programación orientada a saltos. Está pensada para ejecutarse en Windows.
La información de uso no está disponible en este momento más allá de lo que aparece en el menú de ayuda. Construir exploits JOP no es sencillo y es muy matizado, con algunos paralelismos pero muchas diferencias con ROP. Consulte la charla de DEF CON para ver una breve demostración. https://www.youtube.com/watch?v=PMihX693mPE
Esta herramienta se ha enseñado en Dakota State University en el programa de doctorado, como parte de CSC 848: Advanced Software Exploitation, el curso más exigente del programa. Los estudiantes completaron exploits que incluían la evasión de DEP y ASLR.
Gracias a Austin Babcock por su ayuda con varios problemas relacionados con JOP ROCKET, incluidas sus instrucciones de instalación. Es un maestro de JOP.
Hemos subido un archivo aquí, JOP ROCKET challenge - toy binaries.zip, para permitir a las partes interesadas probar y practicar JOP en algunos binarios de juguete de muestra, usando JOP ROCKET. ¿Puedes evadir Data Execution Prevention (DEP)? Esto es bueno si quieres practicar JOP en un binario que sabes que es vulnerable con seguridad y que tiene los gadgets adecuados. Hay una versión más fácil y una más difícil del mismo binario. Aunque JOP probablemente será más difícil la primera vez, hasta que alguien le tome el truco. Una vez que domines JOP con estos binarios, puedes probarlo en algunos gadgets del mundo real, asumiendo que tengan suficientes gadgets. Si estás usando el paradigma de dispatcher gadget, ten en cuenta que sí necesitas un dispatcher gadget. JOP también es posible mezclado con ROP, usando un gadget JOP para apuntar a un RET, por lo que JMP EDX podría tener EDX apuntando a RET. Esto es más útil si solo necesitas uno o dos gadgets JOP para hacer que ROP funcione. ¡Los binarios en el archivo deberían permitirte usar el paradigma de dispatcher gadget de varias maneras diferentes!
Con el paradigma de dispatcher gadget de JOP, puedes eliminar ROP al 100%, aunque es más fácil comenzar con dos gadgets ROP, para cargar la tabla de despacho y el dispatcher gadget. La cadena JOP preconstruida hará esto automáticamente por ti, asumiendo que estén presentes. A partir de ahí, puede ser JOP puro, utilizando tanto saltos indirectos como llamadas indirectas (JMP EBX, CALL EDX, etc.).
Instala Python 2.7. La forma más fácil de hacerlo será desde el sitio web: https://www.python.org/download/releases/2.7/
Si ya tienes Python 3, igualmente necesitarás tener Python 2.7, ya que la herramienta no funcionará correctamente con Python 3.
Si tienes ambos, necesitarás añadir el comentario especial:
#!python2
en la parte superior de rocket.py. Luego ejecuta con "py rocket.py" en lugar de "python rocket.py". Esto asegurará que el programa se ejecute usando Python 2.7. Alternativamente, puedes simplemente hacer py -2 rocket.py

instala pip si no viene ya incluido con Python.
Tendrás que guardar el script proporcionado y ejecutarlo, según las instrucciones del enlace. Si encuentras un error, prueba a usar el script “alternativo”.
Si pip aún no funciona, intenta añadir "C:\python27\Scripts" (o tu directorio correspondiente) a la variable de sistema Path:

¡Comienza a instalar las dependencias con pip!
Nota: Las instalaciones con pip deberían funcionar usando la terminal de Windows, pero puede que no funcionen en un entorno Cygwin. Si usas Cygwin, es posible que necesites instalar desde el código fuente. Esto puede ser una tarea que requiere más tiempo, y se te remite a la documentación más reciente de los diferentes creadores de las dependencias.
pip install capstone
pip install pefile2
Probablemente ya tengas pefile instalado con Python 2.7, pero esta versión es antigua.
Pefile2 es lo que necesitas.
Puede que necesites pip uninstall pefile para conseguir que el programa use pefile2.
Etc... Se puede encontrar una lista de dependencias al final de este documento. Cada una debe instalarse, si no están ya instaladas.
Probablemente las dos anteriores sean las únicas que necesites instalar tú mismo.
Muchas de las dependencias ya vienen con Python. Para listar los módulos disponibles, abre un símbolo del sistema:

Revisa la lista y comprueba si tienes todas las dependencias. Para las que no tengas, instálalas con pip o mediante código fuente.
Nota: pywin32 se usa para Win32file y Win32api
Debes tener en un mismo directorio los cinco archivos: rocket.py, lists,py, checkIt.py, ui.py y stackpivot.py. Para comenzar a usar la herramienta, ejecuta en la línea de comandos: python rocket.py filename.exe -- siendo filename.exe el programa del que deseas obtener gadgets JOP o cadenas JOP.
Si estás recibiendo errores como "SyntaxError: Missing parentheses in call to 'print'", es probable que se esté ejecutando con Python 3. Intenta hacer la corrección descrita en el Paso 1 para que el programa use Python 2.
Los errores relacionados con “lists” o “ui” probablemente se deben a la ubicación de los archivos lists.py y ui.py. Asegúrate de que estos archivos estén en el mismo directorio que rocket.py.
Para utilizar esto en un entorno Cygwin, probablemente necesitarás instalar Capstone desde el código fuente. Hay varias formas de hacerlo, y la documentación de Capstone proporciona asistencia. Cygwin fue utilizado originalmente durante el desarrollo de la herramienta, aunque esto ya no es así. JOP ROCKET v2.0 no está probado en Cygwin, y el símbolo del sistema es el uso recomendado de JOP ROCKET. Nota: el uso de Cygwin ya no está soportado explícitamente, y ya no se recomienda su uso con este programa.
Próximamente habrá información de uso más detallada. Consulta la charla de DEF CON 27 y el submenú de ayuda para asistencia.
Para comenzar, sin embargo, querrás tener los cinco archivos Python en el mismo directorio: rocket.py, ui.py, stackpivot.py, checkIt.py y lists.py. Luego ejecuta desde la línea de comandos. Puedes proporcionar un archivo local en el directorio de instalación, pero no podrá encontrar módulos/DLL. Para encontrarlos, el programa debe estar instalado, y la ruta absoluta de la aplicación puede suministrarse como entrada dentro de un archivo de texto que se puede proporcionar como argumento en la línea de comandos, p. ej.
python rocket.py input.txt
Dentro de input.txt tendríamos la ruta absoluta, p. ej. C:\rocket2\sample_binary.exe. Al proporcionar la ruta absoluta, podrás extraer también los módulos a escanear, si así lo deseas. Si quieres usar JOP ROCKET solo con el programa en el directorio local, solo encontrará gadgets para el ejecutable de la imagen en sí, es decir, sin DLL. Para usarlo de esa manera, usa la siguiente sintaxis:
python rocket.py sample_binary.exe
Si el ejecutable está en el mismo directorio, puedes usar JOP ROCKET de la manera descrita anteriormente.
Al cargar un ejecutable o DLL para analizarlo, hay dos enfoques. El primero es simplemente colocar el ejecutable en el mismo directorio y ejecutar el programa, usándolo como argumento, p. ej. python rocket.py binary.exe. Esto permitirá al usuario identificar y extraer muchos de los módulos del sistema. Sin embargo, no encontrará algunos de los binarios que no son del sistema. Para una cobertura completa, el usuario debe suministrar la ruta absoluta de la aplicación en un archivo de texto y usarla como entrada para ROCKET, p. ej. python rocket.py input.txt. Esto permitirá que ROCKET localice, extraiga y busque DLLs que no son del sistema asociadas con la aplicación objetivo. Por lo tanto, generalmente se recomienda suministrar el binario como entrada mediante un archivo de texto, ya que de lo contrario algunos DLLs pueden quedar excluidos. P. ej., python rocket.py binaryToScan.txt. El archivo binaryToScan.txt debe contener la ruta del binario, C:\Users\CoolPerson\Desktop\Instructions\targetBinary.exe
El Python de 32 bits fallará con binarios muy grandes. Para poder trabajar con ellos, debes usar Python de 64 bits.
Aquí hay algunas instrucciones de Austin sobre cómo pasar de Python de 32 bits a Python de 64 bits: para instalar la versión de 64 bits de python2.7, primero asegúrate de que la instalación anterior haya sido desinstalada. Después de instalar la versión de 64 bits, es posible que obtengas algunos errores al importar librerías como "DLL load failed: %1 is not a valid Win32 application". Estos ocurren porque Python está intentando cargar las versiones de 32 bits instaladas previamente. Para solucionar este problema, usa pip para desinstalar la librería. Si tanto Python 2 como Python 3 están instalados, asegúrate de usar la versión correcta de pip usándolo como "py -2 -m pip ".
Solucionar el problema de capstone es sencillo:
py -2 -m pip uninstall capstone
py -2 -m pip install capstone
Los errores relacionados con la importación de win32api están relacionados con pywin32. Desinstalar esto es más difícil, ya que pip puede no automatizar el proceso. Puede que tenga que desinstalarse manualmente eliminando los archivos PyWin32 dentro de ...\Python27\Lib\site-packages.
Luego, ejecuta:
py -2 -m pip install pywin32
Después, finaliza la instalación ejecutando ...\Python27\Scripts\pywin32_postinstall.py -install
P: ¿Qué tiene de especial JOP ROCKET?
R: JOP ROCKET encuentra todos los gadgets necesarios, incluido el dispatcher gadget. No conozco ninguna otra herramienta que busque dispatcher gadgets. Además, introduce nuevos tipos de gadgets e innovaciones en JOP. JOP ROCKET también puede generar una cadena JOP completa para evadir DEP utilizando una nueva variación del paradigma de dispatcher gadget que implica una serie de múltiples stack pivots. Realísticamente, sería muy difícil hacer un exploit JOP usando el enfoque de dispatcher gadget sin usar JOP ROCKET. Hay otras herramientas ROP que pueden proporcionar gadgets JOP más limitados, pero son en su mayoría marcadores de posición para trabajo futuro, y no podrías completar un exploit JOP sin algunos de los gadgets encontrados con JOP ROCKET.
P: Creo que vi JOP ROCKET en una charla antes. ¿Dónde fue?
R: Hemos presentado en varias conferencias: DEF CON 27 (2019), Wild West Hackin’ Fest (2020), Hack in the Box Amsterdam (2021), Black Hat Asia (2021) y @Hack (2021) (ahora renombrada Black Hat Middle East and Africa). Para cada una de ellas hay generalmente un white paper y un video (sin video para @Hack). También ha habido conferencias académicas. Cada charla y white paper es diferente, usualmente con al menos un 60-70% de contenido nuevo. Abordan muchos temas diferentes sobre JOP. No tenemos nuevas charlas planeadas y no haríamos otra a menos que tuviéramos algo nuevo que compartir, ya que no nos gusta repetirnos.
Aquí hay una lista limitada de algunos materiales sobre JOP. No es la misma charla o documento, ya que estamos en constante evolución y añadiendo nuevas innovaciones. Cada uno tiene contribuciones novedosas.
Video de DEF CON 27 2019: https://www.youtube.com/watch?v=PMihX693mPE
Video de Wild West Hackin’ Fest 2020: https://www.youtube.com/watch?v=ZQuxSSBfeHM
Video de Black Hat Asia: https://www.youtube.com/watch?v=NYgTw-h6GT8
Paper de Black Hat Asia: https://i.blackhat.com/asia-21/Thursday-Handouts/as-21-Brizendine-Babcock-Prebuilt-Jop-Chains-With-The-Jop-Rocket-wp.pdf
Video de Hack in the Box Amsterdam 2021: https://www.youtube.com/watch?v=MxIySXHvKyE
Paper de Hack in the Box Amsterdam 2021: http://magazine.hitb.org/wp-content/uploads/2021/06/HITBMag-Issue-12-June-2021-.pdf
Alta resolución: http://magazine.hitb.org/wp-content/uploads/2021/06/HITBMag-Issue-12-June-2021-Hi-res.pdf
Paper de @Hack 2021 (renombrada Black Hat Middle East and Africa): https://blackhatmea.com/content-hub/advanced-code-reuse-attacks-jump-oriented-programming
Si eres un investigador académico, por favor cita algunos de estos o también nuestros documentos académicos. :-)
P: ¿Cuál es un ejemplo de un exploit JOP del mundo real?
R: Austin publicó uno en Exploit DB: https://www.exploit-db.com/exploits/49959
Puedes ver un video de ello y de él hablando al respecto en la presentación de HITB 2021 que hicimos. Ese exploit JOP del mundo real presentó algunos desafíos especiales, por lo que es bueno verlo y estudiarlo. Aunque Austin lo escribió a mano, en realidad la generación automática de cadenas JOP de JOP ROCKET habría hecho la mayor parte del trabajo. (Aún así habría una configuración especial adicional para compensar algunos de los desafíos.) Este también es un ejemplo de nuestra novedosa variación del enfoque de dispatcher gadget, utilizando una serie de múltiples stack pivots. Este exploit tomó menos de un día en completarse.
P: ¿Es difícil hacer JOP?
R: No, no lo es, pero es muy diferente de ROP. Hay diferentes “reglas” en lugares que pueden no ser evidentes de inmediato. Escribimos extensamente sobre ellas en diferentes documentos o hablamos de ellas en diferentes charlas que hemos dado. Lo que a veces puede ser desafiante, sin embargo, es tener suficientes gadgets. Hay diferentes estilos de JOP, y si intentas hacer el enfoque de dispatcher gadget – que puede permitirte hacer un exploit JOP completo sin ROP – entonces debes tener un dispatcher gadget.
P: ¿No es JOP simplemente ROP con otro nombre?
R: JOP es muy fluido. Puede serlo. Podrías cargar un RET en un gadget JOP, y así cada vez que hagas JMP EBX, por ejemplo, eso sería equivalente al RET. En ese sentido, podrías usar JOP solo como una forma de extender ROP, y no necesitarías un dispatcher gadget. Parecería tedioso tener que construir un exploit completo de esa manera, aunque podrías hacerlo si realmente quisieras. También escribimos sobre otros estilos de JOP, aunque la mayor parte de nuestro trabajo se concentra en el enfoque de dispatcher gadget.
P: ¿Qué es un dispatcher gadget? ¿Se encuentra fácilmente? ¿Qué es un dispatcher de dos gadgets?
R: Ese era un gadget relativamente raro y no siempre fácil de encontrar; algunos binarios no tenían dispatcher gadgets viables. Observa que aquí se usa el tiempo pasado. Hemos introducido dispatcher gadgets alternativos y, más importante, un dispatcher de dos gadgets, sobre el cual hemos escrito en el paper de HITB. Esto toma dos gadgets comunes y los encadena, de modo que un dispatcher gadget ya no es raro. Uno de los gadgets requeridos es tan común que normalmente hay variaciones de él para casi todos los registros; y el otro es muy común, pero no tan común. Puede haber otras limitaciones prácticas, sin embargo, ya que si usas un dispatcher de dos gadgets, eso ocupará otro registro. (Es posible cambiar los dispatcher gadgets y los registros que se están usando durante un exploit, si se necesita flexibilidad adicional.)
P: ¿El paradigma de dos gadgets está integrado en la generación automática de cadenas JOP de JOP ROCKET?
R: No, no lo está. La generación automática de cadenas JOP fue costosa de crear, y creé el concepto de dispatcher de dos gadgets después de hacer esto. Puede que intente añadirlo en algún momento, pero no en el futuro inmediato. Más probablemente solo se añadiría si hiciera una reescritura completa de JOP ROCKET. Por defecto, JOP ROCKET creará diferentes variaciones de cadenas JOP para todos los registros disponibles, incluso si no se puede encontrar un dispatcher gadget tradicional. Por lo tanto, no llevaría demasiado esfuerzo que alguien añada su propio dispatcher de dos gadgets. Aunque habría que prestar atención a los registros que necesitan ser protegidos para el dispatcher de dos gadgets, ya que la herramienta no haría eso automáticamente.
P: Quiero intentar hacer mi propia cadena JOP. ¿Puedo hacerlo?
R: Claro, con fines de tutorial, tenemos un binario disponible en el GitHub – dos formas del mismo – con gadgets JOP creados artificialmente – tanto una versión fácil como una difícil. La versión difícil tiene limitaciones de byte nulo. Podrías intentar hacer una sin generación automática de cadenas JOP, viendo si puedes encontrar tus propios gadgets. También podrías intentarlo con la generación automática de cadenas JOP. Con la generación automática de cadenas JOP, tienes que hacer trabajo adicional al lidiar con bytes nulos. Supongo que eso podría ser un área para trabajo adicional en el futuro – automatizar algo de eso.
P: ¿Por qué JOP ROCKET usa un estilo más antiguo de Python? ¿Vas a cambiarlo a Python moderno?
R: Fue creado por primera vez hace varios años, y no tenía intención en ese momento de compartirlo jamás. Solo lo envié inicialmente a DEFCON por casualidad. Desafortunadamente, las diferencias entre el Python moderno y el antiguo son tales que sería muy no trivial cambiar JOP ROCKET, y hay muchas funciones complejas donde las diferencias entrarían en juego. JOP ROCKET también es muy grande, y no recuerdo necesariamente de memoria todos los lugares donde se necesitarían cambios. Más probable que no, haría una reescritura completa de JOP ROCKET, haciendo también que partes de él fueran mucho más modulares y compactas de lo que es actualmente. Hay varias características nuevas que me gustaría añadir si lo hiciera, y podría hacer algunas cosas muy interesantes si lo hiciera. No tengo planes en el futuro inmediato, pero podría ser en los próximos uno a tres años. Nunca digas nunca, sin embargo, ya que a veces puedo reescribir código muy rápidamente. Puede que haga otras actualizaciones al JOP ROCKET actual durante ese tiempo, ya que las actualizaciones más pequeñas son más fáciles que una reescritura completa.
P: ¿Quiénes son “nosotros”?
R: El creador de JOP ROCKET es el Dr. Bramwell Brizendine. Esto fue originalmente el tema de su disertación doctoral, pero ha crecido y cambiado mucho desde entonces. Uno de sus estudiantes, Austin Babcock, se involucró en la investigación de JOP como estudiante de pregrado y continuó con ella a lo largo de su maestría en Ciencias de la Computación. Durante ese tiempo, Austin fue coautor de varios documentos y coponente en varios eventos. Austin ha hecho contribuciones importantes a la mecánica de cómo funciona JOP. Más tarde se unió como colaborador de JOP ROCKET, introduciendo principalmente optimizaciones y mejoras de código. Austin ha realizado varios exploits JOP. Uno está en ExploitDB.
**P: ¿Cuáles son las cosas más “nuevas” en JOP que han hecho?**A: Bueno, está el despachador de dos gadgets, que de ese modo hace posible el JOP con numerosos binarios, ya que el gadget despachador ya no es oscuro. Eso es enorme, porque en muchos casos esa falta de un gadget despachador válido habría sido una limitación—eso simplemente ya no es el caso. También introdujimos algunos gadgets despachadores únicos alternativos, aunque la mayoría no parecen ser comunes (Andrew Kramer puede ser acreditado por algunos de esos). También introdujimos el "JOP sin shellcode", que evita la necesidad de evadir el DEP e incorpora la funcionalidad de un shellcode directamente en un JOP. Hacemos una pequeña parte de eso en HITB y más en @Hack 2021 (Black Hat MEA). @Hack no fue filmado, aunque hay un artículo muy detallado al respecto. Un clip de ello en acción se puede ver en algunos de los videos de demostración sin sonido para @Hack 2021: https://www.youtube.com/playlist?list=PLynyJsHgQaJ3AfQGKVkeZJ9cWa7mIqDMV . He tenido algunos estudiantes que han aceptado el desafío del JOP sin shellcode—eso es algo que puede exigir mayor habilidad y dominio de los ataques de reutilización de código.
P: ¿Funciona JOP ROCKET con binarios de Linux?
R: No, desafortunadamente no funciona.
P: ¿Funciona JOP ROCKET con binarios de 64 bits?
R: No, no por ahora.
P: ¿Cuál es el enfoque general de JOP?
R: Lean nuestros artículos o vean nuestras charlas. Hicimos una enorme cantidad de trabajo en expandir lo que se puede hacer con JOP. Prácticamente no había documentación sobre JOP antes de nuestra investigación, y creamos muchas técnicas prácticas nuevas para JOP.
P: Soy un investigador académico y quiero hacer algo con JOP, como un artículo o una presentación. ¿Puedo contactarlos?
R: Claro, pueden contactarnos si planean hacer un artículo o algún proyecto nuevo. Pueden escribirme a bramwell.brizendine AT gmail . Se lo puedo pasar a Austin si está interesado. Potencialmente incluso podríamos estar interesados en colaborar. Por favor, cítennos si usan nuestra investigación de alguna manera para JOP. Probablemente el enfoque más práctico para la investigación que involucra JOP sería introducir algunas defensas contra JOP o mitigaciones para ello. Hemos sido contactados antes.
P: ¿Otras personas han hecho JOP?
R: No es común, y antes de nuestra primera charla en DEFCON, era extremadamente raro. Ciertamente hemos aumentado mucho la conciencia sobre ello. Anteriormente lo he enseñado en un curso doctoral de Explotación Avanzada de Software durante tres años, así que docenas de estudiantes han creado exploits de JOP. No sé cuántas personas lo hacen en la naturaleza—ciertamente la gente puede hacerlo ahora con JOP ROCKET. También he tenido diferentes estudiantes de pregrado que han hecho exploits de JOP. No hay ninguna razón especial por la que tenga que ser un estudiante de doctorado—cualquiera con una competencia sólida en explotación y ataques de reutilización de código. Con la cantidad de charlas que hemos dado y artículos que hemos escrito—junto con innovaciones como el despachador de dos gadgets—no hay razón por la que alguien hábil con ROP no pudiera aprenderlo.
P: ¿Por qué fue necesario JOP ROCKET?
R: Sin JOP ROCKET, solo descubrirías una fracción de los gadgets de JOP, y estarían desorganizados, así que encontrar algo sería como buscar una aguja en un pajar. Muchos gadgets de JOP del mundo real son gadgets no intencionados que no ocurren de forma natural, así que a menos que fueras algún tipo de sabio muy dedicado y crearas tus propias herramientas o scripts, te perderías de mucho, si estuvieras tratando de hacer un exploit de JOP completo sin gadgets de ROP. También hay cosas como los gadgets despachadores, que de algún modo tendrías que encontrar mágicamente por tu cuenta, incluso en formas no intencionadas. Hay una buena razón por la que JOP era muy raro y rara vez se hablaba de él antes de nuestro trabajo. Eso no implica que sea común ahora. Antes de JOP ROCKET, tendrías varios problemas significativos que superar para escribir un exploit. Ahora con JOP ROCKET esos problemas están superados y puedes construir el tuyo propio con gadgets de JOP o quizás adaptar una cadena de JOP creada mediante la generación automática de cadenas de JOP.
P: ¿Puede JOP ser más fácil que ROP?
R: En realidad, he escuchado de algunos estudiantes que JOP es más fácil que ROP—y puede serlo—con el gadget adecuado y usando nuestro enfoque novedoso del gadget despachador con múltiples pivotes de pila. Noten que la palabra clave aquí es "puede ser." Esto es verdad solo bajo circunstancias especiales, como sin restricciones de bytes nulos y abundantes gadgets de pivote de pila, y asumiendo que hay un gadget despachador válido.
P: ¿Para quién es JOP?
R: Creo que principalmente es para personas que son hábiles en ataques de reutilización de código y quieren superarse a sí mismos, intentando algo de vanguardia—aunque no todo JOP necesariamente tiene que ser "difícil." Si puedes hacer JOP, eso es una insignia de honor para lucir. Si creas un exploit de JOP, ve y publícalo en ExploitDB y enlaza a JOP ROCKET para ayudar a aumentar la conciencia. JOP también puede ser para personas que simplemente quieren evitar el uso de ROP—podría haber una mitigación en su lugar para detectar gadgets de ROP. JOP no es ROP, y puedes hacer un exploit de JOP completo sin un solo gadget de ROP.
P: Hice la generación automática de cadenas de JOP, y creó muchas cadenas diferentes para VirtualAlloc y VirtualAlloc. ¿Por qué hay tantas?
R: Abordo JOP desde el punto de vista de que ciertos registros mantendrán un puntero al gadget despachador y un puntero a la tabla de despacho, así que esos registros están ocupados. Los gadgets funcionales (más similares a los gadgets normales de ROP) llamarán al gadget despachador, que entonces avanza la posición en la tabla de despacho. JOP ROCKET así crea diferentes cadenas usando diferentes combinaciones de registros. Algunos registros estarán "reservados" para el gadget despachador y la tabla de despacho, aunque si quieres, puedes cambiar de un lado a otro tanto como desees. Algunos registros tendrán cadenas de JOP más deseables—en el sentido de que quizás tenga gadgets que son "más fáciles" de usar. Así que nos gusta proporcionar opciones. Por defecto, JOP ROCKET generará cinco para cada uno, así que si hay un problema con uno, quizás tengas otros para mirar. Adicionalmente, JOP ROCKET generará estos incluso si un gadget despachador deseable no se encuentra, ya que siempre puede haber alternativas o despachadores de dos gadgets. (JOP ROCKET encuentra despachadores de dos gadgets, pero actualmente no los incorpora en la generación de cadenas de JOP.) Así que, volviendo a la pregunta, JOP ROCKET tratará de proporcionar muchas opciones, y depende del usuario evaluarlas y determinar cuál es la más deseable o fácil de trabajar.
P: JOP ROCKET no me está dando buenos resultados para la generación automática de cadenas de JOP. ¿Por qué es eso?
R: En algunos casos, podría haber algunos errores, pero también es importante recordar que la generación automática de cadenas de JOP funciona bajo la premisa de que estás usando múltiples pivotes de pila (vean las charlas, los artículos). Debes proporcionar la cantidad de pivote deseada, ya que solo generará resultados basados en el valor predeterminado. Podría haber un pivote de pila excepcional que sea muy grande, y podrías perderlo, porque está fuera de tu rango. Así que absolutamente deberías calcular el rango de pivotes de pila aceptables, proporcionando el mínimo y el máximo. Siempre puedes ajustar las cosas más tarde con relleno—no necesita ser preciso.
P: ¿Hay alguna "vulnerabilidad" con JOP en los compiladores?
R: En realidad, sí, con VisualStudio 2015, todo lo que encontramos compilado con Developer Prompt tenía un par de gadgets despachadores altamente deseables que siempre estaban presentes. Iba a incluir información detallada sobre esto en una charla, pero se recortó por tiempo. Puede que lo incluya por separado en un momento posterior. Las malas noticias son que evaluamos todos los binarios hechos por otras ediciones de Visual Studio para otros años, hasta hace aproximadamente un año, y no vimos que esto se repitiera. Si bien puede ser agradable tener excelentes gadgets despachadores, esos no son necesarios, como se describe en otra parte, con el novedoso despachador de dos gadgets que introdujimos. Adicionalmente, esto no es realmente una vulnerabilidad, sino solo una forma de garantizar que JOP sería fácilmente accesible, asumiendo que hubiera alguna vulnerabilidad verdadera.
P: ¿Es JOP ROCKET una herramienta independiente? ¿Funciona con un depurador?
R: Sí, es una herramienta independiente que es de análisis estático, y no, no puede integrarse con un depurador como Mona. Hay una opción dentro de JOP ROCKET para buscar a través de DLLs que pueda encontrar, y puede buscar a través de ellas, aunque obviamente la mayoría de las DLLs del sistema Windows no serán utilizables debido a las mitigaciones. Puedes hacer que JOP ROCKET excluya o incluya según las mitigaciones. Debido a que es análisis estático, aunque opcionalmente puede buscar a través de DLLs, puede perder algunas que no se encuentran en el IAT o cuyas ubicaciones no pueden ser determinadas fácilmente por JOP ROCKET. Esa es una limitación inherente del análisis estático. Por defecto, JOP ROCKET buscará solo a través de la imagen en sí, es decir, el .exe, no las DLLs, para ahorrar tiempo. Si estás tratando de analizar un binario y mirar DLLs que no son del sistema, entonces esa aplicación debe estar instalada, y debes proporcionar su ruta. Si no te preocupan las DLLs, entonces no necesitas instalar el binario.
P: ¿Puedes comentar sobre la siguiente cita: "JOP ROCKET es una herramienta publicada en 2019 por [Bri19], que afirma generar cadenas JOP completas de forma totalmente automática. Tras una mejor inspección, podemos ver que cualquier caso de uso en el mundo real de su técnica está compuesto por una cadena mixta de ROP y JOP, donde solo una pequeña parte del resultado está compuesta por puros JMP Gadgets, mientras que el resto está compuesto por Gadgets que terminan con la instrucción RET, necesarios para la configuración de la cadena JOP."
R: Desafortunadamente, lo anterior refleja una pobre comprensión del JOP. JOP usa el paradigma del gadget despachador, que requiere una tabla de despacho y un gadget despachador. La dirección del gadget despachador y la tabla de despacho deben cargarse en sus respectivos registros para configurar el JOP. Si bien esto podría lograrse mediante JOP, por propósitos de compatibilidad, esto se hizo mediante dos gadgets de ROP usando pop. Así, después de esta inicialización, que consiste en solo dos gadgets de ROP, no se usan gadgets de ROP adicionales. El número de gadgets de JOP usados puede variar de uno a docenas, dependiendo de la entrada proporcionada por el usuario. El problema aquí no es con la herramienta, sino con un malentendido de la herramienta y del JOP. JOP ROCKET de hecho proporciona exploits adecuados para aplicaciones del mundo real, si proporcionas la entrada apropiada. De hecho, esto fue usado en un curso de Explotación Avanzada de Software previamente enseñado por el autor, requiriendo que los estudiantes usaran JOP ROCKET para crear diferentes exploits de JOP. Es decepcionante que los comentarios anteriores se hayan hecho en investigación académica, ya que solo se usan un máximo de dos gadgets de ROP para cada cadena de JOP. El único exploit de JOP del mundo real del que tenemos conocimiento que está en Exploit_DB es de uno de nosotros, Austin Babcock, y como explicó en Hack in the Box Amsterdam 2021, su exploit refleja estrechamente lo que fue encontrado por JOP ROCKET. En la mayoría de los casos prácticos, realmente no importa si usas dos gadgets de ROP para la configuración. A veces puede que no haya gadgets de JOP apropiados para un binario, de una manera que se ajuste al paradigma del gadget despachador, para la configuración del JOP. Preferiríamos que JOP fuera factible en cada binario, potencialmente, en lugar de limitarlo por un deseo de tener JOP 100% puro. Una de las mayores limitaciones con JOP, después de todo, es con gadgets de JOP insuficientes. Escribiendo en 2024, no hay actualizaciones activas que se estén haciendo a JOP ROCKET, y en cualquier posible nueva versión, que sería mucho más avanzada y modelada según el mucho más nuevo ROP ROCKET, probablemente tendría una opción para JOP puro.