Closed xshill closed 4 years ago
Track simplifiée:
strings
dessus et qui te donne le flag. Ghidra pas nécessaire. ("blah\0flag\0"
?)strings
)puts("Is something missing?\0A function call maybe?")
. Il y a une fonction dedans qui encode un flag et qui est jamais appelée. (add deux arrays ensemble, puts
le résultat ASCII). Pas de static lib pour que le participant aille 20 fonctions à checker dedans max. (peut se faire avec http://www.asciitable.com/)\0
à la fin du string pourrait être utilisé dans une contrainte (il faut savoir que les strings en C finissent par un null byte), ça pourrait rendre confus le participant dans le cas où on ne spécifie pas la longueur du input. (peut être expliqué dans un hint, peut se faire avec CyberChef et d'autres outils en ligne)system("sleep 1")
). Il faut NOP ou modifier les paramètres de chaque fonction sleep pour les enlever ou NOP les appels, ou faire un LD_PRELOAD. À chaque itération, un array est xoré (XOR avec décalage) jusqu'à après 100 000 itérations où on obtient le résultat. looks nicer :D
--Émilio
On Sun, 5 Jul 2020 at 14:56, Alexandre-Xavier Labonté-Lamoureux < notifications@github.com> wrote:
Track simplifiée:
- Le typique binaire de base que tu fais strings dessus et qui te donne le flag. Ghidra pas nécessaire. ("blah\0flag\0"?)
- Le binaire vérifie un password, après le flag est décodé et sera imprimé à l'écran. (Tu peux voir le password dans la décompilation ou en faisant strings)
- Premier challenge qui demande Ghidra. Créer le flag à partir de strings sur la stack. (array de chars, on pige des ensembles de quatre chars pour construire le flag. On le print pas à l'écran). Le participant doit examiner la décompilation pour reconstruire le flag.
- Binaire avec un main qui contient seulement puts("Is something missing?\0A function call maybe?"). Il y a une fonction dedans qui encode un flag et qui est jamais appelée. (add deux arrays ensemble, puts le résultat ASCII). Pas de static lib pour que le participant aille 20 fonctions à checker dedans max. (peut se faire avec http://www.asciitable.com/)
- Un one-time pad qui compare un char à la fois. (peut se faire avec http://xor.pw/)
- Crackme. Jeu de contraintes avec des additions, soustractions, divisions, multiplications, shift, XOR, ROR/ROL. Il doit y avoir une seule string qui répondra aux contraintes. Le \0 à la fin du string pourrait être utilisé dans une contrainte (il faut savoir que les strings en C finissent par un null byte), ça pourrait rendre confus le participant dans le cas où on ne spécifie pas la longueur du input. (peut être expliqué dans un hint, peut se faire avec CyberChef et d'autres outils en ligne)
- Tooslow, premier challenge où le participant devra modifier le binaire. Il peut aussi faire un LD_PRELOAD (ça pourrait être un hint). Mersenne twister (C++) qui affiche des lignes d'un poème https://www.poetryfoundation.org/poems/48860/the-raven. Chaque ligne prend une seconde à afficher (sleep, usleep, nanosleep, system("sleep 1")). Il faut NOP ou modifier les paramètres de chaque fonction sleep pour les enlever ou NOP les appels, ou faire un LD_PRELOAD. À chaque itération, un array est xoré (XOR avec décalage) jusqu'à après 100 000 itérations où on obtient le résultat.
- Fonction de type CRC ou checksum qui calcule un hash (en hex) et qui fait plusieurs itérations. Le participant doit entrer la string hex qui est générée au runtime. (premier challenge qui nécessite GDB et Peda).
— You are receiving this because you are subscribed to this thread. Reply to this email directly, view it on GitHub https://github.com/UnitedCTF/UnitedCTF-2020/issues/3#issuecomment-653925469, or unsubscribe https://github.com/notifications/unsubscribe-auth/ADPMNLYBJVVUFCZKP7SFQWLR2DEFLANCNFSM4OPNFXCA .
Good. Je pense pas vraiment pouvoir faire plus facile sans que ça reste un défi. Si par exemple, résoudre un one-time pad est trop compliqué pour le participant, on pourrait lui faire faire le "1 byte XOR challenge" en premier pour qu'il se fasse une meilleure idée de ce que c'est.
Pour un participant qui ne sait pas programmer, le challenge 7 devrait être faisable avec des recherches Google et un peu de débrouillardise.
Outline des challenges que je prévois faire:
strings
dessus et qui te donne le flag. Ghidra pas nécessaire."blah\0flag\0"
?puts("Is something missing?")
(add deux arrays ensemble,puts
le résultat ASCII) S'assurer que la lib a un nombre raisonnable de fonctions (OpenSSH?).\0
à la fin du string pourrait être utilisé dans une contrainte (il faut savoir que les strings en C finissent par un null byte), ça pourrait rendre confus le participant dans le cas où on ne spécifie pas la longueur du input.system("sleep 1")
et/ou memfd de sleep qu'on exec). Il faut NOP ou modifier les paramètres de chaque fonction sleep pour les enlever ou NOP les appels. À chaque itération, un array est xoré (XOR avec décalage) jusqu'à après 100 000 itérations où on obtient le résultat. Pour les sleeps, on pourrait utiliser des pointeurs de fonction pour rendre la décompilation moins évidente ou des shellcodes. (memfd de sleep qu'on exec avec un syscall augmente la difficulté et peut rendre ça beaucoup plus intéressant, on peut aussi vérifier l'altération du binaire)Feedback is welcome of course :-)
Je vais commencer à programmer ça prochainement.