Comment lire les variables locales avec gdb?

Je sais que vous pouvez trouver tous les parameters en regardant un décalage positif de $ ebp en utilisant gdb:

(gdb) x/4wx $ebp 

Ensuite, je regarderais les 3ème et 4ème adresses en utilisant x/s car elles seraient le premier et le deuxième paramètre. Qu’en est-il des variables locales? Comment pourrais-je regarder les valeurs avec un décalage négatif de $ EBP? Aussi, y a-t-il un moyen de regarder la valeur de $ eax? Chaque fois que j’essaie d’imprimer la valeur de $ eax en utilisant x/s $eax , l’adresse est hors limites ou la valeur est 0, ce qui, j’en suis sûr, ne l’est pas car je mets simplement une valeur constante dans le registre.

J’ai essayé les info locals mais je reçois le message “Aucune information sur la table des symboles disponible”.

Vous devez d’abord comstackr le débogage des symboles dans votre binary. Utilisez l’option -g sur gcc avec votre commande actuelle pour le faire. Si vous utilisez un compilateur différent, vous devrez consulter sa documentation. Après cela, “info locales” et la commande d’impression fonctionneront.

Pour examiner une variable locale, il vous suffit d’utiliser la commande ‘print’. Par exemple, si vous regardez la variable locale «i», c’est aussi simple que «print i».

Vous devriez pouvoir gérer $ eax de la même manière que $ ebp. Je soupçonne que vous avez des problèmes parce que vous utilisez x / s. x / s essaiera d’imprimer une chaîne et continuera jusqu’à atteindre un caractère nul. Si cela ne se produit pas avant longtemps, la longueur de la chaîne sera hors limites. Essayez ‘x / d $ eax’. Vous pouvez même faire ‘print $ eax’. Vous pouvez également utiliser les «registres d’informations» pour obtenir toutes les données du registre.

Je sais que vous pouvez trouver tous les parameters en regardant un décalage positif de $ ebp en utilisant gdb

Cela ne fonctionne que pour certains processeurs et conventions d’appel, et n’est en aucun cas universel.

En supposant que vous ne vous préoccupiez que de x86 et que votre code soit compilé avec des pointeurs de trame (qui étaient auparavant le comportement par défaut, mais plus le comportement par défaut pour GCC 4.6 en mode opt), les locales sont atsortingbuées selon un décalage négatif fixe par rapport à %ebp .

Évidemment, si vous pouvez reconstruire votre code avec les symboles de débogage (avec -g ), alors GDB pourra simplement imprimer leurs valeurs, sans que vous ayez à vous soucier de la façon dont GDB les trouve.

Si vous ne pouvez pas (par exemple parce que le code provient d’une tierce partie), vous devrez examiner attentivement le désassemblage et devinez. Si vous supposez qu’une valeur est stockée dans %ebp-8 , vous pouvez examiner cette valeur avec GDB de la même façon que vous examinez les décalages positifs: (gdb) x/wx $ebp-8 .

Attention: le compilateur est libre d’organiser les informations locales comme il le souhaite, donc si vous déclarez

 int x, y, z; 

le compilateur est libre de stocker x en %ebp-16 , y en %ebp-20 et z en %ebp-12 .