Ich bin außerhalb der ausführbaren Zieldatei von gdb und habe nicht einmal einen Stapel, der diesem Ziel entspricht. Ich möchte sowieso in einem Schritt arbeiten, damit ich überprüfen kann, was in meinem Assemblycode vor sich geht, da ich kein Experte für x86-Assembly bin. Leider weigert sich gdb, dieses einfache Debuggen auf Assembly-Ebene durchzuführen. Es ermöglicht mir, einen geeigneten Haltepunkt festzulegen und anzuhalten, aber sobald ich versuche, einen Schritt weiter zu machen, meldet gdb den Fehler "Grenzen der aktuellen Funktion können nicht gefunden werden" und die EIP ändert sich nicht.
Weitere Details:
Der Maschinencode wurde durch 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, einen einfachen Loader zu verwenden, um meinen Objektcode an eine verschobene Adresse zu laden, aber denken Sie daran, dass das Laden in einem Kernelmodul erfolgen muss.
Ich nehme an, eine andere Alternative wäre, ein gefälschtes Kernelmodul oder eine Debug-Info-Datei zu erstellen, die an gdb weitergegeben wird, um zu glauben, dass dieser Bereich im Programmcode enthalten ist. gdb funktioniert gut auf der ausführbaren Kernel-Datei selbst.
(Für diejenigen, die es wirklich wissen möchten, füge ich zur Laufzeit Code in den Linux-Kernel-Datenbereich innerhalb einer VMware-VM ein und debugge ihn vom GDB-Remote-Debugging des Kernels über den integrierten GDB-Stub von VMware Workstation. Hinweis: Ich schreibe keinen Kernel Exploits; Ich bin ein Sicherheitsstudent, der einen Prototyp schreibt.)
(Ich kann für jede Anweisung in meiner Assembly einen Haltepunkt festlegen. Dies funktioniert, wird 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.)
Antworten:
Sie können
stepi
odernexti
(was mitsi
oder abgekürzt werden kannni
) verwenden, um Ihren Maschinencode zu durchlaufen.quelle
start
ist gleichbedeutend mittbreak main
gefolgt vonrun
(Anmerkung:tbreak
anstelle vonbreak
)Statt
gdb
laufengdbtui
. Odergdb
mit dem-tui
Schalter laufen . Oder drücken Sie C-x C-anach der Eingabegdb
. Jetzt befinden Sie sich im TUI- Modus von GDB .Geben Sie
layout asm
die Eingabetaste ein , um die obere Fensteranzeige zu erstellen. Dies folgt automatisch Ihrem Anweisungszeiger. Sie können jedoch auch Frames ändern oder beim Debuggen einen Bildlauf durchführen. Drücken Sie C-x sSingleKey - Modus zu gelangen, worun continue up down finish
usw. zu einem einzigen Tasten abgekürzt, so dass Sie sehr schnell durch das Programm zu gehen.quelle
Das Nützlichste, was Sie hier tun können, ist
display/i $pc
, bevor Sie das verwenden,stepi
was bereits in der Antwort von R Samuel Klatchko vorgeschlagen wurde. Dies weist gdb an, die aktuelle Anweisung jedes Mal kurz vor dem Drucken der Eingabeaufforderung zu zerlegen. Dann können Sie einfach weiter die Eingabetaste drücken, um denstepi
Befehl zu wiederholen .(Siehe meine Antwort auf eine andere Frage für weitere Einzelheiten - der Kontext dieser Frage war anders, aber das Prinzip ist das gleiche.)
quelle