.so Injektion unter Linux: Wie finde ich die Adresse von dlopen ()?

In letzter Zeit habe ich mich für Linux interessiert und versuche, ein Programm zu erstellen, das in der Lage ist, ein freigegebenes Objekt (z. B. .so-Datei, dynamisch ladbare Bibliothek, "DLL" unter Windows) zu injizieren eine Umgebungsvariable, aber ich möchte es auf einem Prozess tun, der bereits ausgeführt wird.

Ich weiß bereits, wie das unter Windows geht. Es gibt verschiedene Möglichkeiten, aber im Allgemeinen können Sie LoadLibrary () aufrufen, indem Sie mit CreateRemoteThread () einen Remote-Thread erstellen. Natürlich benötigen Sie die Adresse von LoadLibrary im Remote-Prozess, aber (meiner Erfahrung nach) ist sie für jeden Prozess immer auf dem gleichen Offset.

Ich habe einige Nachforschungen angestellt, wie dies unter Linux möglich ist. Zum Beispiel eine interessanteArtikel in Phrack 59 zeigt, wie das gemacht werden kann. Dem Artikel ist auch ein Quellcode beigefügt, aber da einige Annahmen über den Zielprozess getroffen wurden und es sich um 32-Bit handelt, konnte ich ihn nicht zum Laufen bringen. Andere Dinge, auf die ich gestoßen bin:ein Codeprojekt Artikel, aber dieser erklärt nur, wie es in gdb gemacht wird. (Ich würde mehr Links posten, aber die Website beschränkt mich auf 2: - /.)

Zu Beginn möchte ich die Adresse der Funktion dlopen () im Remote-Prozess erhalten. Dazu musste ich den ELF-Header des Prozesses abrufen und die Symboltabellen durchlaufen. Eigentlich habe ich das geschafft, indem ich:

1) Beziehen des ELF-Headers (nach meiner Erfahrung unter 64 Bit bei 0x400000 gespeichert)

2) Lokalisieren der globalen Versatztabelle im Programmkopf, der als DYNAMISCH markiert ist.

3) Abrufen der ersten link_map durch Zugriff auf den zweiten Eintrag in der globalen Versatztabelle.

4) Durchlaufen der dynamischen Abschnitte der link_map-Kette, um die Adresse der String-Tabelle, der Symboltabelle und der Hash-Tabelle zu erhalten (* Hash_Table + 0x4 enthält die Anzahl der Einträge in der Symboltabelle.)

5) Durchlaufen der Symboltabelle

Einige Beispielausgaben aus meinem Programm:

** looking at lib "" **
   Trying to find symbol main in symbol table... numentries: 49

index 1 name:  val: 0
...
index 49 name: memcpy val: 0
 symbol not found.

** looking at lib "" **
   Trying to find symbol main in symbol table... numentries: 11
index 1 name:  val: 0
...
index 11 name: __vdso_time val: 0xffffffffff700a80
 symbol not found.

** looking at lib "/lib/x86_64-linux-gnu/libc.so.6" **
   Trying to find symbol main in symbol table... numentries: 2190
index 1 name:  val: 0
...
index 2190 name: wcpcpy val: 0xa3570
 symbol not found.

Ich kann jedoch keine gültige Adresse von dlopen finden! (Oder auch die Adresse von main!) Zu Testzwecken lasse ich das Programm sich selbst analysieren, damit ich sicher weiß, dass main existiert. Ich habe auch readelf -s ausprobiert, um mir die Symboltabellen anzuschauen, und es zeigt:

Symbol table '.symtab' contains 151 entries:
   Num:    Value          Size Type    Bind   Vis      Ndx Name
   ...
   149: 0000000000401880   216 FUNC    GLOBAL DEFAULT   13 main

Also, irgendwie hat es readelf geschafft, main zu finden, während ich es nicht kann. Ich habe mir auch die libelf-Bibliothek angesehen, aber das hängt vom Lesen der Anwendungsdatei ab, anstatt auf den Speicher des Prozesses zuzugreifen (dh er kann nicht verwendet werden, während ein Prozess ausgeführt wird.) Hat jemand eine Ahnung, wie ich ihn finden kann Dlopen () in einem Remote-Prozess oder sogar Main, für diese Angelegenheit?

Ich verwende Ubuntu 12.04 64bit.

Antworten auf die Frage(3)

Ihre Antwort auf die Frage