wake-up-neo.com

Die Verwendung von gdb für einen Einzelschritt-Assembler-Code außerhalb der angegebenen ausführbaren Datei verursacht den Fehler "Die Grenzen der aktuellen Funktion können nicht gefunden werden".

Ich bin außerhalb der ausführbaren Datei von gdb und habe nicht einmal einen Stack, der diesem Ziel entspricht. Ich möchte trotzdem einen Schritt ausführen, damit ich überprüfen kann, was in meinem Assembly-Code vor sich geht, da ich kein Experte für x86-Assembly bin. Leider lehnt gdb dieses einfache Debuggen auf Assembly-Ebene ab. Es ermöglicht mir, einen geeigneten Haltepunkt festzulegen und anzuhalten. Sobald ich jedoch versuche, einen Schritt weiterzugehen, meldet gdb den Fehler "Kann Grenzen der aktuellen Funktion nicht finden" und die EIP ändert sich nicht.

Zusätzliche Details:

Der Maschinencode wurde von gcc asm-Anweisungen generiert und von der Ausgabe von objdump -d in den Kernelspeicher kopiert, in dem er ausgeführt wird. Es würde mir nichts ausmachen, mit einem Loader meinen Objektcode auf eine verschobene Adresse zu laden, aber ich denke, dass das Laden in einem Kernelmodul erfolgen muss.

Ich nehme an, dass eine andere Alternative darin besteht, ein falsches Kernelmodul oder eine Debug-Info-Datei zu erstellen, die an gdb übergeben wird, um zu veranlassen, dass dieser Bereich im Programmcode enthalten ist. GDB funktioniert einwandfrei auf dem Kernel selbst ausführbar.

(Für diejenigen, die es wirklich wissen wollen, füge ich Code zur Laufzeit in den Linux-Kernel-Datenraum innerhalb einer VMware ein VM= und debugge ihn von gdb aus, um den Kernel über die in VMware Workstation integrierte gdb zu debuggen stub. Hinweis: Ich schreibe keine Kernel-Exploits, ich bin ein Student der Sicherheitsstufe und schreibe einen Prototyp.)

(Ich kann für jede Anweisung in meiner Assembly einen Haltepunkt festlegen. Dies funktioniert, ist jedoch nach einer Weile recht mühsam, da die Größe der x86-Assemblyanweisungen variiert und sich der Speicherort der Assembly bei jedem Neustart ändert.)

79
Paul

Sie können stepi oder nexti (abgekürzt als si oder ni) verwenden, um Ihren Maschinencode durchzugehen.

103

Führen Sie statt gdbgdbtui aus. Oder führen Sie gdb mit dem -tui Schalter. Oder drücken Sie C-x C-a nach Eingabe von gdb. Jetzt befinden Sie sich im TUI -Modus von GDB.

Eingeben layout asm, damit das obere Fenster Assembly anzeigt - Dies folgt automatisch Ihrem Anweisungszeiger, obwohl Sie beim Debuggen auch Frames ändern oder einen Bildlauf durchführen können. Drücken Sie C-x s um in den SingleKey-Modus zu gelangen, wobei run continue up down finish usw. werden mit einer einzigen Taste abgekürzt, sodass Sie Ihr Programm sehr schnell durchlaufen können.

 + -------------------------------------------- ------------------------------- + 
 B +> | 0x402670 <main>% r15 | [drücken. ____.] | 0x402672 <main + 2> mov% edi,% r15d | 
 | 0x402675 <main + 5> Push% r14 | 
 | 0x402677 <main + 7> Push% r13 | 
 | 0x402679 <main + 9> mov% rsi,% r13 | 
 | 0x40267c <main + 12> Push% r12 | 
 | 0x40267e <main + 14> Push% rbp | 
 | 0x40267f <main + 15>% rbx | 
 | 0x402680 <main + 16> unter $ 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) | 
 + ------------------------------------ ----------------------------------- + 
untergeordneter Prozess 21518 In: Hauptzeile: ?? PC: 0x402670
 (gdb) -Datei /opt/j64-602/bin/jconsole[.____.[Reading symbols from /opt/j64-602/bin/jconsole...done.[.____.‹(no debugging gefundene symbole) ... fertig. 
 (gdb) layout asm 
 (gdb) start 
 (gdb) 
142
ephemient

Das Nützlichste, was Sie hier tun können, ist display/i $pc, bevor stepi verwendet wird, wie bereits in R Samuel Klatchkos Antwort vorgeschlagen. Dies weist gdb an, die aktuelle Anweisung vor jedem Ausdruck der Eingabeaufforderung zu zerlegen. dann können Sie einfach die Eingabetaste gedrückt halten, um den Befehl stepi zu wiederholen.

(Siehe meine Antwort auf eine andere Frage für weitere Einzelheiten - der Kontext dieser Frage war unterschiedlich, aber das Prinzip ist dasselbe.)

23