Linux

如何測試 Linux 二進製文件是否被編譯為與位置無關的程式碼?

  • April 16, 2019

我最近了解到(至少在 Fedora 和 Red Hat Enterprise Linux 上),編譯為與位置無關的執行檔 (PIE) 的可執行程序會獲得更強的地址空間隨機化 (ASLR) 保護。

那麼:如何在 Linux 上測試特定的執行檔是否被編譯為與位置無關的執行檔?

您可以使用包perl中包含的腳本,在 FedoraDebian中可用(as )。閱讀這個Debian wiki 頁面以了解有關檢查哪些編譯標誌的詳細資訊。它是 Debian 特有的,但該理論也適用於 Red Hat。hardening-check``hardening-includes

例子:

$ 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

只需file在二進製文件上使用:

$ 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

注意在 LSB 資訊之後列印的不同類型。

引用自:https://unix.stackexchange.com/questions/89211