
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.

REMARQUE : Avec la version 2.15, nous introduisons le dispatcher à deux gadgets — cela élargit considérablement les possibilités avec les gadgets dispatcher. De nombreuses optimisations et de nouvelles fonctionnalités ont été ajoutées avec la version 2.15 le 26 mai 2021.
Mise à jour : 29 novembre 2021 : J'ai téléchargé les diapositives du @Hack à Riyad ainsi qu'un livre blanc sur le JOP sans shellcode. Les vidéos de démonstration silencieuses utilisées dans la présentation sont disponibles ici : https://www.youtube.com/playlist?list=PLynyJsHgQaJ3AfQGKVkeZJ9cWa7mIqDMV
Mise à jour : 1er décembre 2022 : J'ai ajouté une section Q & A à la fin de ce GitHub, qui comprend des liens vers des ressources (présentations et articles).
Version actuelle : 2.15
L'outil Jump-oriented Programming Reversing Open Cyber Knowledge Expert Tool, ou JOP ROCKET, est un outil conçu pour faciliter la découverte de gadgets JOP dans un environnement Windows x86. Cet outil a été présenté au DEF CON 27, où il a fait l'objet d'une conférence du Dr Bramwell Brizendine et du Dr Josh Stroschein. Une mise à jour majeure en cours de développement a été publiée en septembre 2020, avec des mises à jour mineures prévues dans un avenir proche.
Veuillez vous rendre sur https://github.com/Bw3ll/JOP_ROCKET pour télécharger cet outil.
Un certain nombre de mises à jour majeures ont eu lieu. Il est recommandé de mettre à jour toute version antérieure à 2.15 afin de profiter des nombreuses améliorations. Celles-ci incluent la génération automatique de chaînes JOP, la découverte de nouveaux types de gadgets, de nouveaux types de gadgets dispatcher et les dispatchers à deux gadgets. JOP ROCKET a également subi de nombreux autres changements importants pour améliorer et optimiser ses performances et sa rapidité.
JOP ROCKET est un programme Python utilisant le moteur de désassemblage Capstone ainsi que d'autres dépendances. Cet outil d'exploitation logicielle est un artefact complet conçu pour faciliter la programmation orientée saut. Il est destiné à être exécuté sous Windows.
Les informations d'utilisation ne sont pas disponibles pour le moment au-delà de ce qui se trouve dans le menu d'aide. La construction d'exploits JOP n'est pas simple et repose sur des nuances subtiles, avec certains parallèles mais de nombreuses différences par rapport au ROP. Veuillez vous référer à la présentation du DEF CON pour voir une brève démonstration. https://www.youtube.com/watch?v=PMihX693mPE
Cet outil a été enseigné à la Dakota State University dans le programme doctoral, dans le cadre du cours CSC 848 : Advanced Software Exploitation, le cours le plus exigeant du programme. Les étudiants ont réalisé des exploits incluant le contournement de DEP et d'ASLR.
Merci à Austin Babcock pour son aide sur divers problèmes liés à JOP ROCKET, y compris ses instructions d'installation. C'est un maître du JOP.
Nous avons téléchargé ici une archive, JOP ROCKET challenge - toy binaries.zip, pour permettre aux personnes intéressées de tester et de pratiquer le JOP sur des binaires jouets d'exemple, en utilisant JOP ROCKET. Pouvez-vous contourner la prévention de l'exécution des données (DEP) ? C'est utile si vous voulez vous entraîner au JOP sur un binaire dont vous savez qu'il est vulnérable à coup sûr et qu'il dispose des bons gadgets. Il existe une version plus facile et une version plus difficile du même binaire. Le JOP sera probablement plus difficile au début, jusqu'à ce qu'on prenne le coup de main. Une fois que vous maîtrisez le JOP avec ces binaires, vous pouvez l'essayer sur des gadgets du monde réel, à condition qu'ils disposent de suffisamment de gadgets. Si vous utilisez le paradigme du gadget dispatcher, gardez à l'esprit que vous avez besoin d'un gadget dispatcher. Le JOP est également possible en combinaison avec le ROP, en utilisant un gadget JOP pour pointer vers un RET, de sorte que JMP EDX puisse avoir EDX pointant vers RET. C'est plus utile si vous n'avez besoin que d'un ou deux gadgets JOP pour faire fonctionner le ROP. Les binaires de l'archive devraient vous permettre d'utiliser le paradigme du gadget dispatcher de plusieurs manières différentes !
Avec le paradigme du gadget dispatcher du JOP, vous pouvez éliminer à 100 % le ROP, même s'il est plus facile de commencer avec deux gadgets ROP pour charger la table de dispatch et le gadget dispatcher. La chaîne JOP préconstruite le fera automatiquement pour vous, à condition qu'ils soient présents. À partir de là, il peut s'agir de JOP pur, utilisant à la fois des sauts indirects et des appels indirects (JMP EBX, CALL EDX, etc.).
Installez Python 2.7. Le plus simple est de passer par le site web : https://www.python.org/download/releases/2.7/
Si vous avez déjà Python 3, vous aurez quand même besoin de Python 2.7 car l'outil ne fonctionnera pas correctement avec Python 3.
Si vous avez les deux, vous devrez ajouter le commentaire spécial :
#!python2
en haut de rocket.py. Exécutez ensuite avec « py rocket.py » plutôt que « python rocket.py ». Cela garantira que le programme est exécuté avec Python 2.7. Vous pouvez aussi simplement faire py -2 rocket.py

