Cubicle Riddle
Dernière mise à jour
Cet article vous a-t-il été utile ?
Dernière mise à jour
Cet article vous a-t-il été utile ?
Catégorie: Misc Difficulté: easy Flag: HTB{r1ddle_m3_th1s_r1ddle_m3_th4t}
Navigate the haunting riddles that echo through the forest, for the Cubicle Riddle is no ordinary obstacle. The answers you seek lie within the whispers of the ancient trees and the unseen forces that govern this mystical forest. Will your faction decipher the enigma and claim the knowledge concealed within this challenge, or will the forest consume those who dare to unravel its secrets? The fate of your faction rests in you.
Ce challenge tourne sur un docker, disponible sur
On a accès à la partie du code source qui vérifie ce que l’on envoie. Dedans on voit la fonction check_answer
qui construit une fonction avec notre réponse et cette fonction doit retourner les mêmes valeurs que (min(self.num_list), max(self.num_list))
Concernant la fonction construct_answer
on remarque plusieurs choses :
Notre réponse est encadrée par co_code_start
et co_code_end
Une fonction est construite via CodeType où 18 arguments sont passés
En prenant la documentation de CodeType on voit qu’à chaque version de Python, le nombre de paramètre change. Et cela a son importance puisque chaque version compilera notre réponse différement. La plus grande difficulté ici était donc d’identifier que c’était du Python 3.11 grâce aux 18 arguments
Toujours avec la documentation, on comprend que :
Le premier argument (1
) correspond au nombre de paramètres de la fonction
("num_list", "min", "max", "num")
correspond aux variables locales
(None, self.max_int, self.min_int)
sont les constantes utilisées
Donc on a 1 paramètre, c’est num_list
puisque c’est le premier définit dans les variables locales. Sa valeur est None
Ensuite on a 3 variables déclarés dans le corps de la fonction : min
max
puis num
(définis dans cet ordre)
Si on transforme le début et la fin en instructions avec dis :
On interprête ce code comme
Il suffit donc de compléter cette fonction puis d’envoyer son co_code
sans les 8 premiers et 8 derniers octets sachant que l’on ne peut utiliser que la variable num
On voit qu’il y a juste un décalage, notre co_code
commence par \x97\x00
, il faut donc penser à les retirer en plus des 8 premiers