5 Stimmen

gdb trifft keine Haltepunkte

Um etwas mehr über FreeBSD und *nix-Systeme im Allgemeinen zu lernen, beginne ich, mir die Binärdateien des DEFCON 17 Capture The Flag-Spiels anzusehen. Im Moment bin ich dabei, die tucod-Binärdatei umzukehren. Hier sind einige möglicherweise nützliche Informationen über tucod:

tucod: ELF 32-bit LSB executable, Intel 80386, version 1 (FreeBSD), for FreeBSD 7.2, dynamically linked (uses shared libs), FreeBSD-style, stripped

Einige andere möglicherweise nützliche Informationen, die aus einer kurzen statischen Analyse gewonnen wurden, sind, dass tucod sich an Port 0xDEAD bindet (niedlich, nicht wahr?) und wenn Sie ihm ein bestimmtes Passwort geben ("HANGEMHIGH!"), wird es eine Partie Hang-Man mit Ihnen spielen.

Das Problem, auf das ich stoße, ist, dass ich meine Haltepunkte in gdb nicht treffe. Der Haltepunkt, den ich erreichen möchte, befindet sich in dem Code, der die Clientverbindung verarbeitet. Ohne Haltepunkte wird der Code wie erwartet ausgeführt. Wenn ich einen Haltepunkt in diesem Code setze, beendet sich das Child (anstatt wie erwartet in gdb zu wechseln). Wenn ich Haltepunkte setze, bevor der Server vom Child abzweigt, kann ich diese gut treffen, aber nachdem ich "continue" gedrückt habe, fährt das Child nicht fort, meine Verbindung zu verarbeiten (d.h. es fragt mich nicht nach einem Passwort oder spielt Hang-Man).

Da der Daemon sich gabelt, wenn er eine neue Verbindung erhält, versuche ich, gdb mit diesem Befehl anzuweisen, dem Kind zu folgen:

(gdb) set follow-fork-mode child

Aber nachdem ich die Anweisungen nach der Abzweigung einzeln durchgelesen habe, scheint dies nicht zu funktionieren.

Ich habe versucht, nach Aufrufen zu suchen signal Sie dachten, sie hätten einen eigenen SIGINT-Handler (oder etwas Ähnliches) implementiert, aber der einzige Aufruf an signal die ich sehen kann, behandelt SIGCHLD.

Mein Haltepunkt in gdb sieht derzeit wie folgt aus:

(gdb) info breakpoints
Num Type           Disp Enb Address    What
1   breakpoint     keep y   0x080497d0

Und 0x080497d0 ist die Adresse, bei der ich im Client-Verarbeitungscode eine Pause einlegen möchte.

Ich bin sozusagen neu in der Analyse von Software auf *nix-Systemen und könnte ein paar Hinweise gebrauchen. Wie sollte ich sonst bei der Fehlersuche vorgehen, wenn GDB meine Haltepunkte nicht trifft? Oder gibt es etwas Wichtiges, das ich einfach übersehe?

Es gibt eine torrent die mit allen Binärdateien des Spiels verfügbar sind, wenn Sie die Binärdateien aus erster Hand sehen möchten.

3voto

Nikolai Fetissov Punkte 79627

Siehe aquí für die Antwort. Kurz gesagt, es sieht so aus, dass GDB den Child-Debug-Modus nur unter HP-UX und Linux unterstützt.

0 Stimmen

Danke! Der Workaround, den ich dafür verwendet habe, war, die Binärdatei einfach zu patchen und den Elternteil den Teil des Kindes ausführen zu lassen. Für mich ist das einfacher, als zu versuchen, einen Aufruf von sleep hinzuzufügen, da ich keinen Quellcode habe. Aber eine Erklärung, was passiert, war das, wonach ich wirklich gesucht habe. Nochmals vielen Dank.

0 Stimmen

@Nikolai defekter Link

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