2017-05-03 7 views
3

Ich arbeite an Linux X86_64.Adresse von PLT Stub finden

Ich muss die Adresse eines bestimmten PLT-Eintrags in einer ELF-Datei ermitteln, die den Namen der dynamischen Funktion angibt, die der Eintrag darstellt. Ich kann den Datei-Offset von der Adresse herausfinden, aber ich muss in der Lage sein, die Adresse zu bestimmen.

Wenn ich die ELF-Datei mit objdump -D -z elffile zerlegen sehe ich, dass objdump symbolische Namen für jeden Eintrag in der PLT verwendet. (Wo kommt objdump die Beziehung zwischen diesen Adressen und den Symbolnamen zu erhalten?)

Beispiel:

0000000000000041a2b0 [email protected]: 

Wenn ich objdump -T elffile | grep fileno verwende ich so etwas wie dieses:

0000000000000 DF *UND* 00000000000000000 GLIBC_2.2.5 fileno 

Was muss ich aus "C" tun können, ist der PLT-Eintrag in der ELF-Datei für eine bestimmte dynamische Funktion zu finden und die Adresse zu erhalten.

Der Hintergrund ist, dass ich eine vorhandene ELF-Datei patchen und einen Funktionsaufruf zu einer anderen dynamischen Funktion umleiten muss. Ich habe manuell eine ELF-Datei mit Adressen aus objdump Disassembly gepatcht und bewiesen, dass dies für meine spezielle Anwendung funktioniert, ich muss nur in der Lage sein, es aus einem Programm zu tun. Ich hoffe, nicht durch objdump Disassembler-Code kriechen zu müssen, um herauszufinden, wie es die PLT-Eintragssymbole und -Adressen bekommt.

Antwort

1

Ich habe das herausgefunden: Sie müssen die Relocation-Tabelle im rela.plt-Abschnitt analysieren. Diese Einträge enthalten einen Zeichenfolgentabellenindex, der zum Suchen des Funktionsnamens durch Indexierung in den dynamischen Symbolabschnitt verwendet werden kann. Jeder Eintrag im dynamischen Symbolabschnitt enthält einen dynamischen Tabellenoffset, mit dem der Funktionsname abgerufen werden kann. Wenn Sie die entsprechende Funktion finden, entspricht der Index in der Umlagerungstabelle (+1) dem Index in den Abschnitt .plt für die Funktionen PLT-Eintrag. Um also die Adresse für einen bestimmten Eintrag zu berechnen, ist es nur: .plt.sec Adresse + ((relocation_index + 1) * .plt Eintragsgröße)

Diese Methode funktioniert für x86. Es funktioniert nicht für PPC, die ein völlig anderes Format für den .plt-Abschnitt hat. Wenn jemand irgendwelche Informationen darüber hat, dies für PPC zu tun, bitte posten.

+0

Hinweis für i386, die PLT-Eintragsgröße wird nicht korrekt gemeldet. Sie können die gemeldete PLT-Eintragsgröße entweder mit 4 multiplizieren oder 16 für die Eintragsgröße verwenden. – codemonkey