¿Cómo explotar binarios sin un gadget syscall o fuga de información en ASLR completo y NX?

2

Tengo un binario de Linux x86-64 vinculado con libc que se ejecuta dinámicamente en Ubuntu 16.04 parcheado de forma remota.

El ejecutable realiza una llamada a libc read y exit, lo que permite un simple desbordamiento de pila en ROP. Ese es el único código compilado en el binario.

-----------------------
gdb-peda$ checksec
CANARY    : disabled
FORTIFY   : disabled
NX        : ENABLED
PIE       : disabled
RELRO     : Partial
-----------------------

El ASLR completo está habilitado.

No tengo acceso a un gadget de syscall en ninguna dirección conocida, y después de escuchar que vsyscall podría funcionar, aprendí que vsyscall ahora está emulado en versiones más nuevas del kernel y no se puede usar para un gadget de syscall.

He hecho búsquedas manuales para int 0x80, syscall y sysenter con la esperanza de encontrarlas en la sección ejecutable conocida sin ningún resultado.

¿Alguien sabe de alguna forma de explotar este binario sin ninguna dirección conocida, excepto para 'leer'?

Supongo que la única forma que puedo imaginar es leyendo de alguna manera una dirección libc de GOT y ROPing para eliminar la referencia a una nueva función en un nuevo desplazamiento ... pero no puedo encontrar un gadget que lo haga. Déjame desreferenciar.

No puedo usar la corrección de sobrescritura parcial de direcciones porque x86-64 tiene demasiada entropía.

¿Hay alguna técnica que no conozca?

¡Estoy golpeando mi cabeza contra una pared en este!

    
pregunta Gbps 09.04.2017 - 04:09
fuente

1 respuesta

4

Después de todo, la solución estaba usando una sobrescritura de dirección parcial.

Usando la dirección para leer en el GOT, se puede hacer una sobrescritura parcial de la dirección de dos bytes para saltar dentro de una garantía de 8192 bytes desde lectura a libc, con una posibilidad de fuerza bruta 1/16 para saltar dentro de 65535 bytes ( debido a la entropía de 4 bytes de ASLR).

Dentro de la sobrescritura de dos bytes, hay un gadget mágico ubicado a 0x6109 bytes de la dirección de lectura, que se encuentra dentro de la distancia de dos bytes.

En one_gadget , se puede encontrar el gadget mágico cerca de leer:

0xf0567 execve("/bin/sh", rsp+0x70, environ)
constraints:
  [rsp+0x70] == NULL

En esta versión de libc (2.6.32), la llamada a leer se encuentra en:

0xF6670 read            proc near

Usando una llamada para leer, podemos sobrescribir la entrada GOT de lectura y ROP volver a la página principal para llamar a nuestro gadget mágico.

También, se encontró otra solución haciendo que la misma dirección parcial sobrescriba a ROP para configurar una syscall y luego sobrescriba el último byte de lectura para saltar 0x0E bytes hacia adelante y golpear el gadget de syscall natural encontrado dentro de lectura. De esta manera, no tiene que aplicar Bruteforce ASLR y tener un exploit estable.

    
respondido por el Gbps 10.04.2017 - 17:40
fuente

Lea otras preguntas en las etiquetas