Linux
如何測試 Linux 二進製文件是否被編譯為與位置無關的程式碼?
我最近了解到(至少在 Fedora 和 Red Hat Enterprise Linux 上),編譯為與位置無關的執行檔 (PIE) 的可執行程序會獲得更強的地址空間隨機化 (ASLR) 保護。
那麼:如何在 Linux 上測試特定的執行檔是否被編譯為與位置無關的執行檔?
您可以使用包
perl
中包含的腳本,在 Fedora和Debian中可用(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 資訊之後列印的不同類型。