Cesium133

LSB_steg

Nov 6th, 2016
372
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 5.25 KB | None | 0 0
  1. '''
  2. On nous donne une image au format PNG qui montre une carte d'un chemin sur une île.
  3. 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.
  4.  
  5.  
  6. 1-
  7. Tentons d'en savoir plus sur l'image:
  8. $ file Red_path_is_Insane.png
  9. Red_path.png: PNG image data, 599 x 599, 8-bit/color RGB, non-interlaced
  10. $
  11. Une image PNG RGB des plus standards.
  12.  
  13.  
  14. 2-
  15. Continuons l'exercice:
  16. $ strings Red_path_is_Insane.png
  17. [...]
  18. C9/4
  19. }.?4
  20. ;w}S
  21. IEND
  22. LaSt But not least...
  23. $
  24. On peut remarquer une phrase en toute fin d'image, "LaSt But not least...".
  25. Il s'agit d'un indice, les majuscules sont spécifiquement choisies afin d'attirer notre attention sur l'accronyme L.S.B.
  26. 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.
  27. <i>
  28. 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.
  29. L'idée est donc de jouer avec ces "LSB" afin de dissimuler un message codé dans l'image.
  30. </i>
  31.  
  32.  
  33.  
  34. 3-
  35. À partir de là nous pouvons faire le nécessaire afin d'identifier l'endroit où est situé le flag dans l'image.
  36. Celui-ci n'est pas flagrant mais reste visualisable de 2 manières différentes :
  37.  
  38.     a) À l'aveugle:
  39.     À défaut d'outils à notre disposition il est possible de situer la modification des LSB en utilisant les indices pour nous aider.
  40.     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".
  41.     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.
  42.     Coincé ? Eh bien c'est ici qu'intervient la carte et son fameux chemin rouge.
  43.     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.
  44.     "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.
  45.     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".
  46.    
  47.  
  48.     b) Avec outil:
  49.     Stegsolve.jar
  50.     L'outils va nous aider à passer en revu graphiquement et textuellement chaque calque de l'image, couleur par couleur, bit par bit.
  51.     => 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.
  52.     Outil disponible ici => https://github.com/zardus/ctf-tools/blob/master/stegsolve/install
  53.  
  54. Conclusion intermédiaire : Le flag est inséré en diagonale dans l'image via la méthode LSB sur la couleur rouge.
  55.  
  56.  
  57. 4-
  58. Écriture de notre script permettant d'extraire le flag:
  59. $ ./resolution_Red_path.py
  60. [+] MSG extracted : . ... --. .. ..--.- ..... --... ...-- --. ....- -. ----- .-- .- .---- -.-�
  61. $
  62. Le flag est encodé en morse.
  63.  
  64. 5-
  65. Décodage du flag via dcode.com, ou bien autres outils à la convenance de tout-un-chacun:
  66.  
  67. ESGI_573G4N0WA1K
  68.  
  69.  
  70.  
  71. ==================================================================
  72. Exemple de programme de résolution du challenge avec Python 2.7
  73. ==================================================================
  74. '''
  75. #!/usr/bin/python
  76.  
  77. from binascii import unhexlify
  78. from sys import exit
  79. from PIL import Image
  80.  
  81. # L'image a traiter
  82. _image = 'Red_path_is_Insane.png'
  83. try:
  84.     _img = Image.open(_image)
  85. except:
  86.     print "\nERROR : Cannot find any " + _image + " ... Quitting.\n"
  87.     sys.exit(1)
  88.  
  89. # Recuperation des dimensions de l'image
  90. _colonne,_ligne = _img.size
  91. # Variables d'extractions
  92. # _tmp : temporaire, va stoquer les bits au fur et a mesure jusqu'a atteindre la longueur d'un octet, puis se vider
  93. # _trtmt_extract : durable, va stoquer les caracteres finaux
  94. _tmp = ''
  95. _trtmt_extract = ''
  96.  
  97. # Job de traitement
  98. for _coord in range(_colonne):
  99.     # Recuperation du pixel rencontre (_coord est utilise en abscisse et ordonnee)
  100.     _pixel = _img.getpixel((_coord,_coord))
  101.     # On passe la valeur de la couleur rouge du pixel en binaire
  102.     _rouge = bin(_pixel[0])
  103.     # Recuperation du LSB, stoque dans _tmp
  104.     _tmp += _rouge[-1]
  105.     # Si _tmp est de longueur 8 alors on la passe en hexadecimal puis en ASCII, avant de concatener le resultat dans _trtmt_extract
  106.     if len(_tmp) == 8:
  107.         _trtmt_extract += binascii.unhexlify('%x' % int('0b' + _tmp, 2))
  108.         _tmp = ''
  109.  
  110. _img.close()
  111.  
  112. print "[+] MSG extracted : " + _trtmt_extract
Advertisement
Add Comment
Please, Sign In to add comment