Mi-aout, j'ai publié le tweet suivant :
Find the flag in this picture : https://t.co/HGXIkiM4IR
— Lemnet (@lemnet_fr) August 13, 2019
(I'll give hint if needed)
J'ai caché des données (un flag au format FLAG{[MD5]}) dans ce fichier : https://lemnet.fr/img/lena_std.jpg
Il s'agit d'une photo de Lena Söderberg, très utilisée comme image de test dans le traitement d'images.
L'idée étant de retrouver le flag.
Indice n°1
Structure d'un fichier JPG et commentaire
Les fichiers jpg sont toujours structurés de la même manière. Ils contiennent une suite de segments. Chaque segment commence par un marqueur. Les marqueurs commencent tous par l'octet 0xFF
suivi d'un autre octet qui indique le type de marqueur. Certains marqueurs ne contiennent que ces deux octets. Les autres sont suivis de deux octets qui indiquent la taille des données qui suivent (taille comprise).
Voici un tableau reprenant les principaux marqueurs :
Nom court | Marqueur | Données | Nom | Commentaires |
---|---|---|---|---|
SOI | 0xFF 0xD8 | - | Start Of Image | Début du fichier |
SOF0 | 0xFF 0xC0 | variable | Start Of Frame (baseline DCT) | Début d’une image codée par progressive DCT |
SOF2 | 0xFF 0xC2 | variable | Start Of Frame (progressive DCT) | Début d’une image codée par progressive DCT |
DHT | 0xFF 0xC4 | variable | Define Huffman Table(s) | Table(s) de Huffman |
DQT | 0xFF 0xDB | variable | Define Quantization Table(s) | Table(s) de quantification |
SOS | 0xFF 0xDA | variable | Start Of Scan | Commence un parcours de haut en bas de l’image |
APPn | 0xFF 0xEn | variable | Application-specific | Informations complémentaires (EXIF par exemple) |
COM | 0xFF 0xFE | variable | Comment | Commentaire |
EOI | 0xFF 0xD9 | - | End Of Image | Fin du fichier |
On remarque un commentaire dont le marqueur est 0xFF 0xFE
. Dans mon image, il est présent dès le début du fichier à l'offset 2:
ff d8 ff fe 00 3c 1f 8b 08 00 6d a4 52 5d 00 ff
05 40 b1 0d 80 00 0c 7a 09 16 9a 3e e1 a2 8b 4f
58 61 35 fe de 9c f7 71 7d 30 4b 80 e8 f7 69 76
14 8b 13 a1 ac 8c f0 2f 76 4f 48 eb 26 00 00 00
ff db 00 43 00 08 06 06 07 06 05 08 07 07 07 09
...
0x00 0x3C
, à l'offset 4, indiquent une taille de 60 octets. En retirant les deux octets de la taille, on obtient 58 octets et on peut extraire le commentaire :
1f 8b 08 00 6d a4 52 5d 00 ff 05 40 b1 0d 80 00 0c 7a 09 16 9a 3e e1 a2 8b 4f 58 61 35 fe de 9c f7 71 7d 30 4b 80 e8 f7 69 76 14 8b 13 a1 ac 8c f0 2f 76 4f 48 eb 26 00 00 00
Indice n°2
Gzip
C'est un algorithme de compression très largement rependu, notamment dans les échanges de données entre les navigateurs et les serveurs Web.
On remarque que le commentaire commence par les octets 1f 8b
. Il s'agit de la signature d'un fichier Gzip.
On peut donc tenter de décompresser le commentaire avec cet algorithme et on obtient :
SYNT{0q1760061qpn919r6rq61or607q6ro60}
Cela commence à ressembler au format du flag que l'on recherche.
Indice n°3
ROT13
Le ROT13 est un cas particulier du chiffre de César. Il s’agit d’un décalage de 13 caractères de chaque lettre. Son principal avantage réside dans le fait que le codage et le décodage se font exactement de la même manière.
En appliquant un ROT13 sur la chaine précédente on obtient le flag :
FLAG{0d1760061dca919e6ed61be607d6eb60}