Steg - Le soldat inconnu 2
📜Scenario
En ouvrant la boîte du soldat inconnu, qui n'est plus si inconnu que ça, vous tombez sur une image. Selon la description, il s'agit d'une photo du soldat fraîchement enrôlé. Vous vous dites que cela serait un beau geste que de l'envoyer à sa famille en tant que dernier souvenir. Malheureusement, elle a été endommagée, essayée de la réparer avant de l'envoyer.
Auteur : Shaym
🔎Solve
L'objectif de ce challenge est de reconstruire une image png corrompue. Au vu des indices laissés, on conclut rapidement que les dimensions de l'image ont été supprimées ce qui la rend illisible.
$ pngcheck photo_de_moi.png
photo_de_moi.png invalid IHDR image dimensions (25231972x0)
ERROR: picture_of_me.png
On peut se renseigner sur les chunks PNG et notamment IDHR :
Ainsi le format du chunk est le suivant :
4 bytes : IDHR
4 bytes : widht
4 bytes : hight
5*1 byte : Useless here
Checksum CRC 32
Il existe un moyen de brute-force la taille de l'image en se basant sur le CRC32 : https://ctf-wiki.mahaloz.re/misc/picture/png/#ihdr
En utilisant le script suivant on peut trouver la hauteur et la largeur :
import os
import binascii
import struct
misc = open("photo_de_moi.png","rb").read()
for i in range(1000):
for j in range(1000):
data = misc[12:16] + struct.pack('>i',i)+ struct.pack('>i',j)+misc[24:29]
crc32 = binascii.crc32(data) & 0xffffffff
if crc32 == 0xf7389d88:
print(f"{hex(i)=}")
print(f"{hex(j)=}")
Les dimensions décimal -> hexadécimal :
- Largeur : 385 -> 181
- Hauteur : 612 -> 264
Sachant que les deux valeurs disposent d'un emplacement de 4 bits dans le chunk, on rajoute un 0 pour le padding.
Pour savoir où placer les dimensions de l'image voir le topic suivant sur stackoverflow.
En reconstruisant l'image (avec HexEdit par exemple).
On voit une belle photo avec le flag suivant : NBCTF{m0n_b3ll3_un1f0rm3}
WriteUp and Chall made by Shaym