Desbordamiento de búfer - Encontrar dirección de shellcode

10

He estado trabajando en Laboratorio de vulnerabilidad de desbordamiento de búfer de SEED ( Lab Description and Tasks ). El entorno es Ubuntu 12.04 32 bit. Por favor considere el siguiente código:

/* stack.c */
/* This program has a buffer overflow vulnerability. */
/* Our task is to exploit this vulnerability */
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
int bof(char *str)
{
    char buffer[24];
    /* The following statement has a buffer overflow problem */
    strcpy(buffer, str);
    return 1;
}
 int main(int argc, char **argv)
{
    char str[517];
    FILE *badfile;
    badfile = fopen("badfile", "r");
    fread(str, sizeof(char), 517, badfile);
    bof(str);
    printf("Returned Properly\n");
    return 1;
}

Encontré que para sobrescribir la dirección de retorno tendríamos que sobrescribir la matriz a partir del lugar 36 porque tendríamos que saltar 24 bytes (el tamaño de la matriz) más 4 bytes (para el puntero del marco anterior) más 8 bytes para algunos datos del compilador (no especificados para qué propósito). Calculé esto con la diferencia del EBP y la dirección del búfer (usando el depurador).

Me di cuenta de que para saltar al código malicioso podemos saltar a cualquier dirección en el sled NOP. Por un valor suficientemente grande el ataque tuvo éxito. Intenté calcular la dirección mínima posible. La lógica (y el profesor) dijo que era EBP + 8 porque queríamos pasar tanto la dirección de retorno como el puntero de marco anterior (4 bytes cada uno). Desafortunadamente, el ataque no tuvo éxito cuando intenté ejecutarlo con ese valor. Encontré a través de una búsqueda exhaustiva que la dirección mínima posible es 0xBFFFF168 , que es EBP + 48, y no entiendo por qué. Incluso intenté ejecutar el ataque sin el trineo NOP y tuve problemas.

¿Alguien puede explicar? A continuación hay una descripción de la pila antes y después del rebasamiento y algunos valores adicionales.

Muchas gracias de antemano.

14        strcpy(buffer, str);
(gdb) x/20x $sp
0xbffff100:    0x0804b008    0xbffff157    0x00000205    0xb7e34374
0xbffff110:    0xb7fc4ff4    0xb7fc4ff4    0x00000000    0xb7e1f900
0xbffff120:    0xbffff368    0xb7ff26b0    0x0804b008    0xb7fc4ff4
0xbffff130:    0x00000000    0x00000000    0xbffff368    0x080484ff
0xbffff140:    0xbffff157    0x00000001    0x00000205    0x0804b008
(gdb) next
16        return 1;
(gdb) x/20x $sp
0xbffff100:    0xbffff118    0xbffff157    0x00000205    0xb7e34374
0xbffff110:    0xb7fc4ff4    0xb7fc4ff4    0x90909090    0x90909090
0xbffff120:    0x90909090    0x90909090    0x90909090    0x90909090
0xbffff130:    0x90909090    0x90909090    0x90909090    0xbffff168
0xbffff140:    0x90909090    0x90909090    0x90909090    0x90909090
(gdb) p &buffer
$1 = (char (*)[24]) 0xbffff118
(gdb) p $ebp
$2 = (void *) 0xbffff138
(gdb) p $sp
$3 = (void *) 0xbffff100
    
pregunta alond22 07.02.2018 - 02:14
fuente

1 respuesta

1

El tamaño real de la pila depende en gran medida de las optimizaciones del compilador y se verá afectado por la presencia del depurador. En este caso, no es necesario minimizar la pila a ebp + 8, por lo que no lo pensaría demasiado.

Tenga en cuenta que contar con la organización de la pila para que sea la misma ejecución y ejecución ya no es un escenario de explotación realista. En escenarios más realistas, se le asignará la tarea de omitir Nxbit / dep y ASLR, por lo que contar con que su código de explotación esté en algún lugar en particular al que pueda saltar para no cortarlo de todos modos.

Si desea una versión gratuita del ataque con el trineo NOP, me concentraría en encontrar una forma de revelar una dirección sin bloquear el programa. En un ejemplo tan pequeño, eso puede no ser posible.

    
respondido por el baordog 05.07.2018 - 18:15
fuente

Lea otras preguntas en las etiquetas