Este reto es muy interesante y curioso. Primero que todo, nos presentan un PNG que muestra sólo un mìnima parte de su contenido. Nuestra labor acá, como lo indica el título, es repararlo y posteriormente obtener la contraseña para pasar.
Acá se puede observar que la imagen sólo se ve hasta cierto punto, pero el resto no aparece. En algunos navegadores y/o visores, esa parte se ve negra o con transparencia, y en otros, sencillamente no se ve nada.
Bueno, el primer paso para empezar a “arreglar” este archivo es conocer el formato PNG. Asì que necesitamos documentarnos un poco.
PNG (Portable Network Graphics) es un formato muy conocido, bastante usado y de los más documentados en la red. Una de las mejores referencias sin duda alguna es:
- http://www.w3.org/TR/PNG/
Y otra que nos servirá mucho en este caso es:
- http://en.wikipedia.org/wiki/Portable_Network_Graphics
Puntualizando las cosas que necesitamos saber, tenemos los siguientes datos:
- Todo PNG inicia con la siguiente firma: 89 50 4E 47 0D 0A 1A 0A
- Los archivos multimedia poseen chunks los cuales son fragmentos de información.
- Este formato posee aprox. 18 tipos de chunks.
- El IDAT es el chunk que contiene la información de la imagen, es esencial y pueden ser 1 o más.
Todo chunk consiste de cuatro partes: tamaño (4 bytes), tipo de chunk (4 bytes), datos del chunk (bytes dados en tamaño), CRC (4 bytes)
Un poco más representativo este gráfico (Corresponde al inicio del archivo. Firma, y chunk IHDR):
Para calcular el tamaño de cada chunk se puede usar la calculadora en modo programación. Tomando como base la imagen de arriba, calcularemos el tamaño de IHDR, el cual está dado hexadecimalmente por “0D“. Eso nos da como resultado decimalmente: 13
En esta imagen, se puede observar cómo se calcula el CRC:
Para hacerlo, siempre se deben de tomar los bytes dados por el tamaño + los 4 bytes del chunk. En este caso, fueron los 17 bytes (13 bytes (OD) + 4 bytes IHDR).
Ya comprendida esta parte, podemos adentrarnos a analizar la imagen del reto y encontrar el error que evita que esta se muestre correctamente. Como ya sabemos, el chunk que contiene la información de la imagen es el IDAT, así que por simple lógica y sentido común es allí donde radica el error en este archivo.
Procedemos a buscar con Okteta (o cualquier otro Editor HEX) el chunk correspondiente. Al hacerlo, se puede observar que no hay un IDAT sino ¡SEIS!, así que nuestra labor es revisar cada uno… ¿Pero revisar qué? Como anteriormente he dicho, hay cuatro partes fundamentales en este fragmento de información, así que primero hay que comprobar que el tamaño esté bien indicado…
- 1er. IDAT – Offset: 0000:03A2
Bytes (HEX):
00 00 10 00 49 44 41 54
Siendo:
00 00 10 00 = Tamaño del Chunk – DEC (4096 bytes)
49 44 41 54 = IDAT
Listo, ya tenemos la primera parte. El tamaño -en teoría- de este chunk debe ser de 4096 bytes. Para combrobarlo, basta con posicionarnos en el segundo IDAT (Offset: 0000:23AE) y hacer una simple resta: 23AE-3A2 = 200C ~ 2000 (Se quita 0xC porque son chunks de 4 bytes. Al hacer esta resta tenemos en cuenta: 4 bytes del nombre del chunk, 4 bytes del CRC, 4 bytes del tamaño del siguiente chunk)…Lo que nos da un total de 8192 bytes. ¡Probemos!
¡Magnífico! Efectivamente era ese el problema, pero aún siguen faltando mucho contenido de la imagen… Repetimos el proceso hasta llegar el quinto IDAT…
6to. IDAT – Offset: 0000:A3DE
Bytes (HEX):
00 00 12 FF 49 44 41 54
Siendo:
00 00 12 FF = Tamaño del Chunk – DEC (4863 bytes)
49 44 41 54 = IDAT
Buscamos al final el texto IEND (Indica el final del PNG) y hacemos la misma resta de siempre: B6A9-A3DE = 12CB (-C) ~ 12BF lo que equivale a 4799 bytes. Editamos… y ¡Eureka!
¡Reto solucionado! (Censurado, para no dañar la diversión).
Realmente fue muy entretenido realizar esto, básicamente porque no estoy acostumbrado a manejar tan “internamente” un archivo, pero admito que aprendì bastante sobre el formato PNG.
Espero que les haya gustado. Hasta la próxima.







Últimos comentarios