Hace poco aprendí que (al menos en Fedora y Red Hat Enterprise Linux), los programas ejecutables que se compilan como ejecutables independientes de posición (PIE) reciben una protección más fuerte de aleatorización del espacio de direcciones (ASLR).
Entonces: ¿Cómo pruebo si un ejecutable particular se compiló como un ejecutable independiente de posición en Linux?
-pie -fpie
indicadores especiales del compilador para compilar un programa como PIE. Sin embargo, ese enlace tenía otra información interesante, ¡gracias!Respuestas:
Puede usar el
perl
script contenido en elhardening-check
paquete, disponible en Fedora y Debian (ashardening-includes
). Lea esta página wiki de Debian para obtener detalles sobre qué marcas de compilación están marcadas. Es específico de Debian, pero la teoría también se aplica a Red Hat.Ejemplo:
fuente
sudo apt-get install hardening-includes
y luego elhardening-check
script perl ejecutable está disponible en el usualPATH
(/usr/bin/hardening-check
); solo un poco: Sugiera eliminar el./
de la respuesta ;-)devscripts
.Solía
readelf --relocs
probar si la biblioteca estática o dinámica es PIC en x86-64 de la siguiente manera:Vemos aquí
R_X86_64_32
yR_X86_64_32S
. Esto significa que el código no es independiente de la posición. Cuando reconstruyo una biblioteca con -fPIC obtengo:Este método probablemente funcione para ejecutables, pero no lo he usado de esa manera.
fuente
-fPIE -no-pie
, siempre se cargaría en la misma dirección, aunque podría haber sido vinculado como un ejecutable PIE. Usarfile a.out
y buscarELF executable
(no PIE) frente a objeto compartido ELF '(PIE): ¿ direcciones absolutas de 32 bits ya no se permiten en Linux x86-64?Simplemente use
file
en el binario:Tenga en cuenta el tipo diferente impreso después de la información LSB.
fuente
executable
yshared object
. Supongo que los objetos compartidos deben ser reubicables, por lo tanto, en mi opinión, se han compilado con PIE.gcc -fPIE -pie
ahora es el valor predeterminado en muchas distribuciones.file
5.36 ahora puede reconocer PIE-ness basado en laDT_1_PIE
bandera deDT_FLAGS_1
, y claramente dice enpie executable
lugar deshared object
.file
5.36 lo dice claramentefile
5.36 realmente lo imprime claramente si el ejecutable es PIE o no. Por ejemplo, un ejecutable PIE se muestra como:y no PIE como:
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 comoshared 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 # 55704865Un resumen rápido del comportamiento del archivo 5.36 es:
Elf32_Ehdr.e_type == ET_EXEC
executable
Elf32_Ehdr.e_type == ET_DYN
DT_FLAGS_1
la entrada de sección dinámica está presenteDF_1_PIE
se establece enDT_FLAGS_1
:pie executable
shared object
pie executable
shared object
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.
fuente
setarch -R
man7.org/linux/man-pages/man8/setarch.8.html "-R, --addr-no-randomize
Deshabilita la aleatorización del espacio de direcciones virtuales. Se activa "ADDR_NO_RANDOMIZE
. man7.org/linux/man-pages/man2/personality.2.html "ADDR_NO_RANDOMIZE
(desde Linux 2.6.12) Con este conjunto de indicadores, deshabilite la aleatorización del diseño del espacio de direcciones".Hay bash script checksec.sh en Github para verificar las propiedades de mitigación de los ejecutables (incluidos RELRO, Stack Canary, NX bit, PIE, RPATH, RUNPATH, Fortify Source).
Ejecutar
checksec
con-f
argumentos (entrada de archivo):fuente