Trabajar con números mágicos en Linux

Este artículo tiene como objetivo brindar una introducción a los números mágicos y los encabezados de los archivos, cómo extraer un archivo basado en números mágicos y cómo corromper y reparar un archivo basado en números mágicos en el entorno Linux.

números mágicos

Los números mágicos son los primeros bytes de un archivo que son únicos para un tipo de archivo en particular. Estos bits únicos se conocen como números mágicos, también denominados a veces firma de archivo.

El sistema puede utilizar estos bytes para » diferenciar y reconocer diferentes archivos » sin una extensión de archivo.

Localización de números mágicos en firmas de archivos

La mayoría de los archivos tienen las firmas en los bytes al principio del archivo, pero algunos sistemas de archivos pueden incluso tener la firma del archivo en desplazamientos distintos al principio. Por ejemplo, el sistema de archivos ext2/ext3 tiene los bytes 0x53 y 0xEF en las posiciones 1080 y 1081.

  • Sin embargo, algunos archivos no tienen números mágicos, como los archivos de texto sin formato, pero pueden identificarse comprobando el juego de caracteres (ASCII en el caso de archivos de texto).
    Esto se puede hacer usando el comando:
    file -i *name_of_file*
    
  • Los números mágicos/firmas de archivos normalmente no son visibles para el usuario, pero se pueden ver usando un editor hexadecimal o usando el comando ‘xxd’ como se menciona a continuación. Estos bytes son esenciales para abrir un archivo.
  • Cambiar/corromper estos bytes hará que el archivo sea inútil, ya que la mayoría de las herramientas no accederán a estos archivos debido a posibles daños.
  • El comando de archivo en el lector de Linux lee los números mágicos de un archivo y muestra el tipo de archivo según el número mágico.
  • Por ejemplo, tomemos el ejemplo de un archivo PNG. Podemos ver el hexadecimal de un archivo escribiendo el siguiente comando en una terminal de Linux (se usa Kali Linux en este artículo). Este comando crea un volcado hexadecimal del archivo que le pasamos.
    xxd image.png | head
    

Esto produce el siguiente resultado: –

En esta imagen, vemos que el primer conjunto de bytes del archivo son

89 50 4e 47 0d 0a 1a 0a 
// magic number of PNG file

Estos números ayudan al sistema a identificar el tipo de archivo que se está utilizando. Algunos archivos que no están escritos con su extensión, se identifican con la ayuda de estos números mágicos.

Un ejemplo de un archivo Zip . Del mismo modo, use el comando mencionado anteriormente en un archivo zip.

xxd test.zip | head

En la imagen de arriba, podemos ver que el archivo comienza con:

 50 4b 03 04
// magic number of zip file

Agregar un archivo a otro e identificar la división con números mágicos

Podemos usar python para realizar esta operación. Esencialmente, leeremos los bytes de dos archivos y los escribiremos uno por uno en otro archivo vacío. En este artículo, combinaremos un PNG con un archivo Zip.

"""
The first two lines open the two files to be read byte by byte
The third line opens an output file to be written to byte by byte
"""
  
input_file_1 = open("image.png", 'rb').read() 
input_file_2 = open("test.zip", 'rb').read()
output_file = open("output.png" , 'wb')
  
output_file.write(input_file_1)
output_file.write(input_file_2)

Usando este código python, obtenemos un archivo output.png. Al ejecutar el comando:

xxd output.png | head

en este archivo, notamos que comienza con el mismo 8950 4e47 0d0a 1a0a hex. Sin embargo, si ejecutamos el comando

xxd output.png | grep "PK"

que buscará los números mágicos (PK es el equivalente ASCII de 50 4b) de un archivo zip entre el hexadecimal,
obtendremos el siguiente resultado:

En esta imagen, podemos ver que los números mágicos del archivo zip están presentes en el hexadecimal del png, lo que significa que hemos agregado con éxito el hexadecimal del archivo zip al del png. El siguiente paso es separar este archivo zip del png.
Existe una sencilla utilidad, ‘binwalk’, que nos ayuda a realizar esta tarea fácilmente escribiendo:

binwalk -e output.png
-e stands for extract

