Question:
Comment trouver main () en binaire?
drum
2014-04-26 02:37:10 UTC
view on stackexchange narkive permalink

É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.

Je crois avoir déjà donné une réponse à cette question dans la réponse à cette question: [Reversing ELF 64-bit LSB executable, x86-64, gdb] (http://reverseengineering.stackexchange.com/questions/3815/reversing-elf -64-bit-exécutable-lsb-x86-64-gdb / 3816 # 3816). N'hésitez pas à modifier votre question afin de demander plus de détails si vous manquez quelque chose.
@perror Et c'était une réponse fantastique. C'est dommage que les gens ne prêtent même pas attention à l'aide que vous leur avez apportée.
Quelle plate-forme / OS / compilateur souhaitez-vous gérer? Donnez-nous quelques exemples concrets.
@perror Excellente réponse. Serait-ce une grande différence sous Windows? De plus, est-il impossible de dire le point d'entrée sans cette information?
Oui, ce serait très différent. En fait, ce que je décris dans cette réponse est lié au compilateur `gcc`. Donc, si vous considérez un compilateur différent, la mise en page peut être totalement différente. Mais, si vous recherchez la fonction `main` dans un contexte MS-Windows, vous devez éditer votre question pour la spécifier. Cela aidera à obtenir une réponse plus précise.
@perror Je dois vous corriger là-dessus. Il n'est pas lié au compilateur, mais plutôt au format de fichier binaire: `ELF`,` PE`, ... avec lequel le compilateur n'a rien à voir.
Non, il est vraiment lié au compilateur. Je ne parle pas du point d'entrée, mais de l'emplacement de la procédure `main` qui a lieu après le chargement des bibliothèques dynamiques. Chaque compilateur a sa propre fonction pour ce faire. Donc, il est lié au compilateur.
@perror De ce point de vue, je suis d'accord. Mais je suppose que vous auriez dû le préciser dans votre commentaire. Techniquement parlant, l'emplacement de la fonction `main` n'est pas important tant qu'elle existe et qu'elle est référencée. Ainsi, les compilateurs peuvent le placer partout où ils le souhaitent. Je n'ai pas regardé votre premier commentaire, je n'aurais pas répondu autrement, beau travail!
Un répondre:
yaspr
2014-04-26 03:53:18 UTC
view on stackexchange narkive permalink

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.



Ce Q&R a été automatiquement traduit de la langue anglaise.Le contenu original est disponible sur stackexchange, que nous remercions pour la licence cc by-sa 3.0 sous laquelle il est distribué.
Loading...