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