Welche Teile einer ausführbaren ELF-Datei werden wo in den Speicher geladen?


10

Was ich schon weiß:

Eine ausführbare ELF-Datei besteht aus mehreren Abschnitten. Offensichtlich werden die Abschnitte .text und .data in den Speicher geladen, da dies die Hauptteile des Programms sind. Damit ein Programm funktioniert, benötigt es jedoch mehr Informationen, insbesondere wenn es dynamisch verknüpft ist.

Was mich interessiert, sind Abschnitte wie .plt, .got, .dynamic, .dynsym, .dynstr usw. Die Teile des ELF, die für die Verknüpfung von Funktionen mit Adressen verantwortlich sind.

Was ich bisher herausfinden konnte, ist, dass Dinge wie .symtab und .strtab nicht im Speicher geladen werden (oder nicht bleiben). Aber werden .dynsym und und .dynstr vom Linker verwendet? Bleiben sie in Erinnerung? Kann ich über den Programmcode darauf zugreifen?

Und gibt es Teile einer ausführbaren Datei, die sich im Kernelspeicher befinden?

Mein Interesse daran ist hauptsächlich forensisch, aber alle Informationen zu diesem Thema werden helfen. Die Ressourcen, die ich über diese Tabellen und die dynamische Verknüpfung gelesen habe, sind auf höherer Ebene. Sie erklären nur die Funktionsweise und nichts Praktisches über den Inhalt im Speicher.

Lassen Sie mich wissen, wenn etwas über meine Frage unklar ist.

Antworten:


12

Das Folgende ist eine wirklich gute Referenz: http://www.ibm.com/developerworks/linux/library/l-dynamic-libraries/ . Es enthält eine Bibliographie am Ende einer Vielzahl verschiedener Referenzen auf verschiedenen Ebenen. Wenn Sie jedes Detail wissen möchten, können Sie direkt zur Quelle gehen: http://www.akkadia.org/drepper/dsohowto.pdf . (Ulrich Drepper hat den dynamischen Linux-Linker geschrieben.)

Sie können sich einen wirklich guten Überblick über alle Abschnitte in Ihrer ausführbaren Datei verschaffen, indem Sie einen Befehl wie "objdump -h myexe" oder "readelf -S myexe" ausführen.

Der Abschnitt .interp enthält den Namen des dynamischen Laders, mit dem die Symbole in diesem Objekt dynamisch verknüpft werden. Der Abschnitt .dynamic ist eine Destillation des Programm-Headers, die so formatiert ist, dass sie für den dynamischen Loader leicht zu lesen ist. (Es hat also Zeiger auf alle anderen Abschnitte.)

Die .got (Global Offset Table) und .plt (Procedure Linkage Table) sind die beiden Hauptstrukturen, die vom dynamischen Linker bearbeitet werden. Die .got ist eine Indirektionstabelle für Variablen und die .plt ist eine Indirektionstabelle für Funktionen. Jede ausführbare Datei oder Bibliothek (die als "gemeinsam genutzte Objekte" bezeichnet werden) verfügt über eine eigene .got und .plt. Dies sind Tabellen der Symbole, auf die von diesem gemeinsam genutzten Objekt verwiesen wird und die tatsächlich in einem anderen gemeinsam genutzten Objekt enthalten sind.

Die .dynsyn-Datei enthält alle Informationen zu den Symbolen in Ihrem freigegebenen Objekt (sowohl die von Ihnen definierten als auch die externen Symbole, auf die Sie verweisen müssen). Die .dynsyn-Datei enthält nicht die tatsächlichen Symbolnamen. Diese sind in .dynstr enthalten und .dynsyn hat Zeiger auf .dynstr. .gnu.hash ist eine Hash-Tabelle, mit der Symbole schnell nach Namen gesucht werden können. Es enthält auch nur Zeiger (Zeiger in .dynstr und Zeiger, die zum Erstellen von Bucket-Ketten verwendet werden.)

Wenn Ihr freigegebenes Objekt ein Symbol "foo" dereferenziert, muss der dynamische Linker in allen dynamischen Objekten, mit denen Sie verknüpft sind, nach "foo" suchen, um herauszufinden, welches das gesuchte "foo" enthält (und was der Verwandte ist) Die Adresse von "foo" befindet sich in diesem freigegebenen Objekt.) Der dynamische Linker durchsucht dazu den Abschnitt .gnu.hash aller verknüpften freigegebenen Objekte (oder den Abschnitt .hash nach alten freigegebenen Objekten ohne .gnu). Hash-Abschnitt.) Sobald die richtige Adresse im verknüpften freigegebenen Objekt gefunden wurde, wird sie in die .got- oder .plt-Datei Ihres freigegebenen Objekts eingefügt.


Vielen Dank, Ihre Links bringen mich einen Schritt weiter, um die virtuellen Zuordnungen der Abschnitte herauszufinden, die ich benötige. Da mein Interesse daran forensisch ist, ist "in DRAM geladen" für mich immer noch relevant. Wenn ein Abschnitt zugeordnet, aber nie geladen ist, kann ich ihn nicht in einem Speicherauszug finden :)
Dutchy

Du hast recht. Wenn Sie den Speicherauszug durchführen, erhalten Sie eine Kopie jeder zugeordneten Seite, sodass meine Unterscheidung zwischen "in VM zugeordnet" und "in DRAM geladen" irrelevant war. Ich habe diesen Satz entfernt und die Antwort wurde verbessert. Vielen Dank!
Wandering Logic

Markierte deine Antwort als Antwort, weil es so viele Informationen sind, wie ich bekommen werde :) Den Rest muss ich selbst erledigen, es ist schließlich meine Forschung.
Dutchy

Ja, .dynsym und und .dynstr (und andere) werden vom dynamischen Linker verwendet und in den Programmspeicher (im Textsegment) geladen und können zur Laufzeit von Ihrem Programm verwendet werden.
ysdx
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.