######################################################################## Luigi Auriemma Applicazione: Lcc-win32 (http://www.cs.virginia.edu/~lcc-win32/) Versione: TUTTE ed anche le prossime (SOLO se eseguito su Win9x/Me, NO le altre versioni di Windows) (guarda la sezione Fix per i dettagli) Bug: Parti di memoria inserite dopo l'import table dell'esegui- bile creato con Lcc. Date: 02 Aug 2002 Autore: Luigi Auriemma e-mail: aluigi@autistici.org web: aluigi.org ######################################################################## Sezioni: 1) Introduzione 2) Bug 3) Il codice 4) Fix ######################################################################## =============== 1) Introduzione =============== Lcc e' davvero un eccellente e diffusissimo compilatore C gratuito per Win32. Esso e' compreso anche di un buon IDE (Wedit) per creare e modificare progetti con estrema semplicita'. Personalmente lo uso per compilare qualsiasi cosa in C compresi i pro- grammi proof-of-concept allegati ad i miei advisories (eh eh potete immaginare la mia faccia dopo che ho trovato questo bug ed ho pensato a tutto il codice diffuso precedentemente...). ######################################################################## ====== 2) Bug ====== Come gia' detto precedentemente nell'intestazione, il bug e' riprodu- cibile SOLO su Windows 9x/Me. Quando Lcc compila del codice sorgente esso inserisce alcuni bytes (overlay) dopo l'import table dell'eseguibile. Normalmente questi bytes dovrebbero essere tutti zeri, ma non se la compilazione avviene su Win9x/Me. Inoltre non tutti gli eseguibili saranno riempiti con parti di memoria e questo sembra essere dovuto alla grandezza dell'eseguibile che ricaveremo (anche se non ne sono certo). Per esempio se in un codice sorgente che non riproduce il bug noi in- seriamo o togliamo delle righe di codice, quando lo ricompileremo ve- dremo che ora contiene altri bytes invece dei normali bytes 0x00. Ecco un piccolo esempio: example.c ----------- #include int main(void) { printf("Lcc bug\n"); return(0); } ----------- Se compiliamo questo piccolo codice vedremo che dopo l'import table ci sono alcuni bytes (proprio dopo CRTDLL.DLL ed alcuni caratteri '@') che variano per ogni compilazione. Cio' significa che troveremo parti di files, parti del codice sorgente o parti di esso in assembly, informazioni riguardo il sistema o gli utenti, pezzi casuali di memoria ed altro. Giusto per fare qualche esempio, in alcuni dei miei eseguibili ho tro- vato un file con alcuni indirizzi e-mail di miei amici, informazioni riguardanti il mio sistema ed anche una parte di un bug report che avevo scritto qualche giorno prima! Diamo un'occhiata a example.exe compilato sul mio sistema: 0000b30: 3040 0043 5254 444c 4c2e 444c 4c00 0014 0@.CRTDLL.DLL... 0000b40: 3040 0014 3040 0014 3040 0014 3040 0014 0@..0@..0@..0@.. 0000b50: 3040 003d 3d3d 3d3d 3d3d 3d3d 3d3d 3d3d 0@.============= 0000b60: 3d3d 3d3d 3d3d 3d3d 3d3d 3d3d 3d3d 3d3d ================ 0000b70: 3d3d 3d0a 4946 2045 5849 5354 206a 6574 ===.IF EXIST jet 0000b80: 7479 656e 762e 6261 7420 4341 4c4c 206a tyenv.bat CALL j 0000b90: 6574 7479 656e 762e 6261 740a 0a72 656d ettyenv.bat..rem 0000ba0: 203d 3d3d 3d3d 3d3d 3d3d 3d3d 3d3d 3d3d =============== 0000bb0: 3d3d 3d3d 3d3d 3d3d 3d3d 3d3d 3d3d 3d3d ================ 0000bc0: 3d3d 3d3d 3d3d 3d3d 3d3d 3d3d 3d3d 3d3d ================ 0000bd0: 3d3d 3d3d 3d3d 3d3d 3d3d 3d3d 0a72 656d ============.rem 0000be0: 203d 3d20 6368 6563 6b20 666f 7220 4a41 == check for JA 0000bf0: 5641 5f48 4f4d 4520 656e 7600 0000 0020 VA_HOME env.... 0000c00: 0000 0000 0000 0020 0000 0000 1000 0000 ....... ........ 0000c10: 1400 0000 2000 0000 2400 00 .... ...$.. I bytes dopo l'ultimo "0@." sono esattamente gli stessi bytes del file jetty.bat, un file batch di un web-server in Java!!! ######################################################################## ============ 3) Il codice ============ Guarda i bytes dopo l'import table degli eseguibili compilati con Lcc. ######################################################################## ====== 4) Fix ====== L'autore di Lcc mi ha detto che il problema e' causato dalla non cor- retta gestione dell'azzeramento della memoria dei sistemi operativi Windows 9x/Me, quindi non esistono patch. Comunque e' davvero semplice eliminare il problema. Lo si puo' fare manualmente cancellando o sovrascrivendo questi inuti- li bytes oppure automaticamente utilizzando alcune utility per lo stripping degli eseguibili PE di Windows. La mia scelta e' FileScanner. Questa eccellente utility free, che fa' moltissime cose utili ed interessanti, puo' anche ridurre la grandezza dei files ed eliminare questi bytes inutili ed "anti-privacy". L'homepage del programma e' http://smf.chat.ru/ Il link diretto al file e' http://smf.chat.ru/files/fs.zip Quindi per applicare il fix alle applicazioni scritte con Lcc basta utilizzare semplicemente: fs -se file.exe ########################################################################