Je débogue un fichier binaire dans gdb. C'était du code C compilé par gcc sur un Intel IA-32. J'ai récupéré cette sortie de objdump
. Je suis le plus intéressé par la dernière ligne ici:
08048d9e <func_1>
8048d9e: 55 Push %ebp
8048d9f: 89 e5 mov %esp,%ebp
8048da1: 83 ec 18 sub $0x18,%esp
8048da4: c7 44 24 04 88 99 04 movl $0x8049988,0x4(%esp)
8048dab: 08
8048dac: 8b 45 08 mov 0x8(%ebp),%eax
8048daf: 89 04 24 mov %eax,(%esp)
8048db2: e8 54 01 00 00 call 8048f0b <strings_not_equal>
Je crois que cette dernière ligne comparera la valeur trouvée à l'adresse indiquée: 8048f0b
. Je tente:
(gdb) x 0x8048f0b
et recevez:
0x8048f0b <strings_not_equal>: 0x57e58955
Suis-je en train d'interpréter l'Assemblée incorrectement? Est-ce la bonne façon de lire la valeur d'une adresse dans gdb? Je m'attendais à trouver une valeur hexadécimale plus ascii. Je souhaite trouver la valeur de chaîne stockée qui est comparée.
Avez-vous également un outil graphique préféré que vous aimez utiliser pour ce type de débogage? J'ai pensé à essayer ddd. Je veux trouver un moyen plus simple de déboguer.
Vous lisez correctement la valeur à l'adresse mémoire 0x8048f0b
, Mais la ligne call 8048f0b <strings_not_equal>
Indique que cette adresse est le début d'une fonction (appelée strings_not_equal()
). Vous ne vous attendriez pas à ce que ce soit ASCII - vous vous attendriez à ce que ce soit plus de code machine.
Si vous recherchez les arguments de fonction à strings_not_equal()
, ceux-ci sont poussés sur la pile. Le premier argument est copié à partir de 0x8(%ebp)
, qui est le premier argument de func1()
. Le deuxième argument est $0x8049988
, Qui est vraisemblablement l'adresse d'une chaîne.
Si vous souhaitez imprimer le contenu de l'adresse sous forme de chaîne, vous pouvez le faire avec x/s
:
x/s 0x8049988