GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Wie kann man testen, ob eine Linux-Binärdatei als positionsunabhängiger Code kompiliert wurde?

Sie können den perl verwenden Skript, das in hardening-check enthalten ist Paket, verfügbar in Fedora und Debian (als hardening-includes ). Lesen Sie diese Debian-Wiki-Seite für Details darüber, welche Kompilier-Flags überprüft werden. Es ist Debian-spezifisch, aber die Theorie gilt auch für Red Hat.

Beispiel:

$ hardening-check $(which sshd)
/usr/sbin/sshd:
 Position Independent Executable: yes
 Stack protected: yes
 Fortify Source functions: yes (some protected functions found)
 Read-only relocations: yes
 Immediate binding: yes

Verwenden Sie einfach file auf der Binärdatei:

$ file ./pie-off
./pie-off: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 2.6.32, BuildID[sha1]=0dc3858e9f0334060bfebcbe3e854909191d8bdc, not stripped
$ file ./pie-on
./pie-on: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 2.6.32, BuildID[sha1]=962235df5bd188e1ec48c151ff61b6435d395f89, not stripped

Beachten Sie den unterschiedlichen Typ, der nach den LSB-Informationen gedruckt wird.


Ich habe readelf --relocs verwendet Um zu testen, ob die statische oder dynamische Bibliothek PIC auf x86-64 ist, gehen Sie folgendermaßen vor:

$ readelf --relocs /usr/lib/gcc/x86_64-linux-gnu/4.6/libstdc++.a |\
      awk '$3~/^R_/ && $5!~/^\.debug/{print $3}' |sort -u
R_X86_64_32
R_X86_64_32S
R_X86_64_64
R_X86_64_DTPOFF32
R_X86_64_GOTPCREL
R_X86_64_PC32
R_X86_64_PLT32
R_X86_64_TLSLD
R_X86_64_TPOFF32

Wir sehen hier R_X86_64_32 und R_X86_64_32S . Das bedeutet, dass der Code nicht positionsunabhängig ist. Wenn ich eine Bibliothek mit -fPIC neu aufbaue, erhalte ich:

$ readelf --relocs libstdc++.a |\
      awk '$3~/^R_/ && $5!~/^\.debug/{print $3}' |sort -u
R_X86_64_64
R_X86_64_DTPOFF32
R_X86_64_GOTPCREL
R_X86_64_PC32
R_X86_64_PLT32
R_X86_64_TLSGD
R_X86_64_TLSLD

Diese Methode funktioniert wahrscheinlich für ausführbare Dateien, aber ich habe sie nicht auf diese Weise verwendet.


Linux
  1. Wie Linux eine Schule pandemiefähig machte

  2. Wie das Lernen von Linux unsere Liebessprache ist

  3. Wie ich mein altes Betriebssystem aufgegeben und zu Linux gesprungen bin

  4. So testen Sie ein Paket, ohne es unter Linux zu installieren

  5. Linux – Wie testet man, ob eine Linux-Binärdatei als positionsunabhängiger Code kompiliert wurde?

Wie ich Tetris auf dem Mainframe spiele

Wie der Linux-Desktop gewachsen ist

So verwenden Sie Bash-Dateitestoperatoren in Linux

So führen Sie ein .run- oder .bin-Paket unter Linux aus

Wie kann ich C++-Code profilieren, der unter Linux ausgeführt wird?

Wie kann ich feststellen, ob mein Linux-Computer gehackt wurde?