System exploitation using buffer overflow

Page 65

System exploitation using buffer overflow

while (user_buf[i]!=0) { buf[i]=malloc(strlen(user_buf[i])+1); i++; } buf=malloc(1024); strcpy(buf,user_supplied); buf=malloc(sizeof(something)*user_controlled_int); for (i=0; i<user_controlled_int; i++) { if (user_buf[i]==0) break; copyinto(buf,user_buf); } Ora, come per lo stack anche lo heap abbiamo detto contiene sia variabili fornite dall'utente, sia informazioni di sistema legate all'allocazione stessa. malloc() recupera uno grosso blocco di memoria dall'heap e divide questo in blocchi, all'utente restituisce uno di questi blocchi quando viene richiesto. free(), quando viene chiamata può decidere se prendere il blocco da liberare, e potenzialmente unirlo con lo spazio libero (altri blocchi) contiguo. Quello che è possibile fare è manipolare le funzioni malloc() o free()... Forniamoci del sorgente che segue, se non l'avete già notato questo contiene un bug da heap overflow molto banale. /*notvuln.c*/ int main(int argc, char** argv) { char *buf; buf=(char*)malloc(1024); printf("buf=%p",buf); strcpy(buf,argv[1]); free(buf); } Vediamo innanzi tutto come trovare la lunghezza di buffer senza partire dal sorgente ma da gdb, ad esempio nel caso in cui non disponiamo dei sorgenti. La lughezza del buffer allocato è sistemata contiguamente ad esso nello heap: ... (gdb) x/xw buf-4 0x804b004: 0x00000409 ... Come vedete 0x409 (1024) è la dimensione dello spazio allocato, capite bene che in situazioni dove la dimensione delle stringhe non è controllata è possibile sovrascrivere questi valori, magari di altri buffer. Non è necessario che la chiamata a malloc() viene eseguita, il valore è già sistemato nello heap prima, dato che il valore è deciso a priori. Il problema del programma appena visto, non è in realtà così critico come sembra (date anche le limiate operazioni compiute dal programma), infatti la copia incontrollata andrebbe si a sovrascrivere porzioni di heap ma nussuna locazione utile ai nostri scopi. Prendiamo ora in esame un'altro bug: /*basicheap.c*/ int main(int argc, char** argv) { Copyright © Matteo Tosato 2010-2011

tosatz@tiscali.it rev.2.2

Pag. 65 di 193


Issuu converts static files into: digital portfolios, online yearbooks, online catalogs, digital photo albums and more. Sign up and create your flipbook.