Étant donné un binaire et n'utilisant qu'un outil comme ndisasm
, comment puis-je trouver main ()
? Je ne veux pas utiliser d'outils intelligents comme IDA Pro car je fais cet exercice pour apprendre.
Étant donné un binaire et n'utilisant qu'un outil comme ndisasm
, comment puis-je trouver main ()
? Je ne veux pas utiliser d'outils intelligents comme IDA Pro car je fais cet exercice pour apprendre.
Ceci est assez délicat et nécessite BEAUCOUP de patience. Je suppose ici que vous essayez de trouver la fonction main
telle qu'elle est définie en C et non comme le point d'entrée de votre programme. Il est très difficile de trouver ce que vous cherchez en scannant le code avec vos yeux & brain. Mais voici un moyen. Ce que vous pouvez faire, c'est d'abord vérifier l'en-tête du fichier binaire que vous essayez de désassembler. Ci-dessous, vous trouverez la sortie de readelf -h
sur un fichier aléatoire. Si le fichier n'est pas endommagé (volontairement ou non), vous pourrez trouver l ' adresse du point d'entrée .
Magic: 7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00 Classe: ELF64 Données: complément à 2, petit boutiste Version: 1 (actuelle) OS / ABI: UNIX - System V Version ABI: 0 Type: EXEC (fichier exécutable) Machine: Advanced Micro Devices X86-64 Version: 0x1 Adresse du point d'entrée: 0x400440 Début des en-têtes de programme: 64 (octets dans le fichier) Début des en-têtes de section: 4680 (octets dans le fichier ) Indicateurs: 0x0 Taille de cet en-tête: 64 (octets) Taille des en-têtes de programme: 56 (octets) Nombre d'en-têtes de programme: 8 Taille des en-têtes de section: 64 (octets) Nombre d'en-têtes de section: 35 Index du tableau des chaînes d'en-tête de section: 32
Cette adresse pointe généralement vers le locati sur le premier morceau de code qui sera exécuté au moment de l'exécution (fonction _start
) et qui gérera les paramètres de la fonction principale
(ou arguments de ligne de commande) avant d'appeler la fonction principale
. Une autre technique serait d'exécuter votre programme sous un débogueur ( GDB par exemple) et de procéder étape par étape.
Je dois vous avertir cependant, si vous avez affaire à des binaires ELF, les choses pourraient s'avérer plus compliquées car elles contiennent des tables ctor
et dtor
qui contiennent pointeurs vers les fonctions exécutées avant et après la fonction main
. Vous avez également des bizarreries non documentées lors du traitement des binaires liés statiquement. Et bien sûr, d'autres programmes peuvent se passer de la fonction main
et appeler ce qu'ils veulent.