Ausführbare Dateien im Vergleich zu gemeinsam genutzten Objekten

13

Mir ist dabei etwas aufgefallen find /bin -exec file {} \;:

Der fileBefehl meldet einige Einträge in /binsind shared objects, während andere als executables. Zum Beispiel,

/ bin / ntfsck: Gemeinsam genutztes
ELF-64-Bit-LSB- Objekt , x86-64, Version 1 (SYSV),
dynamisch verknüpft (verwendet gemeinsam genutzte Bibliotheken), für GNU / Linux 2.6.24, BuildID [sha1] = 312d93fd0d8653e7236a61db2e67b93c63225a00, entfernt

Gleicher Bericht für gawk

/ usr / bin / gawk: Gemeinsam genutztes
ELF-64-Bit-LSB- Objekt , x86-64, Version 1 (SYSV),
dynamisch verknüpft (verwendet gemeinsam genutzte Bibliotheken), für GNU / Linux 2.6.24,
BuildID [sha1] = 76bb13aac7e212164bd6e0d7b8a5d92db44543c9, entfernt

Im Gegensatz dazu ist filefür /bin/echo:

/ bin / echo:
ELF 64-Bit - LSB ausführbar , x86-64, Version 1 (SYSV),
dynamisch gelinkt (verwendet Shared Libs), für GNU / Linux 2.6.24,
BuildID [SHA1] = 193e75fc13e9c4599e772b8d79125a5934cf601c, gestrippt

Im Wesentlichen möchte ich wissen, was der Unterschied zwischen executableDateien und shared objectDateien ist.

Sergiy Kolodyazhnyy
quelle

Antworten:

14

Tl; dr

Abgesehen von der Tatsache, dass eine kompilierte ausführbare Datei möglicherweise mit einem gemeinsam genutzten Objekt, jedoch nicht mit einer ausführbaren Datei verknüpft ist, besteht kein Unterschied.


Im Allgemeinen gibt es zwei Möglichkeiten, 1 eine ausführbare Datei zu kompilieren :

  • Verwenden der statischen Verknüpfung: Externe Bibliotheken, die im Quellcode enthalten sind, werden kompiliert und die kompilierte Bibliothek (oder das Objekt in der Perspektive des Linkers) wird der ausführbaren Datei selbst hinzugefügt.
  • Verwenden dynamischer Verknüpfungen: Externe Bibliotheken, die im Quellcode enthalten sind, werden kompiliert , der ausführbaren Datei wird jedoch eine Verknüpfung zur kompilierten Bibliothek (oder zum Objekt in der Perspektive des Linkers) hinzugefügt (und die kompilierten Bibliotheken / Objekte werden vom Linker zur Laufzeit geladen, wenn erforderlich);

Jede dieser Methoden hat Vor- und Nachteile, aber darum geht es nicht.

  • /bin/ntfsckund /usr/bin/gawksind gemeinsam genutzte Objekte: Dies bedeutet, dass eine ausführbare Datei kompiliert und dann mit ihnen verknüpft werden kann, um ihre Funktionen zu nutzen.
  • /bin/echoist eine ausführbare Datei: Dies bedeutet, dass eine ausführbare Datei möglicherweise nicht kompiliert und dann mit ihr verknüpft wird, um ihre Funktionen zu nutzen.

So /bin/ntfsckund /usr/bin/gawksind technisch kompilierten Bibliotheken (oder Objekte in der Perspektive des Linkers), aber, wie man forsaw haben kann, nichts verhindert , dass ein gemeinsam genutztes Objekt aus als ausführbaren Datei ausgeführt wird.

Beachten Sie nebenbei auch, dass fileBerichte (für jeden von ihnen):

dynamisch verknüpft (verwendet gemeinsam genutzte Bibliotheken)

Dies bedeutet, dass jeder von ihnen dynamisch mit anderen gemeinsam genutzten Objekten verknüpft ist (und diese wahrscheinlich auch verwendet).


1. "Kompilieren" im weiteren Sinne, einschließlich Vorverarbeitung, Kompilieren und Verknüpfen.

kos
quelle
1
dynamisch mit anderen freigegebenen Objekten verknüpft , IN OS? oder gemeinsam genutzte Bibliotheken an sich ?!
Dr.jacky
@ Mr.Hyde Im Betriebssystem, genauer gesagt an Orten, die im Linker vorkonfiguriert werden müssen, damit der Linker sie bei Bedarf zur Laufzeit laden kann. Siehe hier , Kapitel 3.2.
Kos
Man kann tatsächlich mit dlopen gegen eine ausführbare Datei verlinken: D Beispiel
Adam Zahran
6

Ein weiterer Unterschied besteht darin, dass ausführbare Dateien einen definierten Einstiegspunkt-Adressoffset haben, dh 0x08048000 für i386, 0x00400000 für x86 und 0x00010000 für arm.

Eine gemeinsam genutzte Objektdatei kann eine Bibliothek, aber auch eine ausführbare Datei sein. Wenn es sich um eine ausführbare Datei handelt, gibt es keinen solchen Offset. Eine gemeinsam genutzte ausführbare Objektdatei ist sozusagen eine positionsunabhängige ausführbare Datei (Positional Independent Executable, PIE), die die Adressraum-Layout-Randomisierung (ASLR) verwendet. Wenn Sie sich also die Datei / proc / pid / maps ansehen, werden Sie feststellen, dass die Position der geladenen Segmente bei jeder Ausführung anders ist als bei den Standard-ausführbaren Dateien.

Die Idee hinter dieser Funktion ist, ausführbare Dateien sicherer zu machen, indem Angreifer daran gehindert werden, Angriffe mit renditeorientierter Programmierung auszuführen. Viele Betreuer haben sich entschlossen, Pakete mit standardmäßig aktiviertem PIE zu erstellen, z. B. seit Fedora 23 oder mit Ubuntu 17.10.

florian
quelle
Interessante Antwort. Es fehlen ein paar Quellen (wäre schön, wenn Sie ein paar Links hinzufügen würden, insbesondere für den Einstiegspunktteil), aber ich habe ein paar Stapelüberlauf-Fragen dazu gesucht. Aber auf jeden Fall eine gute Antwort.
Sergiy Kolodyazhnyy