Este reto es de esteganografía y su solución es:
1.- Descargamos los dos archivo asociados al reto (Reto 10_Imagen.bmp y Reto 10_Archivo recuperado 1.zip) y abrimos el segundo de ellos. Este archivo contiene un archivo comprimido (Documento 1.txt) protegido por contraseña.
En el enunciado del reto ya se nos dice que en la imagen se oculta la contraseña del archivo anterior y del resto de archivos recuperados. Abrimos el primero de los archivos asociados al reto (Reto 10_Imagen.bmp) con un editor hexadecimal,
El tamaño de archivo que se indica en su cabecera coincide con el que realmente tiene:
Otro de los métodos más sencillos para ocultar información en un archivo de imagen bmp consiste en utilizar los Bytes de relleno de cada línea de la imagen. Es decir, en un archivo bmp los valores correspondientes a cada línea de la imagen se disponen de izquierda a derecha con una longitud de línea múltiplo de 4 Bytes, agregándose en caso necesario los Bytes con valor 0 que se precisen hasta completar la longitud múltiplo de 4. Estos Bytes de relleno se ignoran a la hora de visualizar la imagen, por lo que su utilización para ocultar información adicional no afecta a su visualización.
En nuestro reto, tal y como se puede observar en la figura siguiente, la imagen bmp tiene 523 píxeles de ancho:
En la figura anterior en la que se muestra la cabecera del archivo bmp, vemos que se utilizan 24 bits (3 Bytes) por píxel ("0018" en hexadecimal, 24 en decimal), por lo que cada línea de la imagen tendrá (523 píxeles x 3 Bytes/píxel) + 3 Bytes = 1.569 Bytes + 3 Bytes = 1.572 Bytes. Es decir, 1.569 no es múltiplo de 4 y, por tanto, se añaden 3 Bytes de relleno en cada línea hasta que su longitud sea igual al siguiente múltiplo de 4, hasta 1.572. Además, para conocer cuanta información podemos ocultar como máximo en esta imagen utilizando los Bytes de relleno de todas las líneas de la imagen basta con multiplicar el alto de la imagen (que tal y como se observa en la figura anterior es 412 píxeles) por el número de Bytes de relleno de cada línea, es decir, en nuestro caso: 412 líneas x 3 Bytes/línea = 1.236 Bytes.
Con el editor hexadecimal vamos a la posición que ocupa el primer carácter de relleno correspondiente a la primera línea de la imagen (en hexadecimal: 36 + 621 = 657):
Los tres caracteres de relleno de la primera línea contienen los valores en hexadecimal "4B 65 79", que se corresponden en ASCII con los caracteres "Key", por lo que parece que, efectivamente, se han utilizado los Bytes de relleno de algunas líneas para ocultar la contraseña que nos pide el reto.
Vamos a la posición que ocupa el primer carácter de relleno correspondiente a la segunda línea de la imagen (en hexadecimal: 657 + 3 + 621 = C7B):
Los tres caracteres de relleno de la segunda línea contienen los valores en hexadecimal "2F 30 38", que se corresponden en ASCII con los caracteres "/08".
Vamos a la posición que ocupa el primer carácter de relleno correspondiente a la tercera línea de la imagen (en hexadecimal: C7B + 3 + 621 = 129F):
Los tres caracteres de relleno de la tercera línea contienen los valores en hexadecimal "2D 30 33", que se corresponden en ASCII con los caracteres "-03".
Vamos a la posición que ocupa el primer carácter de relleno correspondiente a la cuarta línea de la imagen (en hexadecimal: 129F + 3 + 621 = 18C3):
Los tres caracteres de relleno de la tercera línea contienen los valores en hexadecimal "00 00 00".
Por tanto, vamos a realizar la primera prueba con la contraseña = "Key/08-03", y, efectivamente, es la clave correcta. El archivo Documento 1.txt que contiene el archivo zip tiene el siguiente contenido:
Por tanto, la solución al reto 10 es: Key/08-03.
******** PRÓXIMO RETO
Reto 11: "En el fondo del mar".
hola,
ResponderEliminarmuchas gracias por el reto, pero, de donde sale el valor 36 en la suma de
"Con el editor hexadecimal vamos a la posición que ocupa el primer carácter de relleno correspondiente a la primera línea de la imagen (en hexadecimal: 36 + 621 = 657):"
de donde sale el 36!??
ademas porque sumas +3 si ese 3 es el espacio sobrante donde se esconde la información.
ya que si sumas el +3(hxdcml) ya haria el salto de linea...
o me equivoco?
Hola:
Eliminarla cabecera de un archivo .BMP tiene 54 Bytes de longitud (https://es.wikipedia.org/wiki/Windows_bitmap), del Byte 00 al Byte 53, y es de ahí de donde sale el valor 36. Si convertimos 54 en decimal a hexadecimal obtenemos 36, que sería la primera posición (en hexadecimal) con información de la imagen (en nuestro caso, esa posición contiene el valor 0E - mira la primera figura del post).
A partir de ahí, para ir a la primera posición (en hexadecimal) de relleno debemos sumar a esa cantidad (36 en hexadecimal) los Bytes que contienen información "útil" de la primera línea de la imagen (cada línea de la imagen tiene 523 pixeles de ancho y se utilizan 3 Bytes/pixel), es decir, 523 pixeles x 3 Bytes/pixel = 1569 Bytes, que en hexadecimal es 621. Por tanto, el primer carácter de relleno estará en la posición hexadecimal 36 + 621 = 657 (los tres caracteres de relleno de la primera línea de la imagen contienen 4B, 65, 79 - mira la segunda figura correspondiente al editor hexadecimal).
A partir de ahí, para situarnos en la posición del siguiente carácter de relleno (el primero de la segunda línea de la imagen) sumamos a 657 (en hexadecimal la primera posición del primer carácter de relleno de la primera fila) los 3 Bytes de longitud correspondientes al relleno de la primera fila más los 621 Bytes (en hexadecimal) que contienen información "útil" de la segunda línea de la imagen, es decir: 657 + 3 + 621 = C7B (en hexadecimal).
Y así sucesivamente...