Comando Linux objdump
Referencia completa de comandos Linux
objdump es una importante herramienta de línea de comandos del conjunto de herramientas GNU Binutils, utilizada para mostrar diversa información sobre archivos objeto (object files) y archivos ejecutables. Es una herramienta poderosa para análisis binario, ingeniería inversa y depuración en sistemas Linux.
Las principales funciones de objdump incluyen:
- Desensamblar archivos binarios
- Ver la información de la cabecera del archivo
- Mostrar el contenido de las secciones (sections)
- Ver la tabla de símbolos
- Mostrar información de reubicación
- Analizar la estructura del archivo
Sintaxis básica
El formato básico del comando objdump es el siguiente:
objdump [选项] 文件名
Si no se especifica ninguna opción, objdump mostrará la información de la cabecera de las secciones del archivo.
Explicación detallada de opciones comunes
Opciones relacionadas con el desensamblado
Ejemplo
-D, --disassemble-all # Desensamblar todas las secciones
-S, --source # Mostrar código fuente y ensamblador de forma mezclada (requiere usar la opción -g al compilar)
--prefix-addresses # Mostrar direcciones completas al desensamblar
--no-addresses # No mostrar información de direcciones
Opciones de información de secciones
Ejemplo
-j, --section=nombre# Mostrar solo el contenido de la sección especificada
Opciones de tabla de símbolos
Ejemplo
-T, --dynamic-syms # Mostrar la tabla de símbolos dinámicos
Información de la cabecera del archivo
-f, --file-headers # 显示文件头部信息
Otras opciones útiles
Ejemplo
-r, --reloc # Mostrar entradas de reubicación
-R, --dynamic-reloc # Mostrar entradas de reubicación dinámica
-s, --full-contents # Mostrar el contenido completo de todas las secciones
Ejemplos prácticos
Ejemplo 1: Ver la estructura de un archivo ejecutable
objdump -h /bin/ls
Ejemplo de salida:
/bin/ls: file format elf64-x86-64
Sections:
Idx Name Size VMA LMA File off Algn
0 .interp 0000001c 0000000000400238 0000000000400238 00000238 2**0
CONTENTS, ALLOC, LOAD, READONLY, DATA
1 .note.ABI-tag 00000020 0000000000400254 0000000000400254 00000254 2**2
CONTENTS, ALLOC, LOAD, READONLY, DATA
...
Ejemplo 2: Desensamblar un archivo ejecutable
objdump -d /bin/ls
Ejemplo de salida (parcial):
0000000000405a50 : 405a50: 31 ed xor %ebp,%ebp 405a52: 49 89 d1 mov %rdx,%r9 405a55: 5e pop %rsi 405a56: 48 89 e2 mov %rsp,%rdx 405a59: 48 83 e4 f0 and $0xfffffffffffffff0,%rsp ...
Ejemplo 3: Ver la tabla de símbolos
objdump -t myprogram.o
Ejemplo de salida:
myprogram.o: file format elf64-x86-64 SYMBOL TABLE: 0000000000000000 l df *ABS* 0000000000000000 myprogram.c 0000000000000000 l d .text 0000000000000000 .text 0000000000000000 g F .text 0000000000000015 main 0000000000000000 *UND* 0000000000000000 printf
Ejemplo 4: Mostrar código fuente y ensamblador mezclados
objdump -S myprogram
Ejemplo de salida:
Ejemplo
400526: 55 push %rbp
400527: 48 89 e5 mov %rsp,%rbp
printf("Hello, World!n");
40052a: bf d4 05 40 00 mov $0x4005d4,%edi
40052f: e8 cc fe ff ff callq 400400
return 0;
400534: b8 00 00 00 00 mov $0x0,%eax
}
Escenarios de aplicación práctica
Escenario 1: Depurar un fallo del programa
Cuando un programa falla, se puede usar objdump para ver el código cercano a la dirección del fallo:
objdump -d --start-address=0x400526 --stop-address=0x400536 myprogram
Escenario 2: Analizar llamadas a funciones de bibliotecas
Ver qué funciones de bibliotecas dinámicas llama el programa:
objdump -T myprogram | grep UND
Escenario 3: Aprender lenguaje ensamblador
Aprender lenguaje ensamblador desensamblando un programa simple en C:
Ejemplo
objdump -d simple
Precauciones
- Información de depuración: Para obtener información a nivel de código fuente, al compilar es necesario añadir
-gopción - Impacto de la optimización: La optimización del compilador afecta al código ensamblador generado; se debe tener cuidado al analizar
- Diferencias de arquitectura: Los códigos ensambladores difieren según la arquitectura de la CPU; asegúrese de usar las opciones de desensamblado correctas
- Problemas de permisos: Analizar archivos del sistema puede requerir permisos de root
- Formato de archivo: objdump está dirigido principalmente a archivos en formato ELF; otros formatos pueden requerir un tratamiento especial
Técnicas avanzadas
Uso combinado con otras herramientas
Ejemplo
objdump -d myprogram | grep -A20 "main>:"
# Calcular el tamaño de las funciones
objdump -d myprogram | awk '/^[0-9a-f]+ :/ {print $1,$2}'
Crear un script de desensamblado
Ejemplo
# Ejemplo de script de desensamblado
if [ $# -ne 1 ]; then
echo "Usage: $0 "
exit 1
fi
echo "=== Información de la cabecera del archivo ==="
objdump -f $1
echo -e "n=== Información de las secciones ==="
objdump -h $1
echo -e "n=== Código de desensamblado ==="
objdump -d $1
Resumen
objdump es una potente herramienta de análisis binario en sistemas Linux. Dominarla permite:
- Comprender en profundidad el mecanismo de ejecución de los programas
- Localizar rápidamente problemas en los programas
- Aprender lenguaje ensamblador y conocimientos del sistema
- Realizar análisis básicos de ingeniería inversa
Con los usos básicos y los ejemplos prácticos presentados en este artículo, ya deberías poder comenzar a utilizar objdump para realizar análisis básicos de archivos binarios. A medida que acumules experiencia práctica, descubrirás más usos útiles de esta herramienta en la programación de sistemas y la depuración.
Otras extensiones