Cómo omitir ASLR con ROP

5

Estaba leyendo este artículo en el instituto InfoSec:

enlace

Y fue capaz de seguirlo hasta que hizo la Cadena ROP.

Encuentra el offset de printf y execve en 328160

Luego encuentra los siguientes artilugios de ROP:

0x804886eL: add eax [ebx-0xb8a0008] ; add esp 0x4 ; pop ebx
0x804861fL: call eax ; leave ;;
0x804849cL: pop eax ; pop ebx ; leave ;;

Entiendo que la idea es cargar la dirección absoluta de execve en eax y luego llamar a eax, pero donde me pierdo es la forma en que lo hace.

El gadget:

0x804886eL: add eax [ebx-0xb8a0008] ; add esp 0x4 ; pop ebx

Agrega eax y [ebx - 0xb8a0008] y luego lo almacena en eax para que llame el siguiente gadget.

El objetivo ahora parece ser conseguir que ebx contenga la dirección absoluta de printf @ got, pero en su lugar, carga 0x138e9ff4 en ebx, dice que es porque:

printf @ got + 0xb8a0008 = 0x138e9ff4

Simplemente no tengo idea de cómo calcula el valor 0x138e9ff4, ya que ASLR está habilitado y printf @ got debería ser diferente cada vez, y por lo tanto, el valor cargado en ebx también debería.

Apreciaría cualquier entrada que tenga

    
pregunta alloy 30.07.2017 - 22:47
fuente

1 respuesta

3

Estoy de acuerdo en que está muy mal explicado en el artículo. Me tomó varias lecturas para comprender qué demonios estaba pasando.

La parte clave está aquí:

  

Nuestro objetivo ahora es construir un ROP encadenado para ejecutar execve (). Como podemos ver, no tenemos una entrada GOT para esta función y libc es aleatorio.

     

Entonces, lo primero que haremos es filtrar una dirección de función libc para GOT y luego realizaremos algunos cálculos triviales para obtener la dirección execve libc exacta.

Suponen que tienes una fuga de información que te indica dónde está cualquier función libc. En este caso, están usando printf como ejemplo.

A partir de ahí, el exploit tiene mucho más sentido:

El primer paso es que rellenen eax con 0x328160 y ebx con 0x138e9ff4 usando el gadget pop; pop; leave . Cuando se ejecuta esa instrucción add , calcula 0x138e9ff4 - 0xb8a0008 = 0x8049fec. Esta es la dirección de printf @ got en el ejemplo. Tenga en cuenta que esta es la dirección de la entrada de la tabla de compensaciones globales (GOT) para printf, no la función printf en sí misma. La dirección base de la GOT no es aleatoria en Linux regular (puede estar en núcleos endurecidos con grsec; no la he buscado)

La instrucción ahora es esencialmente: add eax, [0x8049fec] . El atacante sabe que para la versión de destino de libc, la distancia entre printf y execve es 0x328160, por lo que cuando se ejecuta esta instrucción toma la dirección de la función printf del GOT y le agrega 0x328160 (desde eax, que fue precargado por el pop). pop leave) que carga la dirección de execve en eax.

El call eax luego ejecuta execve.

    
respondido por el Polynomial 31.07.2017 - 12:47
fuente

Lea otras preguntas en las etiquetas