Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- '''
- On nous donne une image au format PNG qui montre une carte d'un chemin sur une île.
- Le titre est "Red_path_is_Insane.png", le chemin de la carte étant lui-même rouge on peut déduire que l'on nous invite à nous concentrer sur le chemin de la carte... Eh bien pourquoi pas, car c'est un premier indice dans la résolution de ce challenge. Nous reviendrons sur ce point un peu plus loins.
- 1-
- Tentons d'en savoir plus sur l'image:
- $ file Red_path_is_Insane.png
- Red_path.png: PNG image data, 599 x 599, 8-bit/color RGB, non-interlaced
- $
- Une image PNG RGB des plus standards.
- 2-
- Continuons l'exercice:
- $ strings Red_path_is_Insane.png
- [...]
- C9/4
- }.?4
- ;w}S
- IEND
- LaSt But not least...
- $
- On peut remarquer une phrase en toute fin d'image, "LaSt But not least...".
- Il s'agit d'un indice, les majuscules sont spécifiquement choisies afin d'attirer notre attention sur l'accronyme L.S.B.
- Cela indique en réalité la méthode utilisée pour dissimuler notre flag dans l'image, qui est la populaire modification du Least Significant Bit.
- <i>
- Rapide présentation du LSB : Chaque pixel est composé de 3 couleurs primaires, ces couleurs primaires sont codées sur 1 octet, dans cet octet plus le bit est de poid fort (tendant vers 255) plus la couleur sera significative (Rouge, Vert, Bleu), tandis qu'à l'inverse plus le bit est de poid faible, plus la modification de la couleur du pixel sera légère voir même invisible à l'oeil nu.
- L'idée est donc de jouer avec ces "LSB" afin de dissimuler un message codé dans l'image.
- </i>
- 3-
- À partir de là nous pouvons faire le nécessaire afin d'identifier l'endroit où est situé le flag dans l'image.
- Celui-ci n'est pas flagrant mais reste visualisable de 2 manières différentes :
- a) À l'aveugle:
- À défaut d'outils à notre disposition il est possible de situer la modification des LSB en utilisant les indices pour nous aider.
- Nous connaissons la méthode utilisée, et nous savons que le titre de l'image mentionne une couleur, le Rouge, et ce qui semble être un nom propre dû à l'initiale en majuscule "Insane".
- Dans un premier temps on peut tenter une extraction en nous focalisant sur le LSB de la couleur rouge de chaque pixel de gauche à droite en partant du coin haut-gauche ; Cependant nous n'obtiendrons rien de concluant.
- Coincé ? Eh bien c'est ici qu'intervient la carte et son fameux chemin rouge.
- Nous pouvons voir quelques noms de villes sur la carte, en faisant une recherche sur Google nous découvrons qu'il s'agit de l'île de la Réunion.
- "Red_path_is_Insane.png" mentionne à la fois le chemin rouge sur lequel se concentrer et le mot anglais "Insane" ou littéralement "Fou" : c'est le nom touristique attribué à la randonnée déssinée sur la carte.
- Toujours sur Google, nous pouvons faire une nouvelle recherche "randonnée fou Réunion", en cliquant sur image nous tentons de trouver un chemin similaire à notre carte, nous obtenons ainsi le nom du chemin : "La Diagonale des Fous".
- b) Avec outil:
- Stegsolve.jar
- L'outils va nous aider à passer en revu graphiquement et textuellement chaque calque de l'image, couleur par couleur, bit par bit.
- => Nous remarquons que pour le bit 0 de la couleur rouge, une ligne diagonale en pointillés est tracée en partant du coin haut gauche de l'image vers son opposé, en bas à droite.
- Outil disponible ici => https://github.com/zardus/ctf-tools/blob/master/stegsolve/install
- Conclusion intermédiaire : Le flag est inséré en diagonale dans l'image via la méthode LSB sur la couleur rouge.
- 4-
- Écriture de notre script permettant d'extraire le flag:
- $ ./resolution_Red_path.py
- [+] MSG extracted : . ... --. .. ..--.- ..... --... ...-- --. ....- -. ----- .-- .- .---- -.-�
- $
- Le flag est encodé en morse.
- 5-
- Décodage du flag via dcode.com, ou bien autres outils à la convenance de tout-un-chacun:
- ESGI_573G4N0WA1K
- ==================================================================
- Exemple de programme de résolution du challenge avec Python 2.7
- ==================================================================
- '''
- #!/usr/bin/python
- from binascii import unhexlify
- from sys import exit
- from PIL import Image
- # L'image a traiter
- _image = 'Red_path_is_Insane.png'
- try:
- _img = Image.open(_image)
- except:
- print "\nERROR : Cannot find any " + _image + " ... Quitting.\n"
- sys.exit(1)
- # Recuperation des dimensions de l'image
- _colonne,_ligne = _img.size
- # Variables d'extractions
- # _tmp : temporaire, va stoquer les bits au fur et a mesure jusqu'a atteindre la longueur d'un octet, puis se vider
- # _trtmt_extract : durable, va stoquer les caracteres finaux
- _tmp = ''
- _trtmt_extract = ''
- # Job de traitement
- for _coord in range(_colonne):
- # Recuperation du pixel rencontre (_coord est utilise en abscisse et ordonnee)
- _pixel = _img.getpixel((_coord,_coord))
- # On passe la valeur de la couleur rouge du pixel en binaire
- _rouge = bin(_pixel[0])
- # Recuperation du LSB, stoque dans _tmp
- _tmp += _rouge[-1]
- # Si _tmp est de longueur 8 alors on la passe en hexadecimal puis en ASCII, avant de concatener le resultat dans _trtmt_extract
- if len(_tmp) == 8:
- _trtmt_extract += binascii.unhexlify('%x' % int('0b' + _tmp, 2))
- _tmp = ''
- _img.close()
- print "[+] MSG extracted : " + _trtmt_extract
Advertisement
Add Comment
Please, Sign In to add comment