gcc 不塗抹部分 relro

gcc 不塗抹部分 relro

我嘗試編譯 C 原始碼以應用 Partial RELRO、啟用 PIE 並停用 NX 但失敗。

重現步驟

我用了檢查安全用於檢查二進位檔案的 RELRO 選項的腳本。

wisedier@ubuntu:~$ gcc --version
gcc (Ubuntu 7.3.0-27ubuntu1~18.04) 7.3.0
Copyright (C) 2017 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
wisedier@ubuntu:~$ uname -a
Linux ubuntu 4.15.0-46-generic #49-Ubuntu SMP Wed Feb 6 09:33:07 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux
wisedier@ubuntu:~$ cat test.c
void main(){}
wisedier@ubuntu:~$ gcc -fPIE -pie -z execstack -Wl,-z,relro -o partial test.c
wisedier@ubuntu:~$ gcc -fPIE -pie -z execstack -Wl,-z,relro -Wl,-z,now -o full test.c
wisedier@ubuntu:~$ objdump -h full > full.log
wisedier@ubuntu:~$ objdump -h partial > partial.log
wisedier@ubuntu:~$ diff full.log partial.log
2c2
< full:     file format elf64-x86-64
---
> partial:     file format elf64-x86-64
wisedier@ubuntu:~$ checksec --file full
RELRO           STACK CANARY      NX            PIE             RPATH      RUNPATH  Symbols     FORTIFY Fortified   Fortifiable  FILE
Full RELRO      No canary found   NX disabled   PIE enabled     No RPATH   No RUNPATH   66 Symbols     No   0       0   full

wisedier@ubuntu:~$ checksec --file partial
RELRO           STACK CANARY      NX            PIE             RPATH      RUNPATH  Symbols     FORTIFY Fortified   Fortifiable  FILE
Full RELRO      No canary found   NX disabled   PIE enabled     No RPATH   No RUNPATH   66 Symbols     No   0       0   partial

預期的正確行為是什麼?

我預計使用部分 RELRO 選項編譯的二進位檔案的 checksec 結果顯示部分RELRO且 objdump 結果之間存在一些差異。

我錯過了什麼嗎?如果您知道要取得部分 RELRO 二進位檔案或相關資訊的解決方案,請告訴我。

答案1

看來如果你強制 PIE 保護(作為 ubuntu 18.04 中的預設),它也會強製完全 RELRO。所以設定-no-pie選項而不是-fPIE -pie

相關內容