2010-11-30 22 views
6

Ich versuche also, das Objdump-Dienstprogramm zu verwenden, um ein Kontrollflussdiagramm aus der Assembly zu erstellen, und ich stoße auf ein Problem. Grundsätzlich, wenn eine Verzweigung auftritt und die Zieladresse relativ ist, bin ich nicht sicher, wie ich wissen soll, wo der nächste Basisblock beginnt. Ich bin mir nicht sicher, ob es mir klar ist, also füge ich ein Beispiel hinzu. Angenommen, mein Programm durchläuft die objdump-Ausgabe und hat die Startadresse für den ersten Basisblock aufgezeichnet. Es trifft dann einen Sprungbefehl, der die relative Adressierung verwendet, um auf die richtige Adresse zu zeigen, zu der gesprungen werden soll. Ich weiß, dass das Ende meines ersten Basisblocks genau dort auftritt, aber wie gehe ich vor, um die richtige Adresse für den Beginn des nächsten Basisblocks zu bekommen? Jede Führung, die jemand zur Verfügung stellen kann, wäre sehr zu begrüßen, ich bin bestenfalls ein x86-Neuling, und ich habe mir in der vergangenen Woche den Kopf dafür verkniffen.Ermitteln von Registerwerten bei der Verwendung von objdump

Antwort

4

Angenommen, ich verstehe die Frage, vielleicht wird dies Ihnen den Anfang machen. Relative Sprünge sind PC-basiert.

0xEB ist der Opcode für einen relativen Sprung basierend auf einem 8 Bit sofortigen. Die Adresse des Befehls befindet sich im objdump-Ausgang, in diesem Fall d oder 0xD. es ist ein Zwei-Byte-Befehl (x86 ist variable Länge). es teilt Ihnen in der Ausgabe mit, was die Zieladresse ist, in diesem Fall jmp 13. Suchen Sie also nach der Zeile in der objdump-Ausgabe, die mit 13 beginnt, und ein Doppelpunkt ist der Anfang dieses nächsten Codeblocks.

Um zu verstehen, wie diese Adresse berechnet wird. Der PC ist bei 0xD, wenn er anfängt, den Befehl zu holen, er benötigt zwei Bytes, so dass der PC bei 0xD + 2 = 0xF ist, wenn er bereit ist, diesen Befehl auszuführen. Der Offset ist 0x4, also 0xF + ​​0x4 = 0x13 die Zieladresse.

 
20: 75 ed jne f 

Gleiches gilt für rückwärts. pc plus Anzahl der Bytes = 0x20 + 2 = 0x22. 0xED ist eine vorzeichenbehaftete Zahl und ist negativ, also Zeichen extend 0xED bis 0xFFFFFFF ... FFFFED, wie groß auch immer Ihr Adressregister ist. Fügen Sie 0x22 + 0xFFFFFF ... FFFFED hinzu und Sie erhalten 0x0F die Zieladresse. Sie können auch 0xED nehmen, invertieren und 1 hinzufügen, um es zu negieren. ~ 0xED = 0x12, 0x12 + 1 = 0x13. Also 0xED bedeutet 0x13 subtrahieren. 0x22-0x13 = 0x0F.

Hier sind einige mehr, in jedem Fall gibt es Ihnen die Zieladresse, die Sie nur in der Objdump-Ausgabe suchen können.

Um zu verstehen, wie es diesen Wert berechnet. Die gleiche Geschichte, beginnen Sie mit Opcode bei 0x400A81, es dauert 6 Bytes in diesem Fall für die Anweisung mit variabler Länge. Wenn Sie also zur Ausführung bereit sind, ist der PC bei 0x400A81 + 6 = 0x400A87. Der Offset ist 0x107. Wenn die Bedingung erfüllt ist, lautet die Zieladresse 0x400A87 + 0x107 = 0x400B8E.

Beachten Sie, dass diese Dateien aus einem größeren Programm, nicht aus sequenziellem Code, sondern aus einer Sammlung isolierter Beispiele stammen.

 
    400a81: 0f 8f 07 01 00 00  jg  400b8e 
    400a8f: 0f 8f e6 00 00 00  jg  400b7b 
    400a9d: 0f 8f c5 00 00 00  jg  400b68 
    400aab: 0f 8f a4 00 00 00  jg  400b55 
    400ab9: 0f 8f 83 00 00 00  jg  400b42 
    401d76: 0f 8f 31 01 00 00  jg  401ead 
+0

Vielen Dank, das macht eine Menge von meinem Problem. Im Grunde sieht es so aus, als ob ich die objdump-Ausgabe, mit der ich arbeite, nicht ganz verstehe. Kennt jemand eine gute Quelle, um mehr über die Ausgabe von objdump zu lernen? – Sam

+0

Ich lese durch einige Ausgaben zurück, und das macht definitiv eine Menge klar. Ich bin immer noch unsicher über eine Zeile wie diese: 4020a6: \t ff 25 4c 8f 21 00 jmpq * 0x218f4c (% rip) # 61aff8 <_fini + 0x207840> Grundsätzlich sieht es so aus, als ob ich nicht ganz verstehe objdump output I arbeite mit. Kennt jemand eine gute Quelle, um mehr über die Ausgabe von objdump zu lernen? – Sam

+0

Ich würde sagen, was Sie suchen, ist Verständnis für x86 Assembler nicht unbedingt objdump. Der Opcode für diese spezifische Anweisung springt nicht auf mich (kein Wortspiel beabsichtigt), aber die Syntax impliziert für mich, dass es eine registerbasierte Sache ist, was bedeutet, dass die Zieladresse mit dem Inhalt von% rip zur Laufzeit einen Sprung macht Tisch im Grunde.Und da Sie diesen Code nicht ausführen, sondern ihn nur untersuchen, ist es möglicherweise nicht offensichtlich, was der Inhalt von% rip ist, und als Ergebnis können Sie nicht herausfinden, was die Zieladresse ist. –

Verwandte Themen