Cubicle Riddle

Catégorie: Misc Difficulté: easy Flag: HTB{r1ddle_m3_th1s_r1ddle_m3_th4t}

Challenge

3KB
Ouvrir

Description


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.

Analyse du code

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))

def check_answer(self, answer: bytes) -> bool:
        _answer_func: types.FunctionType = types.FunctionType(
            self._construct_answer(answer), {}
        )
        return _answer_func(self.num_list) == (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


Script de résolution

Mis à jour

Ce contenu vous a-t-il été utile ?