####################################################################### Luigi Auriemma Applicazione: Painkiller http://www.painkillergame.com Versioni: <= 1.3.1 Piattaforme: Windows Bug: corruzione di memoria con limitata possibilita' di esecuzione di codice Exploitation: remoto, contro server Data: 24 August 2004 Autore: Luigi Auriemma e-mail: aluigi@autistici.org web: aluigi.org ####################################################################### 1) Introduzione 2) Bug 3) The Code 4) Fix ####################################################################### =============== 1) Introduzione =============== Painkiller e' un famoso gioco FPS sviluppato da People can Fly (http://www.peoplecanfly.com) e pubblicato da DreamCatcher (http://www.dreamcatcher.com). Il gioco e' stato rilasciato ad Aprile 2004. ####################################################################### ====== 2) Bug ====== La procedura per entrare in un server di Painkiller e' costituita da 3 pacchetti: - una richiesta di connessione dal client (ID 0x02) - una challenge key dal server (ID 0x03) usata per il calcolo della stringa di testo per l'autorizzazione della cd-key tramite Gamespy (http://aluigi.org/papers/gskey-auth.txt) e della password - il pacchetto del client usato per entrare (ID 0x04) e contenente la sua versione del gioco, la stringa per l'autorizzazione della cd-key, la password (se necessaria) ed altre informazioni Il problema e' proprio nel campo della password, infatti essa e' codificata usando uno speciale algoritmo in congiunzione con la challenge key del server, ma quando il server prova a decodificare una password troppo grande (oltre 256 caratteri) alcune importanti zone di memoria vengono sovrascritte. L'algoritmo completo ed ottimizzato per la codifica/decodifica e' disponibile qui: http://aluigi.org/papers/painkiller_pckpwd.h A causa del tipo di algoritmo di codifica ed il tipo di bug sembra non essere pienamente possibile eseguire codice remoto (almeno non facilmente) perche' l'indirizzo di ritorno puo' essere sovrascritto solo dai bytes accettati in un passaggio intermedio nella decodifica della password, esattamente quelli da 0x00 sino a 0x3f. Puo' anche essere possibile che esista un altro metodo per sfruttare la vulnerabilita' ma io ho trovato solo questo che ha tale limitazione. ####################################################################### =========== 3) The Code =========== http://aluigi.org/poc/painkex.zip ####################################################################### ====== 4) Fix ====== No fix. Gli sviluppatori sono stati avvisati oltre un mese fa' ma la patch (seppur pronta) non e' ancora stata rilasciata. #######################################################################