Laden der Adresse einer ELF-Binärdatei, dlopen funktioniert nicht wie erwartet

8

Ich versuche die geladene Adresse einer ELF-Binärdatei zu erhalten, aber dlopen nicht arbeite wie erwartet:

%Vor%

Er gibt 0xb772d918 aus, aber von dem /proc/1510/maps sagt, dass er nicht auf die geladene Adresse der dlfn -Datei zeigt, sondern auf die ld-2.15.so ,

%Vor%

Gibt es anders als das Parsen von /proc/pid/maps eine Möglichkeit, die geladene Adresse einer ELF-Binärdatei abzurufen? (0x0848000 in diesem Fall)

    
daisy 18.10.2013, 14:10
quelle

1 Antwort

11

Unter Linux gibt dlopen nicht die Adresse zurück, an der die ELF-Binärdatei geladen wurde. Es gibt stattdessen struct link_map zurück, das .l_addr member hat. Du willst also etwas wie:

%Vor%

Trotz des Kommentars in /usr/include/link.h ist .l_addr jedoch auch keine Ladeadresse. Stattdessen ist es die Differenz zwischen wo und ELF-Bild geladen wurde, und wo es tatsächlich geladen wurde.

Für nicht ausführbare PIE-Hauptdateien ist diese Differenz immer 0. Bei nicht vorgemerkener gemeinsam genutzter Bibliothek ist diese Differenz immer die Ladeadresse (weil nicht vorgelagerte gemeinsam genutzte ELF-Bibliotheken zum Laden unter Adresse 0 verknüpft sind).

Wie finden Sie die Basisadresse der Hauptdatei? Die einfachste Methode ist es, diesen Code (in die Hauptdatei ausführbar) zu verwenden:

%Vor%

Hier ist, was Sie auf 32-Bit-System sehen sollten:

%Vor%

(Die letzte Adresse: 0xf779a000 wird von Lauf zu Lauf variieren, wenn Sie die Adressrandomisierung aktiviert haben (wie Sie sollten)).

    
Employed Russian 21.10.2013, 02:56
quelle

Tags und Links