Tentei compilar o código-fonte C para aplicar o Partial RELRO, habilitando o PIE e desabilitando o NX, mas falhei.
Passos para reproduzir
eu useiverificaçãoscript para verificar a opção RELRO do binário.
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
Qual é o comportamento correto esperado?
Eu esperava que o resultado do checksec para o binário compilado com a opção RELRO parcial fosse exibidoRELRO Parciale existem algumas diferenças entre os resultados do objdump.
Eu perdi alguma coisa? Se você conhece uma solução para obter informações binárias RELRO parciais ou relacionadas, por favor me avise.
Responder1
Parece que se você forçar a proteção PIE (como padrão no Ubuntu 18.04), ela também forçará o RELRO completo. Então defina -no-pie
a opção em vez de-fPIE -pie