Commande Linux objdump
Encyclopédie des commandes Linux
objdump est un outil en ligne de commande important de la suite GNU Binutils, utilisé pour afficher diverses informations sur les fichiers objets et les fichiers exécutables. C'est un outil puissant pour l'analyse binaire, la rétro-ingénierie et le débogage sur les systèmes Linux.
Les principales fonctions d'objdump incluent :
- Désassembler les fichiers binaires
- Afficher les informations d'en-tête du fichier
- Afficher le contenu des sections
- Afficher la table des symboles
- Afficher les informations de relocation
- Analyser la structure du fichier
Syntaxe de base
Le format de commande de base d'objdump est le suivant :
objdump [选项] 文件名
Si aucune option n'est spécifiée, objdump affiche les informations d'en-tête de section du fichier.
Explication détaillée des options courantes
Options liées au désassemblage
Exemple
-D, --disassemble-all # Désassembler toutes les sections
-S, --source # Affichage mixte du code source et du code assembleur (nécessite l'option -g lors de la compilation)
--prefix-addresses # Afficher les adresses complètes pendant le désassemblage
--no-addresses # Ne pas afficher les informations d'adresse
Options d'informations de section
Exemple
-j, --section=name# Afficher uniquement le contenu de la section spécifiée
Options de la table des symboles
Exemple
-T, --dynamic-syms # Afficher la table des symboles dynamiques
Informations d'en-tête de fichier
-f, --file-headers # 显示文件头部信息
Autres options utiles
Exemple
-r, --reloc # Afficher les entrées de relocalisation
-R, --dynamic-reloc # Afficher les entrées de relocalisation dynamiques
-s, --full-contents # Afficher le contenu complet de toutes les sections
Exemples pratiques
Exemple 1 : Affichage de la structure d’un fichier exécutable
objdump -h /bin/ls
Exemple de sortie :
/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
...
Exemple 2 : Désassemblage d’un fichier exécutable
objdump -d /bin/ls
Exemple de sortie (partielle) :
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 ...
Exemple 3 : Affichage de la table des symboles
objdump -t myprogram.o
Exemple de sortie :
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
Exemple 4 : Affichage mixte du code source et du code assembleur
objdump -S myprogram
Exemple de sortie :
Exemple
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
}
Scénarios d'application pratiques
Scénario 1 : Débogage des plantages de programme
Lorsqu'un programme plante, vous pouvez utiliser objdump pour afficher le code près de l'adresse du plantage :
objdump -d --start-address=0x400526 --stop-address=0x400536 myprogram
Scénario 2 : Analyse des appels de fonctions de bibliothèque
Voir quelles fonctions de bibliothèque dynamique le programme appelle :
objdump -T myprogram | grep UND
Scénario 3 : Apprentissage du langage assembleur
Apprenez le langage assembleur en désassemblant de simples programmes C :
Exemple
objdump -d simple
Notes
- Informations de débogage: Pour obtenir des informations au niveau du code source, vous devez ajouter
-goption - Impact de l'optimisation: L'optimisation du compilateur affecte le code assembleur généré ; soyez prudent lors de l'analyse
- Différences d'architecture: Différentes architectures de CPU ont des instructions assembleur différentes ; assurez-vous d'utiliser les bonnes options de désassemblage
- Problèmes de permissions: L'analyse de fichiers système peut nécessiter des privilèges root
- Format de fichier: objdump est principalement destiné aux fichiers au format ELF ; les autres formats peuvent nécessiter un traitement spécial
Astuces avancées
Utilisation avec d'autres outils
Exemple
objdump -d myprogram | grep -A20 "main>:"
# Calculer la taille des fonctions
objdump -d myprogram | awk '/^[0-9a-f]+ :/ {print $1,$2}'
Création d'un script de désassemblage
Exemple
# Exemple de script de désassemblage
if [ $# -ne 1 ]; then
echo "Utilisation : $0 "
exit 1
fi
echo "=== Informations d'en-tête de fichier ==="
objdump -f $1
echo -e "n=== Informations de section ==="
objdump -h $1
echo -e "n=== Code de désassemblage ==="
objdump -d $1
Résumé
objdump est un puissant outil d'analyse binaire sur les systèmes Linux. Le maîtriser vous permet de :
- Comprendre en profondeur les mécanismes d'exécution des programmes
- Localiser rapidement les problèmes d'un programme
- Apprendre le langage assembleur et les connaissances système
- Effectuer une analyse de base de rétro-ingénierie
Avec l'utilisation de base et les exemples pratiques présentés dans cet article, vous devriez déjà pouvoir commencer à utiliser objdump pour l'analyse de base de fichiers binaires. Au fur et à mesure que vous accumulerez de l'expérience pratique, vous découvrirez davantage d'utilisations astucieuses en programmation système et en débogage.
Autres extensions