Estoy intentando explotar la vulnerabilidad en el siguiente programa provocando un desbordamiento de búfer:
#include <stdio.h>
#include <string.h>
int main (int argc, char ** argv){
char message[20];
if (argc != 2){
printf ("Usage: %s <message>\n", argv[0]);
return -1;
}
strcpy (message, argv[1]);
printf ("Your message: %s\n", message);
return 0;
}
En teoría, la pila debería tener este aspecto
_____________________________
| Saved EIP (1 byte) |
------------------------------|
| Saved EBP (1 byte) |
------------------------------|
| |
| |
| message (20 bytes) |
| |
|_____________________________|
Entonces, en teoría, para sobrescribir el EIP guardado, necesito 20 + 1 = 2 caracteres en el búfer para alcanzar el EIP guardado. Pero resulta que se necesitan 32 caracteres para alcanzarlo. ¿Por qué es eso?
Otra cosa que noté es que justo después de guardar EBP en la pila y reemplazar ESP con EBP, la siguiente instrucción ASM es subl 0x30, esp
, cuando solo se necesitan 20 bytes para message
. ¿Alguien por favor puede explicar? Gracias.