file
5.36 lo dice claramente
file
5.36 realmente lo imprime claramente si el ejecutable es PIE o no. Por ejemplo, un ejecutable PIE se muestra como:
main.out: ELF 64-bit LSB pie executable, x86-64, version 1 (SYSV), dynamically linked, not stripped
y no PIE como:
main.out: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), statically linked, not stripped
La característica se introdujo en 5.33 pero solo hizo una simple chmod +x
comprobación. Antes de eso solo se imprimió shared object
para PIE.
En 5.34, estaba destinado a comenzar a verificar los DF_1_PIE
metadatos ELF más especializados , pero debido a un error en la implementación, realmente rompió las cosas y mostró los ejecutables GCC PIE como shared objects
.
He interpretado el file
código fuente, incluido el error, y exactamente qué bytes del formato ELF verifica con un detalle insoportable en: https://stackoverflow.com/questions/34519521/why-does-gcc-create-a-shared-object -en lugar de un binario-ejecutable-de acuerdo a / 55704865 # 55704865
Un resumen rápido del comportamiento del archivo 5.36 es:
- Si
Elf32_Ehdr.e_type == ET_EXEC
- si no si
Elf32_Ehdr.e_type == ET_DYN
- si
DT_FLAGS_1
la entrada de sección dinámica está presente
- si
DF_1_PIE
se establece en DT_FLAGS_1
:
- más
- más
- si el archivo es ejecutable por usuario, grupo u otros
- más
GDB ejecuta el ejecutable dos veces y ve ASLR
Una cosa muy directa que puede hacer es ejecutar el ejecutable dos veces a través de GDB y ver si la dirección cambia a través de ejecuciones debido a ASLR.
He explicado cómo hacerlo en detalle en: https://stackoverflow.com/questions/2463150/what-is-the-fpie-option-for-position-independent-executables-in-gcc-and-ld/51308031 # 51308031
Si bien esta no es necesariamente la solución más práctica y no es posible si no confía en el ejecutable, es divertido y hace la comprobación final que realmente nos importa, que es si el kernel / cargador dinámico de Linux cambia la ubicación del ejecutable o no.