Partial RELRO를 적용하기 위해 C 소스 코드를 컴파일하고 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 결과가 표시될 것으로 예상했습니다.부분 RELROobjdump 결과에는 약간의 차이가 있습니다.
내가 뭔가를 놓쳤나요? 부분적인 RELRO 바이너리 또는 관련 정보를 얻는 솔루션을 알고 계시다면 알려주세요.
답변1
PIE 보호를 강제하면(우분투 18.04의 기본값) 전체 RELRO도 강제로 적용되는 것 같습니다. 따라서 -no-pie
대신 옵션을 설정하십시오 .-fPIE -pie