J'ai récemment eu pour tâche de comprendre un programme binaire Linux. Cependant, le programme était sous forme binaire.
J'ai utilisé les commandes file
, strings
et objdump
d'avoir une petite idée de ce qu'il faisait, et quelles fonctions il appelait.
Il semble que le binaire soit compilé avec des informations de débogage. Que puis-je apprendre de plus à ce sujet?
linux
reverse-engineering
Jeff Schaller
la source
la source
Réponses:
Y compris les commandes que vous avez déjà utilisées, je ferai de mon mieux pour détailler ce qui peut être fait pour effectuer des opérations judiciaires dans un fichier exécutable.
La
strings
commande humble peut être utile pour visualiser des messages d'erreur textuels donnant des indications sur les fonctionnalités binaires. C'est aussi un moyen simple de détecter les fichiers binaires compactés comme dans l'exemple (fréquents avec les fichiers binaires de logiciels malveillants):file
permet de voir les propriétés exécutables, à savoir:Dans cet exemple, "non dépouillé" indique qu'il a été compilé avec les informations de débogage incluses.
objdump
produit la liste de désassemblage d'un exécutable:objdump
permet également de connaître le compilateur utilisé pour compiler l'exécutable binaire:objdump
répertorie également les fonctions externes liées au moment de l'exécution:$ objdump -T exe_file
Vous pouvez exécuter le fichier binaire dans une machine virtuelle uniquement créée puis supprimée uniquement dans le but d'exécuter le fichier binaire. Utilisez
strace
,ltrace
,gdb
etsysdig
pour en savoir plus sur ce que le binaire est en train de faire au niveau des appels système au moment de l' exécution.Il peut également être débogué étape par étape avec
gdb
.Pour suivre / créer des sauvegardes d’une grande partie de son activité système, utilisez sysdig comme suit:
Nous reviendrons sur les analyses statiques du fichier binaire lui-même dans le reste de cette réponse.
ldd exe_file
liste les bibliothèques qu'il utilise;size -A exe_file
readelf -x .rodata exe_file
liste les chaînes statiquesreadelf -h exe_file
obtient les informations d'en-tête ELFreadelf -s exe_file
affiche des symbolesnm exe_file
liste les symboles de la table d'objets:En plus de désassembler le binaire avec
objdump
, un décompilateur peut également être utilisé.Pour la décompilation, j’ai récemment lancé un défi technique dans lequel je devais décompiler deux petits binaires linux 64 bits.
J'ai essayé d'utiliser Boomerang et Snowman. Le projet Boomerang semble abandonné et je n’ai pas été impressionné par leurs limites. Plusieurs autres alternatives, open source / freeware / old, dont une récente d'Avast, ne décompilent que des fichiers binaires 32 bits.
J'ai fini par essayer la démo de Hopper sous MacOS (il existe également une version Linux).
Hopper désassemble et décompile des fichiers binaires 32 ou 64 bits pour OS / X, Linux et Windows. Il est capable de traiter de gros fichiers binaires lorsqu'il est sous licence.
Il crée également des graphiques de flux des fonctions de / structure du programme et des variables.
Il est également activement maintenu et mis à jour. Cependant c'est commercial.
J'ai tellement aimé l'utiliser et la sortie qui en résulte a acheté une licence. La licence est de loin beaucoup plus abordable que les rayons hexagonaux.
Dans les commentaires de cette réponse, @ d33tah et @Josh mentionnent également comme alternative libre Radare2, ainsi que l'interface graphique correspondante, Cutter étant similaire à Hopper sous Linux, je ne peux pas en témoigner personnellement car je ne les utilise pas.
De plus, comme le binaire cible a été compilé avec les informations de débogage, vous pouvez récupérer le nom original des fonctions et des variables.
Plus particulièrement, vous ne récupérerez jamais les commentaires dans le code source car ils ne sont en aucune manière compilés dans des exécutables binaires.
L'amélioration de la qualité de la source de sortie et la compréhension du binaire impliquent toujours du temps et du travail de détective. Les décompilateurs ne font qu'une partie du travail.
Exemple de sortie Hopper sans informations de débogage:
L’interface graphique de Hopper est également très utilisable (plusieurs fonctionnalités développées simultanément sur cette image):
Voir aussi la question connexe Pourquoi le vrai et le faux sont-ils si gros?
la source
strace -f
de suivre les threads / processus enfants. Il y a des options pour diviser la sortie dans des fichiers séparés pour chaque PID, ou vous pouvez simplement/12345
dansless
la recherche et pour les lignes qui commencent par mettre en évidence le PID vous intéresse. Si les choses ne sont pas trop pêle - mêle (par exemple script shell commence autres processus, pas de threads simultanés), cela peut être utilisable. Mais oui, il est extrêmement utile de voir quels fichiers de configuration / autres fichiers tentent de lire par un logiciel déroutant, en essayant de comprendre pourquoi il n’est pas satisfait de la façon dont vous l’avez installé.radare2
à la liste.