WWW2Exec - GOT/PLT

Aprende hacking en AWS desde cero hasta experto con htARTE (Experto en Equipos Rojos de AWS de HackTricks)!

Otras formas de apoyar a HackTricks:

Información Básica

GOT: Global Offset Table

La Tabla de Desplazamiento Global (GOT) es un mecanismo utilizado en binarios enlazados dinámicamente para gestionar las direcciones de funciones externas. Dado que estas direcciones no se conocen hasta tiempo de ejecución (debido al enlace dinámico), la GOT proporciona una forma de actualizar dinámicamente las direcciones de estos símbolos externos una vez que se resuelven.

Cada entrada en la GOT corresponde a un símbolo en las bibliotecas externas que el binario puede llamar. Cuando se llama a una función por primera vez, su dirección real es resuelta por el enlazador dinámico y almacenada en la GOT. Llamadas posteriores a la misma función utilizan la dirección almacenada en la GOT, evitando así el costo de resolver la dirección nuevamente.

PLT: Procedure Linkage Table

La Tabla de Enlace de Procedimientos (PLT) trabaja estrechamente con la GOT y sirve como un trampolín para manejar las llamadas a funciones externas. Cuando un binario llama a una función externa por primera vez, el control se pasa a una entrada en la PLT asociada con esa función. Esta entrada de la PLT es responsable de invocar al enlazador dinámico para resolver la dirección de la función si aún no ha sido resuelta. Después de que la dirección es resuelta, se almacena en la GOT.

Por lo tanto, las entradas de la GOT se utilizan directamente una vez que se resuelve la dirección de una función o variable externa. Las entradas de la PLT se utilizan para facilitar la resolución inicial de estas direcciones a través del enlazador dinámico.

Obtener Ejecución

Verificar la GOT

Obtén la dirección de la tabla GOT con: objdump -s -j .got ./exec

Observa cómo después de cargar el ejecutable en GEF puedes ver las funciones que están en la GOT: gef➤ x/20x 0xDIR_GOT

Usando GEF puedes iniciar una sesión de depuración y ejecutar got para ver la tabla got:

GOT2Exec

En un binario, la GOT tiene las direcciones de las funciones o de la sección PLT que cargará la dirección de la función. El objetivo de esta escritura arbitraria es sobrescribir una entrada de la GOT de una función que se ejecutará más tarde con la dirección de la PLT de la función system por ejemplo.

Idealmente, sobrescribirás la GOT de una función que se llamará con parámetros controlados por ti (así podrás controlar los parámetros enviados a la función del sistema).

Si system no se utiliza en el script, la función del sistema no tendrá una entrada en la PLT. En este escenario, deberás filtrar primero la dirección de la función system y luego sobrescribir la GOT para apuntar a esta dirección.

Puedes ver las direcciones de la PLT con objdump -j .plt -d ./vuln_binary

Entradas GOT de libc

La GOT de libc generalmente se compila con RELRO parcial, convirtiéndola en un buen objetivo para esto suponiendo que sea posible averiguar su dirección (ASLR).

Las funciones comunes de libc van a llamar a otras funciones internas cuya GOT podría ser sobrescrita para obtener ejecución de código.

Encuentra más información sobre esta técnica aquí.

One Gadget

pageOne Gadget

Protecciones

La protección Full RELRO está diseñada para protegerse contra este tipo de técnica al resolver todas las direcciones de las funciones cuando se inicia el binario y hacer que la tabla GOT sea de solo lectura después de eso:

pageRelro

Referencias

Aprende hacking en AWS desde cero hasta experto con htARTE (Experto en Equipos Rojos de AWS de HackTricks)!

Otras formas de apoyar a HackTricks:

Última actualización