installez pip s'il n'est pas déjà inclus avec Python.
Vous devrez enregistrer le script fourni et l'exécuter, conformément aux instructions du lien. Si vous rencontrez une erreur, essayez d'utiliser le script « alternatif ».
Si pip ne fonctionne toujours pas, essayez d'ajouter « C:\python27\Scripts » (ou votre répertoire correspondant) à la variable système Path :

Commencez à installer les dépendances avec pip !
Remarque : Les installations avec pip devraient fonctionner avec le terminal Windows, mais peuvent ne pas fonctionner dans un environnement Cygwin. Si vous utilisez Cygwin, vous devrez peut-être installer à partir du code source à la place. Cela peut être plus long, et vous êtes invité à consulter la documentation la plus récente des différents créateurs des dépendances.
pip install capstone
pip install pefile2
Vous avez probablement déjà pefile installé avec Python 2.7, mais cette version est ancienne.
C'est Pefile2 qu'il vous faut.
Vous devrez peut-être faire pip uninstall pefile pour que le programme utilise pefile2.
Etc. Une liste des dépendances se trouve en bas de ce document. Chacune doit être installée si ce n'est pas déjà fait.
Les deux ci-dessus sont probablement les seules que vous aurez besoin d'installer vous-même.
Beaucoup de dépendances sont déjà fournies avec Python. Pour lister les modules disponibles, ouvrez une invite de commande :