Cómo usar los números mágicos y las compensaciones para extraer el archivo zip de la salida:

  1. Encuentre el desplazamiento inicial del archivo que desea extraer:  En este ejemplo, deseamos extraer el archivo zip del PNG. Así que primero buscamos el encabezado ZIP. Como se muestra en la imagen anterior, ejecutamos el comando ‘xxd output.png | grep «PK» ‘. En esta imagen, vemos el desplazamiento en la columna izquierda. Para el archivo zip, el desplazamiento será 00001c90.
  2. Calcule la cantidad de bits desde el desplazamiento donde comienza el encabezado de su archivo:  ahora debemos calcular la cantidad de bits desde el desplazamiento donde comienza el archivo zip. Podemos contar esto manualmente y observar que es 00001c95 (cada valor hexadecimal corresponde a 1 bit)
  3. Convierta este valor hexadecimal a decimal: esto se puede hacer abriendo un python IDLE (escriba ‘python’ en una terminal de Linux. Ahora debemos convertir este valor a decimal. En un python IDLE, simplemente debemos agregar 0x al comienzo de el valor encontrado en el paso anterior.
  4. Usa el siguiente comando:
    'dd if=*input file* bs=1 skip=*value
    calculated in step 3* of=*output file name*'

    En el comando mencionado anteriormente, ‘if’ representa el archivo de entrada, ‘skip’ denota la cantidad de bits que se deben omitir para llegar al principio del archivo que deseamos extraer, ‘bs’ se refiere a la cantidad de bytes que debe leerse a la vez, y ‘de’ se refiere al nombre del archivo de salida.
    Consulte la imagen a continuación para ver el uso de los pasos 3 y 4:

  5. Extracción de archivos: ahora podemos abrir el directorio de trabajo actual desde la terminal para ver nuestro archivo zip extraído escribiendo:
    nautilus ./
    

¿Cómo corromper un archivo cambiando su Número Mágico?

Cambiar los números mágicos de un archivo hace que el archivo sea inútil. Se nos mostrará un error cada vez que intentemos abrir un archivo que tenga un encabezado distorsionado.

  1. Descargar editor hexadecimal : para corromper un archivo, necesitamos un editor hexadecimal. hexedit es una herramienta popular utilizada para lo mismo. Puedes instalarlo usando:
    sudo apt-get install hexedit
    

    Puede abrir el archivo escribiendo

    hexedit image.png
    

    Verá una salida como esta:

    Hex of a file using hexedit

  2. Cambia el archivo: para cambiar un byte usando hexedit, simplemente tienes que mover el cursor sobre un byte y escribir lo que quieras. Por el bien de este artículo, cambiaré los números mágicos de 89 50 a 00 00.
    Para guardar y salir, presione ctrl X y luego Y.

Corrupted Magic Number

En la imagen de arriba, vemos que los primeros 2 bytes se cambiaron a 00 00 y, a la derecha, podemos ver que el texto cambió de .PNG a ..NG

¿Cómo reparar un archivo que tiene un número mágico corrupto?

Usemos el ejemplo que se muestra en la imagen de arriba donde corrompí los dos primeros bytes del PNG. Si intenta abrir el PNG ahora, le dará un error que dice «No se pudo cargar el archivo», no un «PNG». Esta es una prueba de que un sistema mira el número mágico antes de abrir un archivo. Sabiendo que los números mágicos PNG comienzan con 89 50, podemos cambiar los bytes a su valor original.
Veamos otro ejemplo, usando una imagen jpeg.
Veamos primero cómo se ve un hexadecimal jpeg que funciona:

jpeg magic numbers

los bytes del número mágico original son

FF D8 FF E0

Un JPEG con bytes mágicos dañados se vería así:

Corrupted JPG

Notamos que los bytes mágicos en esto son

EE A8 CC 00

Y, por lo tanto, el archivo jpg no se abrirá si intenta abrirlo. Obtenemos este error:

Picture error

Un archivo JPG normalmente tiene el número mágico «FFD8 DDE0», «FFD8 FFDB» o «FFD8 FFE1».
Con este conocimiento, todo lo que tendríamos que hacer es probar estas combinaciones como encabezados para el archivo. Hacer esto requiere el mismo proceso que la corrupción de archivos.

    1. Abrir edición hexadecimal
    2. Cambie los primeros bytes pasando el cursor e ingresando los valores requeridos
    3. Guardar (Ctrl X) y salir
    4. Intenta abrir el archivo. Repita los pasos con el siguiente número mágico posible si el archivo no se abre

Al cambiar los bytes mágicos a FFD8 FFE0, la imagen se abre correctamente.

Este artículo es una contribución de Deepak Srivatsav . Si te gusta GeeksforGeeks y te gustaría contribuir, también puedes escribir un artículo usando write.geeksforgeeks.org o enviar tu artículo por correo a review-team@geeksforgeeks.org. Vea su artículo que aparece en la página principal de GeeksforGeeks y ayude a otros Geeks.

Escriba comentarios si encuentra algo incorrecto o si desea compartir más información sobre el tema tratado anteriormente.

Publicación traducida automáticamente

Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *