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.