Tamaño de búfer limitado para shellcode en una máquina de 64 bits

6

Tengo un fragmento de código que tiene la vulnerabilidad strcpy clásica

int main(int argc, char argv[][]){
    char buffer[8];
    strcpy(buffer, argv[1]);
}

Al desensamblar el archivo binario, podemos ver que rsp disminuye en 0x10 bytes ( =16 )

Así que podemos sobrescribir el rbp después de 16 bytes y devolver la dirección después de 24 bytes. Antes de que la función vuelva, rax apunta al principio de nuestro código de shell.

Aquí está mi enfoque para atacar el programa. Nuestro shellcode estará en el siguiente formato

"A"*16 + "B"*8 + "C"*8

Cuando ASLR está habilitado, reemplacé la dirección de retorno por una dirección de jmpq *%rax , por lo que la carga útil ahora se convertirá en

"A"*16 + "B"*8 + "\x77\x04\x40"

y al avanzar en gdb, puedo ver que la ejecución se dirige al principio de "A". Sin embargo, el búfer es demasiado pequeño para poner un código de shell ( system(/bin/sh) ). ¿Qué se supone que debo hacer aquí?

Esto es lo que estoy pensando:

  1. Usa el enfoque del cazador de huevos. Sin embargo, no puedo enviar más de 24 bytes de datos a la aplicación, ya que la dirección de retorno incluye bytes nulos, termina mi código de shell.

  2. Encuentre un shellcode que sea más pequeño que 24 bytes para Linux de 64 bits. (Supongo que esto no es posible)

  3. Enfoque ROP, sin embargo, ASLR está habilitado, no puedo averiguar la dirección base de libc

He leído muchos tutoriales y la mayoría de ellos tienen un búfer grande como char buffer[500] en lugar de char buffer[8] . Será genial si alguien me puede guiar al lugar correcto.

    
pregunta Timothy Leung 30.08.2015 - 14:01
fuente

0 respuestas

Lea otras preguntas en las etiquetas