← Blog
// FORENSE · CTF

La extensión miente: identifica archivos por sus magic bytes

Publicado el 14 ago 2026 · 6 min de lectura
ForenseCTFMagic bytesBlue Team

Renombras factura.pdf.exe a factura.pdf y el icono cambia. El fichero, no. La extensión es solo una etiqueta que el sistema operativo usa para decidir con qué programa abrirlo: no dice nada sobre lo que hay dentro. Un analista no se fía de ella. Se fía de los magic bytes.

Qué son los magic bytes

Casi todos los formatos de fichero empiezan por una firma fija en sus primeros bytes: una marca que dice «soy un PNG», «soy un PDF». Es como el ADN del archivo. Da igual cómo lo llames: si empieza por %PDF-, es un PDF; si empieza por MZ, es un ejecutable de Windows.

PNG    89 50 4E 47 0D 0A 1A 0A     ‰PNG␍␊␚␊
JPEG   FF D8 FF                     ÿØÿ
GIF    47 49 46 38                  GIF8
PDF    25 50 44 46 2D               %PDF-
ZIP    50 4B 03 04                  PK··
GZIP   1F 8B
ELF    7F 45 4C 46                  ·ELF   (binario Linux)
PE     4D 5A                        MZ     (ejecutable Windows)
PHP    3C 3F 70 68 70               <?php

La extensión es una etiqueta, no el contenido

Hay tres cosas que la gente confunde con «el tipo del fichero», y las tres se pueden falsear:

La firma, en cambio, está dentro del fichero. Para cambiarla de verdad hay que reconstruir el archivo, no solo renombrarlo.

Dónde te muerde esto

Subida de archivos

Un formulario que solo valida la extensión o el Content-Type es un coladero. El atacante sube una webshell con nombre inocente:

shell.php  →  se renombra a  shell.jpg
Content-Type: image/jpeg   (falso, lo pone el atacante)

Y para saltarse validaciones que sí miran la firma, se usa un políglota: un fichero válido como imagen y como código. Empieza con una cabecera GIF real y esconde PHP detrás:

GIF89a;<?php system($_GET['c']); ?>

Para el validador «empieza por GIF8, es una imagen». Para el intérprete de PHP, es código ejecutable.

Forense y CTF

Al revés que el atacante, aquí tú descubres lo escondido. Un gatito.jpg que no abre como imagen y que en hex empieza por PK es en realidad un ZIP con algo dentro. Un PNG con datos pegados después del marcador de fin. Es pan de cada día en los retos de forense y esteganografía.

🔬 En vez de abrir un editor hex a mano, pega los bytes o suelta el archivo en el Identificador de firmas (magic bytes): reconoce ~30 formatos leyendo solo los primeros 64 bytes en tu navegador (el archivo no se sube a ningún sitio) y te avisa de los casos raros, como un «.jpg» que en realidad empieza por <?php.

Los contenedores que empiezan por «PK»

Un detalle que despista mucho: un montón de formatos modernos son, por dentro, ficheros ZIP. Todos empiezan por 50 4B 03 04 (PK··):

.docx .xlsx .pptx   (Office)
.apk .jar           (Android / Java)
.epub               (libros)
.odt                (LibreOffice)

Así que si una firma dice «ZIP» pero el nombre es informe.docx, no hay contradicción: renómbralo a .zip, ábrelo y verás su estructura interna (XML, imágenes, classes.dex…). Media investigación de un APK empieza aquí.

Cómo comprobarlo tú mismo

En Linux/macOS tienes dos comandos de bolsillo:

# Ver los primeros bytes en hexadecimal + ASCII
hexdump -C sospechoso.jpg | head

# Preguntar al sistema por el tipo real (usa la firma, no la extensión)
file sospechoso.jpg
#  → sospechoso.jpg: PHP script, ASCII text

Ese file que te contradice la extensión es justo la señal que buscas. Y si no tienes terminal a mano, el identificador de arriba hace lo mismo desde el navegador.

🎯 ¿Quieres ponerlo en práctica? En la Zona CTF hay retos de forense y esteganografía (metadatos EXIF, mensajes ocultos en imágenes) donde identificar el formato real es el primer paso para encontrar la flag.

Defensa: si tu app recibe archivos

En resumen

La próxima vez que veas un .jpg que pesa 4 MB y no abre, ya sabes por dónde empezar: mírale los primeros bytes.

Comparte: LinkedIn X
Sergio Belmonte Morales
Sergio Belmonte Morales
Analista de Ciberseguridad · SOC · Especialista en Sentinel/KQL