####################################################################### Luigi Auriemma Applicazione: OpenBOR http://www.openbor.net Beats of Rage http://www.senileteam.com HOR: Horizontal Shooter BOR http://openbor.net/hor/ Versioni: OpenBOR <= 2.0046 BOR <= 1.0029 HOR <= 2.0000 Piattaforme: Dreamcast, GP32, PSP, Palm OS, Pocket PC, GP2X, Amiga, Linux, PC, Playstation 2 e Xbox Bug: format string vulnerabilities Exploitation: locale Data: 20 May 2006 Autore: Luigi Auriemma e-mail: aluigi@autistici.org web: aluigi.org ####################################################################### 1) Introduction 2) Bug 3) The Code 4) Fix ####################################################################### =============== 1) Introduction =============== Beats of Rage (BOR) e' un motore open source per la creazione di giochi in stile beat'em up sviluppato da Senile Team (http://www.senileteam.com) ed ispirato a "Streets of Rage" e "the King of Fighters". Funziona su diverse piattaforme e supporta i mods: http://borrevolution.vg-network.com http://www.borhosting.com ####################################################################### ====== 2) Bug ====== Esistono alcune vulnerabilita' di tipo format string in BOR che possono essere sfruttate per l'esecuzione di codice malevolo tramite dei mods. Quelli che seguono sono i pezzi di codice contenenti i bugs, ad ogni modo le funzioni piu' utilizzate sono shutdown (usata per terminare il gioco alla sua conclusione od in caso di errore) ed update (per mostrare il testo sullo schermo attraverso la funzione font_printf): void shutdown(char *msg, ...){ static char buf[2048]; va_list arglist; va_start(arglist, msg); vsprintf(buf, msg, arglist); va_end(arglist); ... printf("Done.\n\n\n\n"); printf(buf); exit(0); } Da predrawstatus(): font_printf(21+xo, savedata.windowpos+19, 0, player[i].opponent->name); ... else if(player[i].joining && player[i].model){ font_printf(21+xo, savedata.windowpos+2, 0, player[i].model->name); ... Da update(): font_printf(0,230, 0, debug_msg); Da choose_difficulty: if(savedata.times_completed >= ifcomplete[i]) font_printf(120,160+i*10, (selector==i), set_names[i]); ####################################################################### =========== 3) The Code =========== Prendere un modo qualsiasi e: - aggiungere la seguente linea in data/scenes/intro.txt: music %08x.%08x.%08x.%08x 0 - aggiungere la seguente linea in data/easy/1aeasy.txt: background %08x.%08x.%08x.%08x La prima operazione fa' uso del format string nella funzione update quando il gioco inizia e l'intro viene automaticamente lanciata. La seconda invece sfrutta il bug nella funzione shutdown quando il livello Easy ed il personaggio vengono selezionati. Sia per le operazioni di estrazione che ricostruzione dei file PAK e' possibile usare il tool seguente: http://aluigi.org/papers/borpak.zip ####################################################################### ====== 4) Fix ====== No fix. BOR non e' piu' supportato mentre OpenBOR si ma non ho ricevuto alcuna risposta dai suoi sviluppatori. #######################################################################