Inspector de binarios ELF
Lee un binario ELF como lo hace readelf, directamente de los bytes y por completo en tu navegador. La cabecera da el tamaño de palabra y el orden de bytes, el OS/ABI, la arquitectura, el punto de entrada y si el archivo es un objeto reubicable, un ejecutable corriente, un ejecutable independiente de posición o una biblioteca compartida — una distinción que la cabecera por sí sola no hace, porque un PIE y un .so son ambos DYN y solo el intérprete o la bandera DF_1_PIE los separan. Las cabeceras de programa listan lo que el cargador mapea, y el array dinámico da la ruta del intérprete, cada biblioteca de DT_NEEDED, el SONAME con el que una biblioteca se publica y cualquier RPATH o RUNPATH incrustado en el archivo; esto último conviene revisarlo en cualquier binario que no hayas compilado tú, porque cambia dónde busca el cargador. La fila de endurecimiento responde a lo mismo que responde checksec, desde los mismos sitios: PIE por el tipo y DF_1_PIE, NX según si PT_GNU_STACK es escribible y ejecutable, y RELRO como ninguno, parcial o completo según esté PT_GNU_RELRO y BIND_NOW. Sin símbolos significa que el archivo no tiene SHT_SYMTAB, que es lo que quita strip; la tabla de símbolos dinámicos permanece, así que una biblioteca sin símbolos sigue exportando sus nombres. Dos cosas que no hace: no desensambla y no dice si se usó el protector de pila o FORTIFY_SOURCE, porque ambos exigen leer la tabla de símbolos buscando nombres concretos y no una bandera de cabecera. Los archivos big-endian y de 32 bits se leen correctamente, así que un binario ARM, MIPS o PowerPC de un router o de una imagen empotrada se abre igual de bien que uno de x86-64.
Cómo usar
- Suelta el binario sobre el recuadro: sirve un ejecutable sin extensión, un .so, un .o o un volcado de memoria.
- Lee la fila de cabecera para la arquitectura y el tipo. El ejecutable PIE y el objeto compartido son ambos DYN; la línea del intérprete te dice cuál tienes.
- Mira las etiquetas de endurecimiento: PIE, NX y RELRO completo es lo normal en una compilación de distribución, y una etiqueta ámbar conviene explicarla antes de distribuir el archivo.
- Consulta Necesita para las bibliotecas que buscará el cargador, y RUNPATH para cualquier directorio no estándar que el binario añade a esa búsqueda.
- Abre la lista de secciones cuando necesites tamaños: .text para el código, .rodata para las constantes y las secciones .debug_* si se dejó información de depuración.
Preguntas frecuentes
- ¿En qué se diferencian un ejecutable PIE y una biblioteca compartida? Ambos dicen DYN.
- El tipo ELF es realmente el mismo: código independiente de posición que el cargador puede mapear en cualquier dirección. Lo que los separa es que un ejecutable tiene una cabecera de programa PT_INTERP que nombra al cargador dinámico (normalmente /lib64/ld-linux-x86-64.so.2) para que el núcleo sepa arrancarlo, mientras que una biblioteca no la tiene y solo la carga otro programa. Las cadenas de herramientas modernas además marcan DF_1_PIE en las banderas dinámicas del ejecutable, que es lo que informa readelf y lo primero que mira esta herramienta, recurriendo al intérprete cuando un enlazador antiguo omitió la bandera.
- ¿De qué protegen realmente PIE, NX y RELRO?
- PIE permite al núcleo cargar el binario en una dirección base aleatoria, de modo que ASLR se aplica también al código del propio programa y no solo a las bibliotecas; sin él, las direcciones de los gadgets son fijas y conocidas. NX marca la pila como no ejecutable, así que no se puede saltar sin más al shellcode inyectado. RELRO deja las tablas de reubicación en solo lectura tras el arranque: el parcial protege las que se resuelven antes de main, y el completo además resuelve todas las funciones por adelantado para poder marcar la GOT como solo lectura, cerrando la clásica sobrescritura de la GOT. Las tres son propiedades del enlazado, y por eso se leen del archivo sin ejecutarlo.
- ¿Por qué dice que el binario no tiene símbolos si aún veo nombres de funciones?
- Hay dos tablas de símbolos. Aquí sin símbolos significa que falta SHT_SYMTAB, que es lo que quita strip y lo que necesita un depurador. La tabla dinámica, SHT_DYNSYM, tiene que quedarse en cualquier archivo que exporte o importe símbolos, o el enlazado dinámico no funcionaría: por eso una biblioteca despojada sigue listando todo lo que exporta y un ejecutable despojado sigue listando lo que importa. De ahí que nm no encuentre símbolos mientras nm -D sí imprime una lista.
- ¿Puede leer un binario de otra arquitectura o big-endian?
- Sí. El byte de clase y el de datos al principio de la cabecera dicen si el archivo es de 32 o 64 bits y qué orden de bytes usa, y todos los campos siguientes se leen a través de esos dos, así que un binario AArch64, ARM, MIPS, RISC-V o PowerPC big-endian se lee con la misma exactitud que uno x86-64. La arquitectura se muestra por nombre para los tipos comunes y como código en bruto para el resto. Lo que no puede es decirte si el binario funcionará en tu máquina: eso depende del núcleo, la ABI y las bibliotecas, no solo de la cabecera.
- ¿Para qué sirve el Build ID?
- Es un hash que el enlazador guarda en una sección de notas y que identifica esa compilación exacta. Las distribuciones lo usan para casar un binario con sus símbolos de depuración distribuidos aparte: el archivo de depuración acaba en /usr/lib/debug/.build-id/xx/yyyy.debug, y un depurador al que se le da un volcado puede encontrar los símbolos correctos aunque el binario esté despojado. También es una forma fiable de saber si dos archivos son de verdad la misma compilación, porque el identificador cambia con cualquier cambio en la salida compilada.
- ¿Se sube el binario a algún sitio?
- No. El archivo se lee con la File API del navegador y lo analiza JavaScript en la página. No se envía nada a un servidor y no hay componente de servidor al que enviarlo, algo que aquí importa más que en otras herramientas: un binario que estés inspeccionando puede ser justo lo que no tienes libertad de subir. Puedes desconectar la red después de cargar la página y todo sigue funcionando.
Herramientas relacionadas
Inspector de binarios Mach-O
Abre un binario de macOS o iOS en el navegador: arquitecturas de un archivo universal, segmentos y secciones, dylibs, rpaths, UUID y firma.
Inspector PE: visor de EXE y DLL de Windows
Abre un .exe, .dll, .sys o .efi de Windows en tu navegador: arquitectura, subsistema, importaciones, exportaciones, secciones y si tiene ASLR, DEP y CFG.
Inspector de archivos .class de Java
Analiza un .class compilado en el navegador: versión del archivo y de Java, indicadores de acceso, grupo de constantes, campos, métodos y dependencias.
Inspector de módulos WebAssembly
Analiza un .wasm en el navegador: tamaño de cada sección, importaciones y exportaciones con tipos, páginas de memoria y secciones personalizadas.
Visor de archivos mbox
Divide un archivo .mbox en tu navegador: límites de mensaje, cabeceras decodificadas, estructura MIME, hilos y Message-ID duplicados. No se sube nada.
Inspector de bases de datos SQLite
Abre un archivo .sqlite o .db en tu navegador y lee su estructura: tamaño de página, codificación, modo de diario y las filas reales de cada tabla.