20 Stimmen

Verwendung von GDB ohne Debugging-Symbole auf x86?

Wie benutze ich GDB, um ein Programm zu debuggen, das keine Debugsymbole auf einem 32-Bit x86-Prozessor hat? Es wäre nützlich zu wissen, wie man die Funktionsargumente, lokale Variablen und Zeiger auflöst. Die Absicht ist nicht wirklich, dies für Reverse Engineering zu verwenden, da ich manchmal einfach zu faul bin, die Debugging-Symbole zu installieren, und es wäre toll zu wissen, wie man einige grundlegende Informationen aus GDB herausbekommt.

30voto

RandomNickName42 Punkte 5809

Für den Anfang können Sie das tun;

gdb "whatever"
break __libc_start_main
r

die einen Haltepunkt im crt0-Code von libc setzt und es Ihnen ermöglicht, vor main zu brechen, selbst wenn die Ziel-Binärdatei vollständig gestrippt ist.

Das bringt Sie zu einem laufenden Zustand an einem Haltepunkt vor dem meisten Anwendercode. Dann können Sie nach Herzenslust Einzelschritte, Dissasemblierungen, Speicherauszüge usw. durchführen.

Dies funktioniert auf allen Plattformen, die Tatsache, dass Sie nach IA-32 / x86 fragen, spielt keine Rolle.

0 Stimmen

Sehr schön. Es wäre cool, zu erwähnen, dass "disassemble" ein gdb-Befehl ist, der ASM dumpt. Jetzt können Sie den ASM-Code lesen (oder, in meinem Fall, ansehen)! Juhu!

2 Stimmen

Hier ist eine schöne Anleitung über das Debuggen von gestrippten Binärdateien mit GDB.

7voto

Draemon Punkte 32703

Ohne Debugging-Symbole können Sie nur auf ASM-Ebene debuggen. Sie erhalten also eine bit mehr Informationen, aber Sie werden nicht sehr weit kommen, wenn Sie nicht ein wenig von ASM und dem vom Compiler erzeugten Code verstehen. So können Sie eine einfache Inspektion der lokalen Variablen usw. durchführen wenn Sie wissen, was Sie tun.

Wenn Sie den Quellcode haben, ist es viel einfacher, ihn einfach neu zu kompilieren.

0 Stimmen

+1, GDB auf einer ohne Symbole kompilierten Binärdatei (oder sogar einer ausreichend optimierten Binärdatei) funktioniert am besten als Debugger auf Assembler-Ebene - eine Aufgabe, die es einigermaßen gut bewältigen kann.

1voto

Ana Betts Punkte 72423

Alles, was Sie tun können, ist, sich die Register und den Inhalt des Stacks anzuschauen - Sie müssen alles tun, indem Sie ableiten, wofür die Dinge verwendet werden, wie Draemon erwähnt hat.

1voto

SamB Punkte 8630

Nun, das absolut Wichtigste ist, dass Sie den Stapel abwickeln können. Es gibt drei Möglichkeiten, dies zu gewährleisten:

  • Debugging-Symbole erstellen mit -g

  • Auf Systemen, die C++-Ausnahmen über Tabellen abwickeln (wahrscheinlich alles, was heutzutage ELF ist?), wird die -funwind-tables Flag wird es veranlassen, solche Tabellen unabhängig von der Sprache zu erzeugen, und GDB kann diese Tabellen verwenden (zumindest unter x86-Linux).

  • Oder, falls dies nicht möglich ist, stellen Sie zumindest sicher, dass -fomit-frame-pointer nicht aktiviert ist

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X