Intenté compilar el código fuente C para aplicar Partial RELRO, habilitando PIE y deshabilitando NX, pero fallé.
pasos para reproducir
solíachequesecscript para verificar la opción RELRO del binario.
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
¿Cuál es el comportamiento correcto esperado?
Esperaba que se mostrara el resultado de checksec para el binario compilado con la opción RELRO parcialRELRO parcialy existen algunas diferencias entre los resultados de objdump.
¿Me perdí algo? Si conoce una solución para obtener información binaria RELRO parcial o información relacionada, hágamelo saber.
Respuesta1
Parece que si fuerza la protección PIE (como la predeterminada en ubuntu 18.04), también fuerza el RELRO completo. Entonces configura -no-pie
la opción en lugar de-fPIE -pie