hacktricks/binary-exploitation/common-binary-protections-and-bypasses/relro.md

3.3 KiB

Relro

Aprende hacking en AWS desde cero hasta experto con htARTE (HackTricks AWS Red Team Expert)!

Otras formas de apoyar a HackTricks:

Relro

RELRO significa Relocation Read-Only, y es una característica de seguridad utilizada en binarios para mitigar los riesgos asociados con las sobrescrituras de la GOT (Global Offset Table). Vamos a desglosar el concepto en sus dos tipos distintos para mayor claridad: Partial RELRO y Full RELRO.

Partial RELRO

Partial RELRO toma un enfoque más simple para mejorar la seguridad sin afectar significativamente el rendimiento del binario. Al posicionar la GOT por encima de las variables del programa en la memoria, Partial RELRO tiene como objetivo evitar que los desbordamientos de búfer alcancen y corrompan la GOT.

Esto no evita que la GOT sea abusada por vulnerabilidades de escritura arbitraria.

Full RELRO

Full RELRO intensifica la protección al hacer que la GOT y la sección .fini_array sean completamente de solo lectura. Una vez que el binario comienza, todas las direcciones de las funciones se resuelven y se cargan en la GOT, luego, la GOT se marca como de solo lectura, evitando efectivamente cualquier modificación durante la ejecución.

Sin embargo, el compromiso con Full RELRO se encuentra en términos de rendimiento y tiempo de inicio. Debido a que necesita resolver todos los símbolos dinámicos al inicio antes de marcar la GOT como de solo lectura, los binarios con Full RELRO habilitado pueden experimentar tiempos de carga más largos. Esta sobrecarga adicional en el inicio es la razón por la cual Full RELRO no está habilitado de forma predeterminada en todos los binarios.

Es posible verificar si Full RELRO está habilitado en un binario con:

readelf -l /proc/ID_PROC/exe | grep BIND_NOW

Bypass

Si se habilita Full RELRO, la única forma de evitarlo es encontrar otra forma que no necesite escribir en la tabla GOT para lograr una ejecución arbitraria.

Ten en cuenta que la GOT de LIBC suele tener Partial RELRO, por lo que se puede modificar con una escritura arbitraria. Más información en Apuntando a las entradas de la GOT de libc.