Parcourez la liste et vérifiez si vous avez toutes les dépendances. Pour celles que vous n'avez pas, installez-les avec pip ou à partir du code source.
Remarque : pywin32 est utilisé pour Win32file et Win32api
Vous devez avoir dans un même répertoire les cinq fichiers : rocket.py, lists,py, checkIt.py, ui.py et stackpivot.py. Pour commencer à utiliser l'outil, exécutez en ligne de commande python rocket.py filename.exe — filename.exe étant le programme pour lequel vous souhaitez obtenir des gadgets JOP ou des chaînes JOP.
Si vous obtenez des erreurs comme « SyntaxError: Missing parentheses in call to 'print' », c'est probablement qu'il s'exécute avec Python 3. Essayez d'appliquer la correction décrite à l'étape 1 pour que le programme utilise Python 2.
Les erreurs liées à « lists » ou « ui » sont probablement causées par l'emplacement des fichiers lists.py et ui.py. Assurez-vous que ces fichiers se trouvent dans le même répertoire que rocket.py.
Pour utiliser cela dans un environnement Cygwin, vous aurez probablement besoin d'installer Capstone à partir du code source. Il existe différentes façons de le faire, et la documentation de Capstone fournit de l'aide. Cygwin était utilisé à l'origine lors du développement de l'outil, mais ce n'est plus le cas. JOP ROCKET v2.0 n'est pas testé sur Cygwin, et l'invite de commande est l'utilisation recommandée de JOP ROCKET. Remarque : l'utilisation de Cygwin n'est plus explicitement prise en charge, et il n'est plus recommandé de l'utiliser avec ce programme.
Des informations d'utilisation plus détaillées sont à venir. Reportez-vous à la présentation du DEF CON 27 et au sous-menu d'aide pour obtenir de l'assistance.
Pour commencer, vous devez avoir les cinq fichiers Python dans le même répertoire : rocket.py, ui.py, stackpivot.py, checkIt.py et lists.py. Exécutez ensuite depuis la ligne de commande. Vous pouvez fournir un fichier local dans le répertoire d'installation, mais il ne pourra pas trouver les modules/DLL. Pour les trouver, le programme doit être installé, et le chemin absolu vers l'application peut être fourni en entrée dans un fichier texte passé en argument sur la ligne de commande, par ex.
python rocket.py input.txt
Dans input.txt, on aurait le chemin absolu, par ex. C:\rocket2\sample_binary.exe. En fournissant le chemin absolu, vous pourrez également extraire les modules à analyser, si vous le souhaitez. Si vous voulez utiliser JOP ROCKET uniquement avec le programme dans le répertoire local, il ne trouvera des gadgets que pour l'exécutable image lui-même, c'est-à-dire aucune DLL. Pour l'utiliser de cette façon, utilisez la syntaxe suivante :
python rocket.py sample_binary.exe
Si l'exécutable est dans le même répertoire, vous pouvez utiliser JOP ROCKET de la manière décrite ci-dessus.
Lors du chargement d'un exécutable ou d'une DLL à analyser, deux approches sont possibles. La première consiste à placer l'exécutable dans le même répertoire et à exécuter le programme en l'utilisant comme argument, par ex. python rocket.py binary.exe. Cela permettra à l'utilisateur d'identifier et d'extraire de nombreux modules système. Cependant, certains binaires non système ne seront pas trouvés. Pour une couverture complète, l'utilisateur doit fournir le chemin absolu de l'application dans un fichier texte et l'utiliser comme entrée pour ROCKET, par ex. python rocket.py input.txt. Cela permettra ensuite à ROCKET de localiser, extraire et rechercher les DLL non système associées à l'application cible. Il est donc généralement recommandé de fournir le binaire en entrée via un fichier texte, sinon certaines DLL peuvent être exclues. Par ex., python rocket.py binaryToScan.txt. Le fichier binaryToScan.txt doit contenir le chemin du binaire, C:\Users\CoolPerson\Desktop\Instructions\targetBinary.exe
Le Python 32 bits aura du mal avec les très gros binaires. Pour pouvoir travailler avec ceux-ci, vous devez utiliser Python 64 bits.
Voici quelques instructions d'Austin pour passer de Python 32 bits à 64 bits : Pour installer la version 64 bits de python2.7, assurez-vous d'abord que l'ancienne installation a été désinstallée. Après l'installation de la version 64 bits, vous pouvez obtenir des erreurs lors de l'importation de bibliothèques telles que « DLL load failed: %1 is not a valid Win32 application ». Cela se produit parce que Python tente de charger les versions 32 bits précédemment installées. Pour résoudre ce problème, utilisez pip pour désinstaller la bibliothèque. Si Python 2 et 3 sont tous deux installés, assurez-vous d'utiliser la bonne version de pip en l'utilisant comme « py -2 -m pip ».
Corriger le problème pour capstone est simple :
py -2 -m pip uninstall capstone
py -2 -m pip install capstone
Les erreurs concernant l'importation de win32api sont liées à pywin32. Désinstaller celui-ci est plus difficile car pip peut ne pas automatiser le processus. Il peut être nécessaire de le désinstaller manuellement en supprimant les fichiers PyWin32 dans ...\Python27\Lib\site-packages.
Ensuite, exécutez :
py -2 -m pip install pywin32
Ensuite, terminez l'installation en exécutant ...\Python27\Scripts\pywin32_postinstall.py -install
Q : Qu'y a-t-il de si particulier à propos de JOP ROCKET ?
R : JOP ROCKET trouve tous les gadgets requis, y compris le gadget dispatcher. Je ne connais aucun autre outil qui recherche des gadgets dispatcher. De plus, il introduit de nouveaux types de gadgets et des innovations pour le JOP. JOP ROCKET peut également générer une chaîne JOP complète pour contourner la DEP en utilisant une nouvelle variante du paradigme du gadget dispatcher qui implique une série de multiples stack pivots. En pratique, il serait très difficile de réaliser un exploit JOP avec l'approche du gadget dispatcher sans utiliser JOP ROCKET. Il existe d'autres outils ROP qui peuvent fournir des gadgets JOP plus limités, mais ils sont surtout des espaces réservés pour de futurs travaux, et vous ne pourriez pas mener à bien un exploit JOP sans certains des gadgets trouvés avec JOP ROCKET.
Q : Je crois avoir déjà vu JOP ROCKET lors d'une présentation ? Où était-ce ?
R : Nous avons présenté lors de plusieurs conférences : DEF CON 27 (2019), Wild West Hackin' Fest (2020), Hack in the Box Amsterdam (2021), Black Hat Asia (2021) et @Hack (2021) (désormais renommé Black Hat Middle East and Africa). Pour chacune d'elles, il y a généralement un livre blanc et une vidéo (pas de vidéo pour @Hack). Il y a également eu des conférences académiques. Chaque présentation et chaque livre blanc est différent, avec généralement au moins 60 à 70 % de nouveau contenu. Ils abordent de nombreux sujets différents sur le JOP. Nous n'avons pas de nouvelles présentations prévues et nous n'en ferions pas une autre sans avoir quelque chose de nouveau à partager, car nous n'aimons pas nous répéter.
Voici une liste limitée de quelques ressources sur le JOP. Il ne s'agit pas de la même présentation ou du même article, car nous évoluons constamment et ajoutons de nouvelles innovations. Chacune comporte des contributions originales.
Vidéo DEF CON 27 2019 : https://www.youtube.com/watch?v=PMihX693mPE
Vidéo Wild West Hackin' Fest 2020 : https://www.youtube.com/watch?v=ZQuxSSBfeHM
Vidéo Black Hat Asia : https://www.youtube.com/watch?v=NYgTw-h6GT8
Article Black Hat Asia : https://i.blackhat.com/asia-21/Thursday-Handouts/as-21-Brizendine-Babcock-Prebuilt-Jop-Chains-With-The-Jop-Rocket-wp.pdf
Vidéo Hack in the Box Amsterdam 2021 : https://www.youtube.com/watch?v=MxIySXHvKyE
Article Hack in the Box Amsterdam 2021 : http://magazine.hitb.org/wp-content/uploads/2021/06/HITBMag-Issue-12-June-2021-.pdf
Haute résolution : http://magazine.hitb.org/wp-content/uploads/2021/06/HITBMag-Issue-12-June-2021-Hi-res.pdf
Article @Hack 2021 (renommé Black Hat Middle East and Africa) : https://blackhatmea.com/content-hub/advanced-code-reuse-attacks-jump-oriented-programming
Si vous êtes un chercheur académique, veuillez également citer certains de ces documents ou nos articles académiques. :-)
Q : Quel est un exemple d'exploit JOP dans le monde réel ?
R : Austin en a publié un sur Exploit DB : https://www.exploit-db.com/exploits/49959
Vous pouvez voir une vidéo de cet exploit et Austin en parler lors de la présentation HITB 2021 que nous avons faite. Cet exploit JOP du monde réel présentait des défis particuliers, il est donc bon de l'examiner et de l'étudier. Bien qu'Austin l'ait écrit à la main, en réalité la génération automatique de chaînes JOP de JOP ROCKET aurait fait l'essentiel du travail. (Il y aurait tout de même eu une configuration spéciale supplémentaire pour compenser certains défis.) C'est aussi un exemple de notre variante inédite de l'approche du gadget dispatcher, utilisant une série de multiples stack pivots. Cet exploit a été réalisé en moins d'une journée.
Q : Est-ce que le JOP est difficile à faire ?
R : Non, ce n'est pas difficile, mais c'est très différent du ROP. Il existe des « règles » différentes à certains endroits, qui peuvent ne pas être immédiatement évidentes. Nous en parlons longuement dans différents articles ou lors de différentes présentations que nous avons données. Ce qui peut parfois être difficile, cependant, c'est de disposer de suffisamment de gadgets. Il existe différents styles de JOP, et si vous tentez l'approche du gadget dispatcher – qui peut vous permettre de réaliser un exploit JOP complet sans ROP – alors vous devez avoir un gadget dispatcher.
Q : Le JOP n'est-il pas simplement du ROP sous un autre nom ?
R : Le JOP est très fluide. Il peut l'être. Vous pourriez charger un RET dans un gadget JOP, et ainsi chaque fois que vous faites JMP EBX, par exemple, cela équivaudrait au RET. En ce sens, vous pourriez utiliser le JOP simplement comme un moyen d'étendre le ROP, et vous n'auriez pas besoin d'un gadget dispatcher. Il semblerait fastidieux de devoir construire tout un exploit de cette façon, même si vous le pourriez si vous le vouliez vraiment. Nous écrivons aussi sur d'autres styles de JOP, bien que la plupart de nos travaux se concentrent sur l'approche du gadget dispatcher.
Q : Qu'est-ce qu'un gadget dispatcher ? Est-il facile à trouver ? Qu'est-ce qu'un dispatcher à deux gadgets ?
R : C'était un gadget relativement rare et pas toujours facile à trouver ; certains binaires n'avaient aucun gadget dispatcher viable. Remarquez que le passé est de mise ici. Nous avons introduit des gadgets dispatcher alternatifs et, plus important encore, un dispatcher à deux gadgets, dont nous avons parlé dans l'article HITB. Cela prend deux gadgets courants et les enchaîne, de sorte qu'un gadget dispatcher n'est plus rare. L'un des gadgets requis est si courant qu'il existe généralement des variantes pour presque tous les registres ; l'autre est très courant, mais pas aussi courant. Il peut cependant y avoir d'autres limitations pratiques, car si vous utilisez un dispatcher à deux gadgets, cela mobilisera un registre supplémentaire. (Il est possible de changer de gadgets dispatcher et de registres utilisés pendant un exploit, si une flexibilité supplémentaire est nécessaire.)
Q : Le paradigme à deux gadgets est-il intégré à la génération automatique de chaînes JOP de JOP ROCKET ?
R : Non, ce n'est pas le cas. La génération automatique de chaînes JOP a été longue à créer, et j'ai créé le concept de dispatcher à deux gadgets après cela. Je pourrais tenter de l'ajouter à un moment donné, mais pas dans un avenir immédiat. Plus probablement, il ne serait ajouté que si je faisais une réécriture complète de JOP ROCKET. Par défaut, JOP ROCKET créera différentes variantes de chaînes JOP pour tous les registres disponibles, même si un gadget dispatcher traditionnel ne peut pas être trouvé. Ainsi, il ne faudrait pas trop d'efforts à quelqu'un pour ajouter son propre dispatcher à deux gadgets. Il faudrait toutefois prêter attention aux registres à protéger pour le dispatcher à deux gadgets, car l'outil ne le ferait pas automatiquement.
Q : Je veux essayer de créer ma propre chaîne JOP. Puis-je le faire ?
R : Bien sûr, à des fins de tutoriel, nous avons un binaire disponible sur GitHub – sous deux formes – avec des gadgets JOP créés artificiellement – une version facile et une version difficile. La version difficile comporte des limitations liées aux octets nuls. Vous pourriez essayer d'en faire un sans génération automatique de chaîne JOP, pour voir si vous pouvez trouver vos propres gadgets. Vous pouvez aussi essayer avec la génération automatique de chaîne JOP. Avec la génération automatique de chaîne JOP, vous devez faire un travail supplémentaire pour gérer les octets nuls. Je suppose que cela pourrait être un domaine de travail supplémentaire à l'avenir – pour automatiser une partie de cela.
Q : Pourquoi JOP ROCKET utilise-t-il un style de Python plus ancien ? Allez-vous le faire passer au Python moderne ?
R : Il a été créé il y a plusieurs années, et je n'avais alors aucune intention de le partager. Je ne l'ai soumis à DEFCON au départ que par hasard. Malheureusement, les différences entre le Python moderne et l'ancien font qu'il serait très loin d'être trivial de modifier JOP ROCKET, et il existe de nombreuses fonctions complexes où ces différences entreraient en jeu. JOP ROCKET est également très volumineux, et je ne me souviens pas nécessairement de tous les endroits où des changements seraient nécessaires. Plus probablement qu'autrement, je ferais une réécriture complète de JOP ROCKET, en rendant également certaines parties beaucoup plus modulaires et compactes qu'elles ne le sont actuellement. J'aimerais ajouter plusieurs nouvelles fonctionnalités si je le faisais, et je pourrais faire des choses très intéressantes si je le faisais. Je n'ai pas de plans dans un avenir immédiat, mais cela pourrait se faire dans les un à trois prochaines années. Il ne faut jamais dire jamais, car parfois je peux réécrire du code très rapidement. Je pourrais faire d'autres mises à jour du JOP ROCKET actuel entre-temps, car les mises à jour plus petites sont plus faciles qu'une réécriture complète.
Q : Qui est « nous » ?
R : Le créateur de JOP ROCKET est le Dr Bramwell Brizendine. C'était à l'origine le sujet de sa thèse de doctorat, mais cela a beaucoup grandi et changé depuis. L'un de ses étudiants, Austin Babcock, s'est impliqué dans la recherche sur le JOP en tant qu'étudiant de premier cycle et a poursuivi dans cette voie jusqu'à son master en informatique. Pendant ce temps, Austin a été co-auteur de plusieurs articles et co-intervenant lors de plusieurs événements. Austin a apporté d'importantes contributions à la mécanique du fonctionnement du JOP. Il est ensuite devenu contributeur à JOP ROCKET, en introduisant principalement des optimisations et des améliorations de code. Austin a réalisé plusieurs exploits JOP. L'un d'eux est sur ExploitDB.
**Q : Quelles sont les choses les plus « récentes » que vous avez faites dans le domaine du JOP ?**R: Eh bien, il y a le dispatcher à deux gadgets, ce qui rend ainsi JOP possible avec de nombreux binaires, car le gadget dispatcher n'est plus obscur. C'est énorme - parce que dans de nombreux cas, ce manque de gadget dispatcher valide serait limitant--ce n'est tout simplement plus le cas. Nous avons également introduit quelques gadgets dispatcher uniques alternatifs, bien que la plupart ne semblent pas courants (Andrew Kramer peut être crédité pour certains d'entre eux). Nous avons également introduit le « JOP sans shellcode », qui évite le besoin de contourner DEP et intègre la fonctionnalité d'un shellcode directement dans un JOP. Nous en faisons un petit peu à HITB et davantage à @Hack 2021 (Black Hat MEA). @Hack n'a pas été filmé, bien qu'il existe un article très détaillé à ce sujet. Un extrait de son fonctionnement peut être vu dans certaines vidéos de démonstration sans son pour @Hack 2021 : https://www.youtube.com/playlist?list=PLynyJsHgQaJ3AfQGKVkeZJ9cWa7mIqDMV . J'ai eu quelques étudiants qui ont relevé le défi du JOP sans shellcode - c'est quelque chose qui peut exiger plus de compétences et une maîtrise des attaques par réutilisation de code.
Q: Est-ce que JOP ROCKET fonctionne avec les binaires Linux ?
R: Non, malheureusement pas.
Q: Est-ce que JOP ROCKET fonctionne avec les binaires 64 bits ?
R: Non, pas pour le moment.
Q: Quelle est l'approche générale de JOP ?
R: Lisez nos articles ou regardez nos présentations. Nous avons fait un travail considérable pour étendre ce qui peut être fait avec JOP. Il n'y avait pratiquement aucune documentation sur JOP avant nos recherches, et nous avons créé de nombreuses nouvelles techniques pratiques pour JOP.
Q: Je suis chercheur académique et je veux faire quelque chose avec JOP, comme un article ou une présentation. Puis-je vous contacter ?
R: Bien sûr, vous pouvez nous contacter si vous prévoyez de faire un article ou un nouveau projet. Vous pouvez me joindre à bramwell.brizendine AT gmail . Je peux transmettre à Austin s'il est intéressé. Nous pourrions même être intéressés à collaborer. Veuillez nous citer si vous utilisez nos recherches d'une manière ou d'une autre pour JOP. L'approche de recherche la plus pratique impliquant JOP serait probablement d'introduire des défenses ou des atténuations contre JOP. Nous avons déjà été contactés.
Q: D'autres personnes ont-elles fait du JOP ?
R: Ce n'est pas courant, et avant notre première présentation à DEFCON, c'était extrêmement rare. Nous avons certainement beaucoup sensibilisé à ce sujet. J'ai déjà enseigné cela dans un cours doctoral d'exploitation avancée de logiciels pendant trois ans, donc des dizaines d'étudiants ont créé des exploits JOP. Je ne sais pas combien de personnes le font dans la nature—certainement, les gens peuvent le faire maintenant avec JOP ROCKET. J'ai également eu différents étudiants de premier cycle qui ont fait des exploits JOP. Il n'y a aucune raison particulière pour que ce soit un doctorant - toute personne ayant de solides compétences en exploitation et en attaques de réutilisation de code. Avec le nombre de présentations que nous avons faites et d'articles que nous avons écrits – associés à des innovations telles que le dispatcher à deux gadgets – il n'y a aucune raison pour que quiconque compétent en ROP ne puisse pas s'y mettre.
Q: Pourquoi JOP ROCKET était-il nécessaire ?
R: Sans JOP ROCKET, vous ne découvririez qu'une fraction des gadgets JOP, et ils seraient désorganisés, donc trouver quelque chose serait comme chercher une aiguille dans une botte de foin. De nombreux gadgets JOP réels sont des gadgets non intentionnels qui ne se produisent pas naturellement, donc à moins d'être une sorte de savant très dévoué et de créer vos propres outils ou scripts, vous en manqueriez beaucoup, si vous essayiez de faire un exploit JOP complet sans gadgets ROP. Il y a aussi des choses comme les gadgets dispatcher, que vous devriez en quelque sorte trouver magiquement par vous-même, même sous des formes non intentionnelles. Il y a une bonne raison pour laquelle JOP était très rare et rarement mentionné avant nos travaux. Cela ne signifie pas qu'il est courant maintenant. Avant JOP ROCKET, vous auriez plusieurs problèmes importants à surmonter pour écrire un exploit. Maintenant, avec JOP ROCKET, ces problèmes sont surmontés et vous pouvez construire le vôtre avec des gadgets JOP ou peut-être adapter une chaîne JOP créée via la génération automatique de chaînes JOP.
Q: JOP peut-il être plus facile que ROP ?
R: En fait, j'ai entendu certains étudiants dire que JOP est plus facile que ROP – et cela peut l'être – avec le bon gadget et en utilisant notre approche novatrice du gadget dispatcher avec de multiples pivots de pile. Remarquez que le mot clé ici est « peut l'être ». Cela n'est vrai que dans des circonstances particulières, comme l'absence de restrictions d'octets nuls et une abondance de gadgets de pivot de pile, et en supposant qu'il existe un gadget dispatcher valide.
Q: À qui s'adresse JOP ?
R: Je pense qu'il s'adresse principalement aux personnes compétentes en attaques de réutilisation de code et qui veulent se dépasser, en tentant quelque chose de pointe – bien que tout JOP ne doive pas nécessairement être « difficile ». Si vous pouvez faire du JOP, c'est un insigne d'honneur à porter. Si vous créez un exploit JOP, allez le poster sur ExploitDB et liez JOP ROCKET pour aider à sensibiliser. JOP peut aussi être pour les personnes qui veulent simplement éviter l'utilisation de ROP – il pourrait y avoir une mitigation en place pour détecter les gadgets ROP. JOP n'est pas ROP, et vous pouvez faire un exploit JOP complet sans un seul gadget ROP.
Q: J'ai fait de la génération automatique de chaînes JOP, et elle a créé de nombreuses chaînes différentes pour VirtualAlloc et VirtualAlloc. Pourquoi y en a-t-il autant ?
R: J'aborde JOP du point de vue que certains registres contiendront un pointeur vers le gadget dispatcher et un pointeur vers la table de dispatch, donc ces registres sont occupés. Les gadgets fonctionnels (plus similaires aux gadgets ROP normaux) appelleront le gadget dispatcher, qui avance ensuite la position dans la table de dispatch. JOP ROCKET crée ainsi différentes chaînes en utilisant différentes combinaisons de registres. Certains registres seront « réservés » pour le gadget dispatcher et la table de dispatch, bien que si vous le souhaitez, vous puissiez alterner autant que vous voulez. Certains registres auront des chaînes JOP plus souhaitables - dans le sens où ils ont peut-être des gadgets « plus faciles » à utiliser. Nous aimons donc fournir des options. Par défaut, JOP ROCKET en générera cinq pour chaque, donc s'il y a un problème avec l'une, vous avez peut-être d'autres à examiner. De plus, JOP ROCKET les générera même si un gadget dispatcher souhaitable n'est pas trouvé, car il peut toujours y avoir des alternatives ou des dispatchers à deux gadgets. (JOP ROCKET trouve des dispatchers à deux gadgets, mais il ne les intègre pas actuellement dans la génération de chaînes JOP.) Ainsi, pour revenir à la question, JOP ROCKET essaiera de fournir beaucoup d'options, et c'est à l'utilisateur de les évaluer et de déterminer laquelle est la plus souhaitable ou la plus facile à utiliser.
Q: JOP ROCKET ne me donne pas de bons résultats pour la génération automatique de chaînes JOP. Pourquoi ?
R: Dans certains cas, il peut y avoir des bogues, mais il est également important de se rappeler que la génération automatique de chaînes JOP repose sur le fait que vous utilisez de multiples pivots de pile (voir les présentations, les articles). Vous devez fournir le montant de pivot souhaité, car elle ne générera des résultats que sur la base de la valeur par défaut. Il pourrait y avoir un pivot de pile exceptionnel très grand, et vous pourriez le manquer, car il est en dehors de votre plage. Vous devriez donc absolument calculer la plage de pivots de pile acceptables, en fournissant le minimum et le maximum. Vous pouvez toujours ajuster les choses plus tard avec du padding - cela n'a pas besoin d'être précis.
Q: Y a-t-il des « vulnérabilités » avec JOP dans les compilateurs ?
R: En fait, oui, avec VisualStudio 2015, tout ce que nous avons trouvé compilé avec Developer Prompt avait quelques gadgets dispatcher très souhaitables qui étaient toujours présents ! J'allais inclure des informations détaillées à ce sujet dans une présentation, mais cela a été coupé par manque de temps. Je pourrai l'inclure séparément plus tard. La mauvaise nouvelle, c'est que nous avons évalué tous les binaires créés par d'autres éditions de VisualStudio pour d'autres années, jusqu'à il y a environ un an, et nous n'avons pas vu cela se répéter. Bien qu'il puisse être agréable d'avoir d'excellents gadgets dispatcher, ceux-ci ne sont pas nécessaires, comme décrit ailleurs, avec le nouveau dispatcher à deux gadgets que nous avons introduit. De plus, ce n'est pas réellement une vulnérabilité, mais simplement un moyen de garantir que JOP serait facilement accessible, en supposant qu'il y ait une vraie vulnérabilité.
Q: JOP ROCKET est-il un outil autonome ? Fonctionne-t-il avec un débogueur ?
R: Oui, c'est un outil autonome qui fait de l'analyse statique, et non, il ne peut pas être intégré à un débogueur comme Mona. Il y a une option dans JOP ROCKET pour rechercher dans les DLL qu'il peut trouver, et il peut les parcourir, bien qu'évidemment la plupart des DLL système Windows ne seront pas utilisables en raison des mitigations. Vous pouvez faire en sorte que JOP ROCKET exclue ou inclue en fonction des mitigations. Parce qu'il s'agit d'analyse statique, bien qu'il puisse éventuellement rechercher dans les DLL, il peut en manquer certaines qui ne se trouvent pas dans l'IAT ou dont les emplacements ne peuvent pas être facilement déterminés par JOP ROCKET. C'est une limitation inhérente à l'analyse statique. Par défaut, JOP ROCKET ne recherchera que dans l'image elle-même, c'est-à-dire le .exe, et non les DLL, pour gagner du temps. Si vous essayez d'analyser un binaire et d'examiner des DLL non système, alors cette application doit être installée et vous devez fournir son chemin. Si les DLL ne vous concernent pas, vous n'avez pas besoin d'installer le binaire.
Q: Pouvez-vous commenter la citation suivante : « JOP ROCKET est un outil publié en 2019 par [Bri19], qui prétend générer des chaînes JOP complètes de manière entièrement automatisée. Après un examen plus approfondi, nous pouvons voir que tout cas d'utilisation réel de sa technique est composé d'un mélange de chaînes ROP et JOP, où seule une petite partie du résultat est composée de purs gadgets JMP, tandis que le reste est composé de gadgets qui se terminent par une instruction RET, nécessaire à la mise en place de la chaîne JOP. »
R: Malheureusement, ce qui précède reflète une mauvaise compréhension de JOP. JOP utilise le paradigme du gadget dispatcher, qui nécessite une table de dispatch et un gadget dispatcher. L'adresse du gadget dispatcher et celle de la table de dispatch doivent être chargées dans leurs registres respectifs pour mettre en place JOP. Bien que cela puisse être accompli via JOP, pour des raisons de compatibilité, cela a été fait via deux gadgets ROP utilisant pop. Ainsi, après cette initialisation, consistant en seulement deux gadgets ROP, aucun gadget ROP supplémentaire n'est utilisé. Le nombre de gadgets JOP utilisés peut varier de un à des dizaines, selon l'entrée fournie par l'utilisateur. Le problème ici ne vient pas de l'outil, mais d'une mauvaise compréhension de l'outil et de JOP. JOP ROCKET fournit effectivement des exploits adaptés à des applications réelles, si vous fournissez l'entrée appropriée. En effet, cela a été utilisé dans un cours d'exploitation avancée de logiciels précédemment enseigné par l'auteur, obligeant les étudiants à utiliser JOP ROCKET pour créer différents exploits JOP. Il est décevant que ces commentaires aient été faits dans le cadre de recherches académiques, car seulement un maximum de deux gadgets ROP sont utilisés pour chaque chaîne JOP. Le seul exploit JOP réel dont nous avons connaissance sur Exploit_DB est de l'un de nous, Austin Babcock, et comme il l'a expliqué à Hack in the Box Amsterdam 2021, son exploit reflète étroitement ce qui a été trouvé par JOP ROCKET. Dans la plupart des cas pratiques, cela ne change pas vraiment grand-chose si vous utilisez deux gadgets ROP pour la configuration. Parfois, il peut ne pas y avoir de gadgets JOP appropriés pour un binaire, d'une manière conforme au paradigme du gadget dispatcher, pour la configuration JOP. Nous préférons que JOP soit potentiellement réalisable sur chaque binaire, plutôt que de le limiter par souci d'avoir un JOP 100 % pur. L'une des plus grandes limitations de JOP, après tout, est le nombre insuffisant de gadgets JOP. En écrivant en 2024, aucune mise à jour active n'est apportée à JOP ROCKET, et dans toute éventuelle nouvelle version, qui serait beaucoup plus avancée et calquée sur le beaucoup plus récent ROP ROCKET, il y aurait probablement une option pour du JOP pur.