Obtención de confiabilidad de explotación al usar off por un framepointer sobreescrito en linux

13

Tenemos un programa que es vulnerable a la sobrescritura de un puntero de marco de un byte. La pila está marcada como ejecutable, la máquina Linux ha sido deshabilitada, las cookies de la pila están deshabilitadas y es un poco endian standard x86.

Podemos ejecutar:

buf[256];

for(int i=0; i <=256; i++)
  buf[i] = argv[1][i];

Sin embargo, quiero poner mi código de shell en buf y luego saltar a él. Si usara un desbordamiento de pila normal, podría obtener una confiabilidad de explotación al ir a una biblioteca cargada que tiene la instrucción jmp $esp codificada en algún lugar, y luego colocar mi código de shell donde están los argumentos de la función, etc. Pero esto no es posible aquí.

Entonces, ¿qué hace si es un proceso remoto (no puede codificar los valores de las direcciones) y necesita explotar la confiabilidad? Lo único que me vino a la mente es la alineación de la pila donde podríamos predecir los bits bajos (¿2 o 3 bits, tal vez?).

Solo necesito saber el byte bajo del puntero del cuadro para poder sobrescribirlo con un control de valor un poco más pequeño eip para apuntar a jmp esp y la instrucción en esp sería como un salto corto -0x80 o algo como que.

He reducido el puntero del cuadro = > ret se ejecuta = > control eip = > punto eip a jmp esp instrucción = > la siguiente instrucción es el salto corto -0xsomevalue ejecución = > la carga útil se ejecuta.

Pensé en otras heurísticas, como escribir el puntero a jmp esp una y otra vez en el búfer para que sea más probable que obtenga el control de eip, pero de esa manera mi método de jmp -0xsomevalue ya no funcionaría.

    
pregunta Rob 06.04.2013 - 00:25
fuente

2 respuestas

1

Tuve un problema de tareas extremadamente similar al de una clase de seguridad. La confiabilidad de su exploit depende de qué tan grande es el buffer. Si está desbordando un búfer particularmente grande, entonces su vulnerabilidad tendrá mayores posibilidades de funcionar.

Aquí es cómo debe estructurarse su sándwich de exploit:

[NOPS][Shellcode (usually about ~60 bytes)][FP overwrite]

Como ya sabe, solo podrá sobrescribir los últimos dos bits de Frame Pointer . Esto hará que el EIP apunte a tu trineo si tienes la suerte de hacerlo. Si tienes un búfer de tamaño 265 como en tu ejemplo, aquí es cómo se vería un buen sandwhich:

[NOPS * 150][Shellcode][FP overwrite] << FP Overwrite MUST be at index 256

Ahora, como dije, la confiabilidad de tu hazaña dependerá del tamaño del trineo que puedas producir. Si tu buffer es de 1024 bytes, entonces tu exploit será muy eficiente.

Si obtiene un buen valor para la sobrescritura de puntero de marco, tendrá mucho más éxito con su exploit. También la creación del trineo más grande posible también será clave aquí. Para este exploit, es probable que sea seguro de usar:

NOPS = (size of exploited buffer + 1) - length of shellcode - 1

simplemente:

NOPS = (size of exploited buffer) - length of shellcode

Esto te dará el mayor cambio posible de aterrizaje en tu trineo NOP. Ahora solo juegue con el valor de sobrescritura de FP y encuentre un valor que sea bastante consistente.

información útil sobre errores off-by-one:

Cómo funciona un trineo nop:

Aquí está el artículo que tuve que leer para mi clase, fue muy útil:

respondido por el John 16.04.2014 - 01:33
fuente
0

La creación de exploits confiables requiere tiempo y paciencia y mucha depuración.

Creo que lo que estás buscando es un NOP Sled o NOP Slide. Cuando ejecutas el salto corto, debes aterrizarlo en medio de la diapositiva NOP, por lo que la ejecución se desliza a través de los NOP a tu código shell.

Echa un vistazo a este sitio para obtener un desglose detallado de la escritura de exploit.

    
respondido por el NRCocker 24.03.2014 - 07:40
fuente

Lea otras preguntas en las etiquetas