####################################################################### Luigi Auriemma Applicazione: Gamespy 3d http://www.gamespy3d.com Versioni: <= 263021 Piattaforme: Windows Bug: Esecuzione di codice causata da una risposta troppo grande di un server IRC Date: 30 Sep 2003 Author: Luigi Auriemma e-mail: aluigi@autistici.org web: aluigi.org ####################################################################### 1) Introduzione 2) Bug 3) The Code 4) Fix ####################################################################### =============== 1) Introduzione =============== Gamespy3d e' un'applicazione commerciale sviluppata da Gamespy per avere accesso ai master servers basati sul loro protocollo e per fare altre cose come ad esempio chattare. ####################################################################### ====== 2) Bug ====== Gamespy3d ha un client IRC interno che permette agli utenti di collegarsi ad un server IRC specificato dall'utente ed iniziare a chattare. Dopo aver inviato i comandi USER e NICK, Gamespy3d aspettera' una risposta dal server. Se il server invia una risposta di almeno 262 bytes il client fara' confusione nell'interpretare i dati ed il flusso di esecuzione continuera' a partire dall'indirizzo puntato dai 4 bytes all'offset 204 di tale risposta. Il seguente e' un esempio pratico: : [203 bytes] [4 bytes] [54 bytes] | | | | | | | sono necessari almeno 54 bytes per sfruttare il | | | bug | | il flusso di codice continuera' all'indirizzo puntato qui | bytes necessari protocollo IRC Comunque non e' ben chiaro cosa accada nel programma. L'ultima istruzione prima dell'eccezione nella versione 263010 del programma e': :004F29CB 8378F401 cmp dword ptr [eax-0C], 00000001 Dopodiche' il flusso di codice continuera' direttamente dall'indirizzo puntato dai 4 bytes nella risposta del server. EAX ed EBX invece punteranno ai 4 bytes precedenti (utile per sfruttare il bug in modo da eseguire codice) Questa e' la lista dei bytes che non possono essere usati o che verranno convertiti in bytes NULL: 0a = cannot be used 0d = cannot be used 20 = cannot be used 21 = will be converted in 0x00 40 = will be converted in 0x00 7e = will be converted in 0x00 ####################################################################### =========== 3) The Code =========== Si puo' utilizzare un file di testo contenente la stringa specificata e mettere netcat in modalita' ascolto: nc -l -p 6667 -v -v -n < long_string.txt Oppure si puo' usare direttamente il mio proof-of-concept: http://aluigi.org/poc/gs3dirc.zip ####################################################################### ====== 4) Fix ====== Gamespy e' stata notificata del bug ma non ho ricevuto risposta. #######################################################################