Lors des concours de hackers et des jeux CTF (Capture The Flag), des énigmes de stéganographie apparaissent parfois: on vous donne une image dans laquelle vous devez trouver un message caché . Le moyen le plus simple de masquer du texte dans une image PNG est probablement de l'écrire dans l'un des canaux de couleur ou dans le canal alpha (canal de transparence). Pour identifier ces «signets», il existe des outils spéciaux tels que stegsolve , pngcheck et stegdetect , parfois les candidats doivent bricoler manuellement des filtres dans GIMP ou Photoshop.
Cependant, les progrès ne s'arrêtent pas - et récemment, d'autres méthodes de masquage des données sont de plus en plus utilisées, par exemple le remplissage PNG. Voyons comment cela se fait.
Commençons par une petite introduction théorique aux parties "invisibles" de PNG.
Canal alpha
Lorsqu'une image est affichée sur un écran d'ordinateur, les couleurs sont créées en combinant des composants rouge, vert et bleu. Ces trois plans de couleur sont appelés canaux. Ils sont généralement écrits en RVB.
En plus de ces trois canaux, PNG peut avoir un quatrième canal appelé alpha (désigné par la lettre A) pour déterminer le niveau de transparence. L'image RGBA résultante détermine les couleurs visibles et le degré de transparence.
Dans la plupart des formats graphiques, le canal alpha est une valeur comprise entre 0% et 100% (ou 0 à 255 en octets). Une valeur de 0% (noir) indique un endroit sur l'image où la transparence totale devrait être - ici la valeur RVB est ignorée et l'arrière-plan sous l'image est entièrement visible. Une valeur alpha de 100% (blanc) signifie que les canaux RVB sont complètement opaques. Les valeurs intermédiaires déterminent le degré de fusion de l'arrière-plan avec la valeur de pixel RVB.
Dégradé
alpha PNG Les valeurs du dégradé alpha sont généralement utilisées pour fusionner une image sur une autre image ou page Web. Les dégradés alpha sont disponibles au format PNG, WebP, ICO, ICN et d'autres formats raster. Le format GIF ne prend en charge que le booléen (un pixel est transparent ou non).
Le canal alpha n'est qu'une des options pour placer du texte masqué. Passons au remplissage PNG pour écrire des données directement dans un fichier binaire.
Contenu PNG par colonnes
Le format PNG est assez simple . Chaque fichier commence par une signature standard de huit octets, ici des valeurs décimales
137 80 78 71 13 10 26 10
. Le premier octet est sélectionné en dehors de ASCII de sorte qu'aucun éditeur ne confondra accidentellement l'image avec un fichier texte. Les trois octets suivants correspondent aux lettres P, N, G. Puis un saut de ligne DOS (13 10), un marqueur de fin de fichier DOS (26) pour empêcher le programme de type d'imprimer toutes les ordures binaires, et un marqueur de nouvelle ligne Unix.
Après l'en-tête, les morceaux avec une structure standard commencent. Vient d'abord le bloc IHDR indiquant la largeur et la hauteur de l'image, l'espace colorimétrique, le nombre de bits par pixel, la méthode de compression, la méthode de filtrage et la présence / absence de codage entrelacé. Quatre octets sont alloués pour la largeur et la hauteur, un octet pour les autres paramètres.
Ceci est suivi d'un bloc tEXt facultatif avec des métadonnées textuelles, telles que le nom du programme qui a généré le fichier PNG. Vous pouvez écrire des informations en texte brut dans des blocs de texte.
IHDR et tEXt sont suivis de blocs IDAT avec des valeurs RVB ou RVBA compressées pour les pixels bitmap. Lors du rendu du PNG, il est traité par IHDR, un tampon est alloué en mémoire pour l'image, les données sont extraites du format compressé et écrites dans le tampon pixel par pixel. Le fichier PNG se termine par un bloc IEND.
À la fin de chaque bloc, il y a une somme de contrôle CRC pour ce bloc, qui est calculée à l'aide de l' algorithme standard .
Les images PNG contiennent généralement 8 ou 16 bits d'informations par canal RVB ou RGBA, c'est-à-dire que trois à huit octets par pixel sont émis. Dans ce format, tous les octets sont occupés par des informations utiles sur la couleur et la transparence, de sorte qu'à la fin de chaque ligne de l'image graphique, nous n'avons pas de place pour écrire des données arbitraires.
Mais pour les tâches de stéganographie, vous devez savoir que PNG prend également en charge une profondeur de couleur inférieure: 1 bit (2 couleurs), 2 bits (4 couleurs) et 4 bits (16 couleurs). Dans une telle situation, il s'avère que les informations sur plusieurs pixels sont stockées dans un octet. C'est là qu'apparaît la possibilité théorique d'un remplissage "horizontal" de PNG avec des données étrangères. Si la largeur de l'image en pixels n'est pas un multiple de huit, alors le dernier octet de la ligne contient des bits inutilisés, qui forment ensemble une "colonne de pixels" inutilisée.
Dans le cas d'une image 1 bit, il peut rester jusqu'à 7 bits libres à la fin de chaque ligne, qui ne seront pas traités par l'analyseur. Dans le cas d'une image à 2 bits, il y a jusqu'à 3 bits libres dans le dernier octet. Outil en ligne FotoForensicstrouve ces "colonnes de pixels" inutilisées dans les images PNG .
Cependant, les images PNG avec une faible profondeur de couleur sont très rares, cette méthode de stéganographie peut donc être considérée comme exotique. Si vous rencontrez une image PNG avec 2, 4 ou 16 couleurs, ce seul fait est suspect et peut lancer une vérification du remplissage PNG sur les colonnes.
Une question complètement différente est le remplissage du PNG en dehors des frontières de l'image. Il s'agit d'une méthode plus simple de stéganographie qui vous permet de masquer beaucoup plus d'informations dans l'image.
PNG - remplir au-delà des frontières de l'image
Le rembourrage post-pixel PNG est souvent utilisé dans divers jeux, puzzles et concours, pas seulement dans le piratage. Voici comment fonctionne cette méthode:
- Prenez une image PNG (avec n'importe quelle profondeur de couleur).
- .
- PNG, .
- hex-.
- IHDR. IHDR.
- IHDR — , — . c
00 00 01 9D
(413 ), ,00 00 01 7E
(382 ).
- CRC ( PNG CRC , IHDR), . CRC , PNG- IHDR.
.
Veuillez noter que les données secrètes sont restées au bas de l'image. La taille du fichier n'a pas changé: 335 906 octets. C'est juste que l'analyseur ne traite pas ces pixels maintenant - et le bas de l'image n'est pas affiché à l'écran.
Il est facile de deviner que dans la partie "secrète" de l'image, vous pouvez masquer non seulement une inscription textuelle, mais également des données arbitraires. Par exemple, nous pouvons y écrire une archive RAR protégée par mot de passe. L'image du message secret peut être publiée sur Habrastorage ou tout autre hébergement mutualisé. Le message ne sera reçu que par la personne avec laquelle vous avez préalablement convenu de la méthode de transfert des informations et convenu d'un mot de passe. De cette manière, les logiciels malveillants peuvent transférer la charge utile via Habr et d'autres services d'hébergement public.
La publicité
VDS pour l'hébergement de sites concerne notre épopée ! Tous les serveurs «prêts à l'emploi» sont protégés des attaques DDoS, installation automatique d'un panneau de contrôle VestaCP pratique. Mieux vaut l'essayer une fois;)