web-dev-qa-db-fra.com

Utilisation de gdb en une seule étape Le code d'assemblage situé en dehors de l'exécutable spécifié provoque une erreur "Impossible de trouver les limites de la fonction actuelle"

Je suis en dehors de l'exécutable cible de gdb et je n'ai même pas de pile correspondant à cette cible. Quoi qu'il en soit, je souhaite procéder en une seule étape afin de pouvoir vérifier le contenu de mon code d'assemblage, car je ne suis pas un expert de l'assemblage x86. Malheureusement, gdb refuse de faire ce simple débogage au niveau de l’Assemblée. Cela me permet de définir et d'arrêter sur le point d'arrêt approprié, mais dès que j'essaie de passer à l'étape suivante, gdb signale l'erreur "Impossible de trouver les limites de la fonction en cours" 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é dans l’emplacement mémoire du noyau où il s’exécute, à partir de la sortie de objdump -d. Un moyen simple d’utiliser un chargeur pour charger mon code d’objet sur une adresse déplacée ne me dérangerait pas, mais gardez à l’esprit que le chargement doit être effectué dans un module du noyau.

Je suppose qu'une autre alternative serait de produire un faux module de noyau 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 noyau lui-même.

(Pour ceux qui veulent vraiment savoir, j'insère du code au moment de l'exécution dans l'espace de données du noyau Linux dans un VMware VM et le débogage à partir de gdb. Débogage du noyau à distance via le gdb intégré de VMware Workstation. Remarque: je ne suis pas en train d’écrire des exploits du noyau, 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 de mon assemblée. Cela fonctionne, mais cela prendrait beaucoup de temps après, car la taille des instructions d'assemblage x86 varie et l'emplacement de celle-ci change à chaque redémarrage.)

79
Paul

Vous pouvez utiliser stepi ou nexti (qui peut être abrégé en si ou ni) pour parcourir votre code machine.

103
R Samuel Klatchko

Au lieu de gdb, exécutez gdbtui. Ou exécutez gdb avec le -tui _ commutateur. Ou appuyez sur C-x C-a après avoir entré gdb. Vous êtes maintenant dans le mode TUI de la GDB.

Entrer layout asm pour que la fenêtre supérieure affiche Assembly - ceci suivra automatiquement le pointeur d’instruction, bien que vous puissiez également changer de cadre ou faire défiler les images pendant le débogage. presse C-x s pour entrer en mode SingleKey, où run continue up down finish etc. sont abrégés en une seule touche, ce qui vous permet de parcourir votre programme très rapidement.

 + ------------------------------------------------ ------------------------------- + 
 B +> | 0x402670 <main> Appuyez sur% r15 | 
 | 0x402672 <main + 2> mov% edi,% r15d | 
 | 0x402675 <main + 5> Appuyez sur% r14 | 
 | 0x402677 <main + 7> Appuyez sur% r13 | 
 | 0x402679 <main + 9> mov% rsi,% r13 | 
 | 0x40267c <main + 12> Push% r12 | 
 | 0x40267e <main + 14> Push% rbp | 
 | 0x40267f <main + 15> Push% rbx | 
 | 0x402680 <main + 16> sous $ 0x438,% rsp | 
 | 0x402687 <main + 23> mov (% rsi),% rdi | 
 | 0x40268a <main + 26> movq $ 0x402a10,0x400 (% rsp) | 
 | 0x402696 <main + 38> movq $ 0x0,0x408 (% rsp) | 
 | 0x4026a2 <main + 50> movq $ 0x402510,0x410 ( % rsp) | 
 + -------------------------------------------- ----------------------------------- + 
processus enfant 21518 Dans: Ligne principale: ?? PC: 0x402670
 (gdb) fichier /opt/j64-602/bin/jconsole
.Lecture des symboles à partir de /opt/j64-602/bin/jconsole...done.
(no débogage symboles trouvés) ... terminé. 
 (gdb) layout asm 
 (gdb) start 
 (gdb) 
142
ephemient

La chose la plus utile que vous puissiez faire ici est display/i $pc _, avant d’utiliser stepi comme déjà suggéré dans la réponse de Samuel Klatchko. Cela indique à gdb de désassembler l'instruction en cours juste avant d'imprimer l'invite à chaque fois; alors vous pouvez continuer à appuyer 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.)

23
Matthew Slattery