####################################################################### Luigi Auriemma Applicazione: Festalon http://projects.raphnet.net/#festalon Versioni: <= 0.5.5 and >= 0.5.0 Piattaforme: Windows, *nix, *BSD, Winamp and XMMS plugin Bug: heap corruption in FESTAHES_Load Exploitation: locale Data: 06 Aug 2006 Autore: Luigi Auriemma e-mail: aluigi@autistici.org web: aluigi.org ####################################################################### 1) Introduzione 2) Bug 3) The Code 4) Fix ####################################################################### =============== 1) Introduzione =============== Festalon e' un player (stand-alone e plugin) per i file musicali .nsf per il Nintendo. ####################################################################### ====== 2) Bug ====== HES e' il formato della musica rippata del TG16/PC Engine che e' stato aggiunto dalla versione 0.5.0. FESTALON_HES e' una struttura di 1501888 bytes utilizzata per contenere il file in memoria. Il programma utilizza un controllo anti-overflow per evitare che i dati in input siano maggiori della grandezza della rom di 0x100000 bytes. Ad ogni modo il controllo viene fatto sulla somma di LoadAddr (usato come un offset del buffer rom di destinazione) e LoadSize (quantita' di dati da copiare) quindi un attacker puo' usare un LoadAddr negativo per sovrascrivere la memoria antecedente quella allocata. Lo sfruttamento del bug (non sono sicuro se l'esecuzione di codice sia davvero possibile nonostante gli effetti sembrano simili ad un heap overflow) avviene quando il programma termina e viene chiamata la funzione free(). Da pce/hes.c: FESTALON_HES *FESTAHES_Load(FESTALON *fe, uint8 *buf, uint32 size) { FESTALON_HES *hes; uint32 LoadAddr,LoadSize; uint16 InitAddr; uint8 *tmp; int x; fe->TotalChannels = 6; fe->OutChannels = 2; hes = FESTA_malloc(16, sizeof(FESTALON_HES)); hes->h6280 = malloc(sizeof(h6280_Regs)); InitAddr = De16(&buf[0x6]); tmp = &buf[0x10]; while(tmp < (buf + size - 0x10)) { LoadSize = De32(&tmp[0x4]); LoadAddr = De32(&tmp[0x8]); //printf("%08x:%08x\n",LoadSize,LoadAddr); tmp += 0x10; if(tmp >= (buf + size + LoadSize)) break; if((LoadAddr + LoadSize) > 0x100000) break; memcpy(hes->rom + LoadAddr,tmp,LoadSize); tmp += LoadSize; } ... ####################################################################### =========== 3) The Code =========== http://aluigi.org/poc/festahc.zip ####################################################################### ====== 4) Fix ====== Al momento il progetto non ha piu' una homepage reale quindi non so se e' ancora supportato al 100%. Ad ogni modo considero questo bug piu' una "curiosita'" che una reale vulnerabilita'. #######################################################################