Sto cercando di sfruttare la vulnerabilità di overflow dello stack semplice. Ho un codice di base in c:
#include <cstring>
int main( int argc, char** argv )
{
char buffer[500];
strcpy(buffer, argv[1]);
return 0;
}
compilato usando -fno-stack-protector
. Ho già capito la lunghezza del buffer e ho sovrascritto con successo i registri EBP e EIP. Ho iniettato un gran numero di NOP, seguito con questo codice shell e infine inserito un indirizzo in cui i NOP iniettati sono così il codice viene eseguito.
Ora il problema. Nella foto allegata puoi vedere l'output di gdb. Se eseguo il mio programma con un input malevolo, ottiene un SIGSEGV. Scaricando l'indirizzo 0xbffff880
puoi vedere che ci sono molti NOP seguiti con il codice shell (scatola rosa) e infine con l'indirizzo (riquadro blu).
Ho pensato che funzionasse come segue: all'inizio 0x90909090
s e lo shellcode sono considerati dati semplici. Dopo questi (oltre la scatola rosa) c'è un indirizzo 0xbffff880
. Sto dicendo alla cpu "hey there, ora per favore esegui cosa c'è in 0xbffff880
". La CPU prende ciò che è sull'indirizzo ed esegue tutti i NOP e lo shellcode stesso. Tuttavia ciò non sta accadendo e SIGSEGV si verifica.
Dove mi sbaglio?
Sto cercando di ottenere questo risultato su un'istanza Virtualbox di Ubuntu 14.04 Linux a 32 bit 3.13.0-39-i686 generico con ASLR disattivato.