Steg - Le soldat inconnu 2

NoBracketCTF-Qualif-2023 Nov 20, 2023

📜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

Tags