it-swarm-ja.com

gccは部分的なrelroを適用しません

CソースコードをコンパイルしてPartialRELROを適用し、PIEを有効にしてNXを無効にしようとしましたが、失敗しました。

再現手順

checksec スクリプトを使用して、バイナリのRELROオプションをチェックしました。

[email protected]:~$ 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.
[email protected]:~$ 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
[email protected]:~$ cat test.c
void main(){}
[email protected]:~$ gcc -fPIE -pie -z execstack -Wl,-z,relro -o partial test.c
[email protected]:~$ gcc -fPIE -pie -z execstack -Wl,-z,relro -Wl,-z,now -o full test.c
[email protected]:~$ objdump -h full > full.log
[email protected]:~$ objdump -h partial > partial.log
[email protected]:~$ diff full.log partial.log
2c2
< full:     file format elf64-x86-64
---
> partial:     file format elf64-x86-64
[email protected]:~$ 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

[email protected]:~$ 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
junsang

(ubuntu 18.04のデフォルトとして)PIE保護を強制すると、完全なRELROも強制されるようです。したがって、-no-pieの代わりに-fPIE -pieオプションを設定してください

1
gwel