質問: gccは部分的なrelroを適用しません cソースコードをコンパイルしてpartialrelroを適用し、pieを有効にしてnxを無効にしようとしましたが、失敗しました。再現手順 checksec スクリプトを使用して、バイナリの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バイナリまたは関連情報を取得するための解決策を知っている場合は、私に知らせてください。
回答: (ubuntu 18.04のデフォルトとして)pie保護を強制すると、完全なrelroも強制されるようです。したがって、-no-pieの代わりに-fpie -pieオプションを設定してください