8.4 Ausgabeformate Standardmäßig druckt GDB einen Wert nach seinem Datentyp. Manchmal ist dies nicht, was Sie wollen. Beispielsweise möchten Sie vielleicht eine Zahl in Hex oder einen Zeiger in Dezimalzahl drucken. Oder Sie können Daten im Speicher an einer bestimmten Adresse als Zeichenfolge oder als Anweisung anzeigen. Um dies zu tun, geben Sie ein Ausgabeformat an, wenn Sie einen Wert drucken. Die einfachste Verwendung von Ausgabeformaten ist zu sagen, wie ein bereits berechneter Wert zu drucken. Dies geschieht durch das Starten der Argumente des Druckbefehls mit einem Schrägstrich und einem Formatbuchstaben. Die unterstützten Formatbuchstaben sind: x Betrachten Sie die Bits des Wertes als Ganzzahl und drucken Sie die Ganzzahl in Hexadezimal. D Ausdrucken als Integer in Dezimalzeichen. U Ausdruck als Integer in unsignierter Dezimalzahl. O Ausdruck als Integer im Oktal. T Integer als Ganzzahl ausgeben. Der Buchstabe t steht für zwei. (2) a Drucke als Adresse, sowohl absolut in hexadezimal als auch als Versatz aus dem nächsten vorhergehenden Symbol. Sie können dieses Format verwenden, um zu ermitteln, wo (in welcher Funktion) sich eine unbekannte Adresse befindet: Das Befehlsinfo-Symbol 0x54320 liefert ähnliche Ergebnisse. Siehe Abschnitt Info-Symbol. C Als Ganzzahl betrachten und als Zeichenkonstante ausdrucken. F Die Bits des Wertes als Gleitkommazahl betrachten und mit typischer Gleitkommasyntax drucken. Um beispielsweise den Programmzähler in hex zu drucken (siehe Abschnitt 8.10 Register), beachten Sie, dass vor dem Schrägstrich kein Platz benötigt wird, da Befehlsnamen in GDB keinen Schrägstrich enthalten können. Um den letzten Wert in der Werthistorie mit einem anderen Format nachzudrucken, können Sie den Druckbefehl mit nur einem Format und keinem Ausdruck verwenden. Beispielsweise gibt px den letzten Wert in hex. Ich habe GDB aber die binäre Ich möchte Reverse Engineer hat keine Symbole, das ist, wenn ich die Datei-Dienstprogramm zeigt es mir gestrippt: Welche Möglichkeiten habe ich, wenn die Umgebung, in der diese Läuft nicht zulassen, dass eine entfernte IDA Pro-Instanz eine Verbindung zu gdbserver herstellt. Kurz gesagt: Die Umgebung, die Sie haben, ist begrenzt, was es Ihnen erlaubt, zu tun, aber Sie haben vertrauenswürdige alte gdb und ein binäres Reverse Engineering. Gefragt Apr 27 13 at 3:13 Konventionen verwendet plus Vorbemerkungen Ich bin Trimmen der Ausgabe von GDB für die Kürze, da es in der Regel zeigt das Urheberrecht und andere Informationen zu Beginn der Sitzung. Wenn ich die Ausgabe Ill Start bei der ersten (gdb) Prompt Linie oder im Fall oder auto-executed Befehle aus der ersten echten Ausgangsleitung zu reproduzieren. Um Befehle, die an der GDB-Eingabeaufforderung eingegeben werden, zu unterscheiden, haben diese eine führende (gdb) wie in der realen Welt. Für Shell-Befehl ist dies entweder kein Präfix überhaupt oder wie es scheint die Konvention auf den meisten unixoiden Systemen. Wenn ich einen bestimmten Befehl, wie vim als mein Herausgeber verwenden, sind Sie frei, Ihren eigenen Lieblingsherausgeber natürlich zu verwenden. Sei es emacs oder nano. Ich werde nicht beurteilen ya) Erste Schritte Dieser Abschnitt geht es um die Einrichtung Ihrer gdb-Umgebung und starten Sie den Prozess. Ill auch ein paar Leckerbissen für die komplette Newcomer. Tricks, die Sie wissen sollten GDB hat eine nette Aufforderung, an der Ihr Cursor stoppt, nachdem das Programm bricht oder wann immer Sie treten oder einige solcher. Durch Drücken von RETURN (aka ENTER), nachdem Sie einen GDB-Befehl ausgeführt haben, wird derselbe Befehl erneut ausgeführt. Dies ist nützlich, wenn Sie mit Schritt oder Schritt durch Code gehen und einfach nur eins nach dem anderen fortsetzen möchten. Befehle können abgekürzt werden, solange sie eindeutig sind. Für einige häufig benutzte Befehle existiert eine bestimmte Abkürzung, die trotz Mehrdeutigkeit Vorrang hat: b für Pause (trotz bt und backtrace) c oder cont for fortsetzen (trotz catch. call und so weiter) n für next (trotz ni und nexti) Sie können anrufen Tatsächliche Bibliotheksfunktionen oder sogar Funktionen aus dem Debugging-Programm mit dem Befehl Aufruf. Dies bedeutet, dass Sie Verhalten oder Kraftverhalten ausprobieren können. Sie können GDB mit gdbtui oder gdb - tui starten, um eine - angeblich bequemere - visuellere Textoberfläche zu erhalten. Es zeigt den Quellcode an der Spitze und die (gdb) Aufforderung unten. Sie können auch zu diesem Layout wechseln, indem Sie das Befehlslayout src an der Eingabeaufforderung (gdb) ausführen. GDB hat eine Befehlszeilenvervollständigung Feature ähnlich wie viele Shells, so verwenden Sie Tab zu Ihrem Vorteil und auch sicherstellen, Hilfe oder Hilfe keywordcommand verwenden, wenn Sie Hilfe benötigen. Shell können Sie Befehle in der Shell ausführen, so dass Sie Befehle aus Ihrer GDB-Sitzung ausführen können. Bei der Entwicklung ein Beispiel wäre Shell machen. drucken. Untersuchen und anzeigen können verschiedene Formate (FMT), die Sie verwenden können, um die Ausgabe besser lesbar. Beim Quellcode-Debugging können Sie C-Werte verwenden, um Werte anzuzeigen. Stellen Sie sich eine C-Zeichenfolge hinter einer Leere (die GDB weiß, dank der Symbole in einem solchen Fall). Einfach ausdrucken (char) und ausdrucken: print (char) Variable. Der Prozess wird ausgeführt Da wir die Binärdatei dynamisch analysieren wollen, müssen wir sie zuerst starten. Befehlszeile Wir können das direkt über die Befehlszeile ausführen, indem wir nicht nur den Pfad zur Binärdatei übergeben, sondern auch die Argumente, mit denen wir beginnen wollen. Der ganze Prozess sieht dann so aus: Einfach genug. Von der Eingabeaufforderung (gdb) aus können Sie dann den auszuführenden Befehl run (shorthand r) ausführen. Exe mit den Parametern auf der Kommandozeile. Ich bevorzuge diese Methode, aber Ihre Laufleistung kann variieren. GDB-Aufforderung GDB aufrufen und an der Eingabeaufforderung (gdb) den Befehl file verwenden, um die Binärdatei zu laden und dann den Befehl run verwenden, um sie mit den Argumenten zu starten, die Sie übergeben möchten: Eine Alternative zu den oben genannten wäre die Verwendung von Set-Args This: Sie können auch auf jeden Fall sehen, welche Argumente auf den gestarteten Prozess übergeben würden, indem Sie a: btw: Wenn Sie über Umgebungsvariablen nachgedacht haben, verwenden Sie den integrierten Hilfe-Befehl von GDBs als Hilfesatz und Hilfe. Zeiger: Setzen Sie die Umgebung VARNAMEVALUE und zeigen Sie die Umgebung VARNAME und die ungeschaltete Umgebung VARNAME. Phew, aber warum hört das Programm mit einem SIGSEGV auf (Segmentfehler) Nun, wir wissen noch nicht, aber es sieht so aus, als ob dieses kleine Tier die richtige Behandlung will. Da wir Defensivcomputing praktizieren, wollen wir nicht alles laufen lassen, worüber wir nicht viel wissen. Wenn dies wäre Malware wed haben, um die Maschine zu spülen und neu installieren oder wiederherstellen einen Snapshot, wenn es ein VM-Gast. Der erste Befehl möchte den Info-Befehl wie folgt ausführen: Es gibt zwei wichtige Informationen, die für uns am wichtigsten sind: line, also können wir einen Breakpoint setzen und dann den Prozess mit den Argumenten ausführen schick..gdbinit für den Sieg Aber warten, das wird schon mühsam. Keine einfache Methode, um diese Schritte in irgendeiner Weise zu automatisieren In Wirklichkeit gibt es. Eine Datei mit dem Namen. gdbinit kann verwendet werden, um nach dem Start Befehle an GDB zu übergeben. Sie können auch eine Datei mit GDB-Befehlen über das Argument - x auf der (Shell-) Befehlszeile übergeben. Wenn ich eine Anzahl von Projekten habe, sind sie gewöhnlich in Unterordnern mit einer. gdbinit-Datei. Side-note: - nx verhindert, dass der. gdbinit-Inhalt beim Start ausgeführt wird. So wissen wir, welche Argumente wir übergeben wollen, und wir kennen die Adresse des Bruchpunktes, dies übersetzt in die folgende. gdbinit-Datei: Die Ausgabe, die ich bekomme, wenn ich gdb ohne andere Argumente starten: Nice Aber das sieht anders aus. Versammlung und GDB So youre verwendete, um die folgende Zeile zu sehen, die Sie ausführen werden und dann Ihre vertrauenswürdige alte (gdb) Aufforderung. Aber so etwas nicht. Wir haben keine Quelle für diese binäre und außerdem Symbole. Doh So betrachten wir die blinkende Caret an der (gdb) Prompt und frage mich, was zu tun ist. Dont Bundt, GDB kann auch Montage-Code. Nur Problem, es ist standardmäßig auf die - meiner Meinung nach - unbequeme ATampT-Assemblersyntax. Ich ziehe den Intel Geschmack und den folgenden Befehl sagt GDB genau das zu tun: Showings den Assembler-Code und wie wird es uns die Assembler-Code für den TUI-Modus Nun, ähnlich geht zu zeigen, (überprüfen Sie die Tag-Wiki für GDB) unter Verwendung der folgenden Befehl: und wenn Sie so geneigt sind, auch: das zeigt Ihnen auch den Inhalt der Register in einer Übersicht. Lass es wieder laufen So kommen wir mit dem folgenden. gdbinit für unsere Zwecke: Und wenn wir gdb ohne Argumente anfangen, haben wir das am Ende: Sweet. So können wir sehen, die Demontage, während wir Schritt durch den Code. Wir könnten das hier abschließen, aber natürlich gibt es noch mehr Tricks, die man lernen kann, warum also nicht ein wenig weiter gehen. HINWEIS: die Register mit weißem grauem Hintergrund zeigen, dass sich ein Wert geändert hat. Nicht so sinnvoll, wenn wir gerade das Programm gestartet, aber mächtig nützlich, wenn Schritt über Code später. wenn Sie btw, bevorzugen Bildschirm Anwesen zu sparen und haben es weniger visuell, beginnend mit GDB 7.0 können Sie: auf GDB-Versionen vor, dass Sie das Verhalten von Einstellungen eine automatische Anzeige emulieren kann: oder kürzer disp i pc, wo ich das Format ist, Können Sie sich daran erinnern, am besten durch Denken Anweisung und pc ist der Befehlszeiger, auch bekannt als Programm-Zähler - also PC. Auch gut zu wissen Manchmal beim Treppensteigen durch die Montage der regs und asm Ansichten erhalten borked. Führen Sie einfach die entsprechenden Layout-Befehle aus, um sie wieder in ihren alten Ruhm zurückzubringen: Debugging auf Baugruppenebene Stellt sich heraus, wenn Sie im Assemblierungsmodus sind, werden einige Befehle, die Sie von Quellcode-Debugging verwendet haben, einfach nicht funktionieren. Das macht Sinn, weil eine einzelne Source-Zeile bedeutet in der Regel ein Dutzend Anweisungen oder mehr. Die nächsten, und Schrittbefehle haben jedoch Instruction-Level Pendants: WEITERi (. Stenografie ni jemand anderes denken shrubbery) stepi (Stenografie si) Aus unserer Demontage oben wissen wir: und für alle praktischen Zwecke ist dies die wichtigste Funktion. Natürlich, wenn Sie Reverse Engineering Malware sollten Sie vorsichtiger sein, aber in diesem Fall ist es. So können Sie einen Haltepunkt an diese Adresse hinzufügen (0x40f961) anstelle des Einstiegspunkt: Wenn wir (Stenografie x) untersuchen den Code, an dem wir momentan sind, können wir sehen: Okay, der Anruf ist, was wir folgen wollen, so können Schritt Innerhalb von es mit si. Beim Eingeben der Funktion erhalten wir sofort einen weiteren Aufruf am Befehlszeiger: Der Aufruf führt zu einer Funktion, die ptrace aufruft (PTRACETRACEME.). jetzt, warum es tun würde, dass Nun, es ist eine alte Anti-Debugger Trick, der Mellowcandle in einem anderen QampA hier beschrieben hat: Aber wie kommen wir um ihn herum Mi haben, um den Anruf an die Funktion überschreiben, die ptrace () mit nop oder etwas ruft zusammen Diese Zeilen. Dies ist, wo GDB wird ein wenig schwerfällig. Aber wir können Satz verwenden, also tun die Magie für uns. Wir können die Befehlsbytes zunächst überprüfen: Die 0xe8 ist eine Aufrufanweisung und wir wissen jetzt, dass sie 5 Bytes lang ist. So läßt nop dieses heraus. (X 10b pc bedeutet 10 Byte im Programmzähler prüfen - Standardformat ist hex bereits). So tun wir, während gestoppt bei 0x40911f: und überprüfen Sie den gepatchten Standort: Excellent. Wir können es jetzt ausführen. Alternativen zu der gegebenen Methode Alternative zum Patchen: set 0x40911f 0x90909090 von Satz gefolgt 0x409123 den Programmzähler (Instruction Pointer) statt 0x90 Manipulieren: set pc5 oder expliziter Satz pcpc5 Sprung pc5 noch bessere Möglichkeiten, Patch das laufende Programm Es Alternative zu manipulieren ( Und Weg überlegen) Methoden wie diese von Tavis Ormandy. Im Reproduzieren der Assembler-Makro unten (falls es offline von der anderen Stelle): Wieder das obige Skript-Snippet wurde nicht von mir geschrieben, sondern von Tavis Ormandy - siehe den Link oben. Dies schließt dieses kleine QampA.
No comments:
Post a Comment