Je ne suis pas l’exécutable cible de gdb et je n’ai même pas de stack correspondant à cette cible. Je veux quand même effectuer une seule étape pour pouvoir vérifier ce qui se passe dans mon code d’assemblage, car je ne suis pas expert en assemblage x86. Malheureusement, gdb refuse de faire ce simple débogage au niveau de l’assemblage. Cela me permet de définir et d’arrêter le point d’arrêt approprié, mais dès que j’essaye de faire un pas en avant, gdb signale l’erreur “Impossible de trouver les limites de la fonction actuelle” et l’EIP ne change pas.
Détails supplémentaires:
Le code machine a été généré par les instructions gcc asm et je l’ai copié à l’emplacement de la mémoire du kernel où il s’exécute, à partir de la sortie de objdump -d. Cela ne me dérangerait pas un moyen simple d’utiliser un chargeur pour charger mon code object dans une adresse déplacée, mais gardez à l’esprit que le chargement doit être effectué dans un module du kernel.
Je suppose qu’une autre alternative serait de produire un faux module de kernel ou un fichier d’informations de débogage à donner à gdb, pour lui faire croire que cette zone se trouve dans le code du programme. gdb fonctionne bien sur l’exécutable du kernel lui-même.
(Pour ceux qui veulent vraiment savoir, j’insère du code lors de l’exécution dans l’espace de données du kernel Linux à l’intérieur d’une VM VMware et le débogue à partir du débogage à distance du kernel via le stub gdb intégré de VMware Workstation. Je suis un étudiant diplômé en sécurité qui écrit un prototype.)
(Je peux définir un point d’arrêt pour chaque instruction à l’intérieur de mon assembly. Cela fonctionne mais deviendrait très laborieux, car la taille des instructions d’assemblage x86 varie et l’emplacement de l’assembly change à chaque redémarrage.)
Vous pouvez utiliser stepi
ou nexti
(qui peut être abrégé en si
ou ni
) pour parcourir votre code machine.
Au lieu de gdb
, lancez gdbtui
. Ou lancez gdb
avec le commutateur -tui
. Ou appuyez sur Cx Ca après avoir entré gdb
. Maintenant, vous êtes en mode TUI de GDB.
Entrez layout asm
pour que l’assemblage d’affichage de la fenêtre supérieure – cela suivra automatiquement votre pointeur d’instruction, bien que vous puissiez également modifier les frameworks ou faire défiler pendant le débogage. Appuyez sur Cx s pour accéder au mode SingleKey, où la run continue up down finish
etc. sont abrégées en une seule touche, ce qui vous permet de parcourir votre programme très rapidement.
+ ------------------------------------------------- -------------------------- + B +> | 0x402670push% r15 | | 0x402672 mov% edi,% r15d | | 0x402675 push% r14 | | 0x402677 push% r13 | | 0x402679 mov% rsi,% r13 | | 0x40267c push% r12 | | 0x40267e push% rbp | | 0x40267f push% rbx | | 0x402680 sub $ 0x438,% rsp | | 0x402687 mov (% rsi),% rdi | | 0x40268a movq $ 0x402a10,0x400 (% rsp) | | 0x402696 movq $ 0x0,0x408 (% rsp) | | 0x4026a2 movq $ 0x402510,0x410 (% rsp) | + ------------------------------------------------- -------------------------- + processus enfant 21518 Dans: Ligne principale: ?? PC: 0x402670 (gdb) fichier / opt / j64-602 / bin / jconsole Lecture des symboles de /opt/j64-602/bin/jconsole...done. (pas de symboles de débogage trouvés) ... terminé. (gdb) layout asm (gdb) commence (gdb)
La chose la plus utile que vous puissiez faire ici est display/i $pc
, avant d’utiliser stepi
comme cela a déjà été suggéré dans la réponse de R Samuel Klatchko. Ceci indique à gdb de désassembler l’instruction en cours juste avant d’imprimer l’invite à chaque fois; alors vous pouvez simplement continuer à stepi
sur Entrée pour répéter la commande stepi
.
(Voir ma réponse à une autre question pour plus de détails – le contexte de cette question était différent, mais le principe est le même)