Ilma e’ un linguaggio di programmazione esoterico. questi linguaggi hanno la caratteristica di consentirti di fare potenzialmente tutto, ma in un modo molto molto complicato. Molteplici sono state le riflessioni che mi portavano a chiedermi “cosa posso fare di divertente per popolo dei programmatori esoterici ?”, purtroppo la domanda non trovava risposta. Del resto, gli apici dei linguaggi esoterici li vedevo gia’ raggiunti da alcuni maestri: il malebolge per la sua difficolta’ senza precedenti, il java2k per essere turing compatibile seppure non deterministico, poi c’e’ una variante di brainfuck con le istruzioni espresse a muggiti case sensitive. Insomma credevo quel mondo fosse gia’ stato esploranto quando l’entropia mi diede la Visione di quello che ancora mancava. Ora ilma esiste, segue una logica distorta, in piena simmetria con la Visione.

Un linguaggio esoterico e’ tale solo se esiste un codice che restituisce “hello world”, eccolo:

root@unnamed:~/vdebian_root/ilma# ./ilma.sh hello.ilma
I'm retrivering all pages, wait for wget's termination...
There are 18 wget running yet, sleeping four seconds again...
There are 6 wget running yet, sleeping four seconds again...
There are 2 wget running yet, sleeping four seconds again...
There are 1 wget running yet, sleeping four seconds again...
executing [/root/.ilma.entropity/_6926_27038/11979.sh] shell script

hello world
root@unnamed:~/vdebian_root/ilma#

Come si creo’ la Visione ? L’inizio di tutto non fu l’universita’, ne la droga ne tanto meno l’iperventilazione. Tutto inizio’ una sera dello scorso anno, quando io e il mio conquilino, ci dicemmo in contemporanea: “andiamo a prendere un chirashi take away ?”

Arrivammo al ristorante cino/jappo, caldo estivo, bici scassata, undici euro pronti in tasca. una certezza e una fame senza paragoni, prima di verificare la quantita’ di mosche sul pesce chiedemmo: “due chirashi, da portare via, grazie”.

bruce schneier e’ un importante uomo di riferimento per gli esperti di sicurezza. La sua forza e’ saper comunicare, ma spesso deve appoggiarsi a delle metafore, perche’ la sua comprensione e’ cosi’ distaccata dal materialismo umano che diviene impossibile per noi altrimenti comprenderlo.

Un giorno, stava seduto sulla sua famosa news letter mentre tutti i discepoli lo ricevevano in mail, e con la sua voce stentorea scrisse:
Sia data la profilazione come obiettivo della discussione. ebbene io vi dico, figlioli, che la profilazione la praticate anche voi, sempre, in ogni momento
“oohhh, ma come, santo padre, e’ questo un processo razionale o in background ?”
esso e’ in background, controllato in ogni caso da alcune porzioni di codice razionale
I discepoli lo guardavano stupefatto, mentre attorno a lui il piano etereo si piegava per assorbire la sua saggezza. Comprendendo gli ordini di grandezza di distanza tra se stesso e i suoi discepoli, guardo’ negli occhi un pesce di springfield e comprese quale metafora utilizzare:
siate voi in strada, sentite il vostro nome urlato alle spalle. vi voltate. un essere umano sesso maschile, eta’ indefinita, vi corre dietro. indossa del bianco e del nero a righe, e del rosso a macchie ricopre la sua figura. egli inoltre impugna nella destra un coltello lungo un avambraccio e nella sinistra qualcosa di piu’ piccolo, che sventaglia al cielo. voi scappate
Alche’ il primo discepolo disse: “vostra sicurezza, e’ forse l’uomo un’anomalia statistica ?”
Ed il secondo: “racchiude forse dei comportamenti che riconosciamo come pericolosi ?”
Ed il terzo: “e’ la mia perdita sufficentemente grande, da scappare all’infinito ?”
Ma il quarto disse: “bruce, e’ forse il macellaio, dal quale ho dimenticato il resto della spesa ?”

Allora bruce si alzo’, prese per mano il quarto e gli firmo’ la chiave pubblica in segno di stima.

Quello che bruce voleva dire e’ che istintivamente noi avvertiamo delle situazioni di pericolo, e reagiamo di conseguenza. Ebbene quella sera io ed il conquilino, che per comodita’ chiameremo con il nome di fantasia hyperion, dimostrammo come la fame e l’aspettativa rendono il corpo insensibile alle anomalie.

Provate a immaginarlo un attimo, aspetti che l’itamae faccia la tua vaschetta take away e intanto un bimbo cinese si mangia un gambero senza sgusciarlo, le mamme reidono davanti agli obiettivi fotografici, una coppia di scarafaggi festeggia sugli avanzi, un cinesotto si gusta un lecca lecca e i nuovi operai del ristorante seguono lo stile tyler durden sulle/nelle zuppe di miso.

Ecco avete visto ? ci siete cascati. o meglio, il lettore attento non dovrebbe mai arrivare a leggere fino qui, perche’ al segnale “un cinesotto si gusta un lecca lecca” avrebbe compreso il tipo di distorsione probabilistica innaturale che si andava a crearsi. avrebbe percepito che un brutto ceffo con i pantaloncini corti, la canottiera da muratore siciliano e il LECCA LECCA era un’anomalia troppo forte per poter lasciare gli astanti immuni al rimbalzo probabilistico.

Ma noi sbagliammo, e non leggemmo nella giusta chiave la distorsione della realta’, noi continuammo ad aspettare il nostro chirashi. Ma un evento simile e’ come un sasso in uno stagno, prima fa splof e la melma circostante si sposta, ma poi iniziano le onde. dove il sasso non ha fatto nulla se non spostare un po’ d’acqua e rane, le onde scuotono tutto quello che vive sul pelo dell’acqua. Noi tipo libellule che si vogliono posare su tonno e uova si salmone, non notammo questo. attendemmo speranzosi. anche quando la prima ondata di caos si ripercuoteva sul locale. un ragazzo con la faccia da huligans sorridente, ma a mandorla, entro’ correndo forte forte. diciamo piu’ forte di quanto si confa’ ad un cameriere che si ricorda della mosca che ha lasciato nella zuppa di miso e vuole intercettare la cucchiaiata del cliente prima che questo urli (o vomiti a getto). ma non era un cameriere ma un cinopunk da regolamento dei conti, in pieno stile “grosso guaio a china town”, solo un po’ piu’ giovane. Pochi secondi dopo ecco lo scatto del secondo. niente, ignari. forse anche un po’ ignavi, aspettiamo il chirashi. e poi il terzo. nulla. linea piatta. Capimmo tutto solo dopo molto tempo. perche’ il chirashi e’ un procedimento semplice ma precisio. riso sotto, pesce sopra, guarnizione sopra sopra. era quel momento, quello della guarnizione: zenzero, wasabi, prezzemolo. il nostro palato batteva le mani e la mano sinistra ravanava gli undici euro, ma …

Terminato lo scatto del terzo, confermandoci che la cina vincera’ le olimpiadi del 2008, comprendiamo il motivo di fuga dei campioni di sopra che, apparentemente hanno usato un lacrimogeno contro un loro compare. La strategia che traspare con il senno di poi e’ semplice: lacrimogeno all’ingresso del locale (perche’ ?), si corre dentro (perche’ ?), e poi qualcuno si accoltella fuori (chi con chi ?). Forse non saranno grandi scacchisti, ma indubbiamente buoni scattisti. L’utilita’ del lacrimogeno e del far alzare incazzate due sale di un ristorante cinese proprio non la vedo. Ok certo, forse quel regolamento dei conti aveva come obiettivo ispirare un weird programming language, nel caso l’hanno raggiunto. Pero’, davvero, mi sfugge ancora il perche’.

Ci sfuggiva il perche’ anche mentre la nube di dubbia natura faceva il suo ingresso tra i clienti, che tra il “si, e’ un lacrimogeno, ma mica saro’ io ad alzarmi correndo e urlando prima degli altri” e un “umh, sono cosi’ buoni i cinesi, ma per certi versi sono proprio inadempienti” ancora guardavano l’evolversi delle cose e l’impatto che avrebbe avuto sulla loro cena. Poi lo chiamo lacrimogeno perche’ mi faceva lacrimare, ma non era come quelli dei film: gas bianco che esce da un proiettilone… era una nube invisibile irritante. Fatto sta’ che alla fine i nostri chirashi sono pronti, ma ormai stiamo cercando la via di fuga e loro rimangono li’. da questo il nome:

I lost my chirashi at chinese fight = ilmcacf, per gli amici ilma, nacque quella sera di digiuno.

ilma e’ un linguaggio di programmazione esoterico che vuole dimostrare che le informazioni in rete non sono per forza quello che dicono di essere. Perche’ tutti sappiamo fare una connessione verso un server web, con un comodo tool di nome firefox scaricare la paginetta e visualizzarla, ma chi ci obbliga realmente a dover guardare quello che scarichiamo ? Se il file .html con su la ricetta del chirashi, adeguatamente compresso, fosse anche un pezzo di immagine vettoriale, chi potrebbe impedirglielo ? alla fine sono sempre sequenza di 1 e di 0, prima o poi un pezzetto in comune lo si trova. Quindi cosa ilma vuole fare ? scaricare pezzi di internet a caso e cercare di eseguirli ? quasi, ma non dei pezzi di internet a caso, solo quelli che gli dice il codice in esecuzione. E non cerca di esegurli alla grezza. ilma converte i file scaricati in un set di istruzioni shell.

La descrizione logica, tutta d’un fiato e’:

L’interprete ilma analizza una lista di URL, li scarica, se sono file ASCII C li interpreta secondo un proprio algoritmo, ne ricava un’istruzione tra 25 previste, le scrive su di un file e chiede a bash di interpretare questo prodotto.

La descrizione amichevole e’:

Hai presente brainfuck ? ecco cosi’, ma con piu’ istruzioni. e non usi le istruzioni nel codice, ma usi degli url che poi saranno convertiti in istruzioni, e poi generi shell script, non C.

La descrizione ufficiale pero’ rimane:

Ilma e’ un esempio comico di un linguaggio carico di trinita’ weird-software.

Prima di procedere con la spiegazione teologica alla base di ilma, e’ meglio iniziare a mettere delle piastrelle sul pavimento fluttuante che questo testo vi sta’ creando in testa. Le 25 istruzioni che vengono generate, sono queste:

ILMA DICTIONARY - written in http://www.hackmeeting.org 2007 edition
instruction number
/
|       instruction command
|       /
|       |
1       x=0
2       y=0
3       x=$(($x+1))
4       y=$(($y+2))
5       x=$(($y+$x))
6       y=$(($x-1))
7       read $x
8       y=$(($y>>1))
9       echo -e $x
10      echo -en $y
11      x=$(< $y)
12      if
13      than
14      fi
15      break
16      for i in `seq 0 $y`; do (
17      ); done
18      x=$RANDOM
19      x=$(($x<<$y))
20      x=$(($x>>$y))
21      y=$(($x<<1))
22      y=$(($x>>1))
23      y=$x
24      x=$y
25      y=${array[$x]}

read ilma_INSTRUCTION_SET for take the URL that you are looking phor

come si puo’ sapere quali URL corrispondono ad una certa istruzione ? viene generato il file ilma_INSTRUCTION_SET, che suona piu’ o meno cosi’:

instruction 1 http://crab.chem.nyu.edu/jfactor/jfm2full.c
instruction 1 http://ftp.cse.sc.edu/bioinformatics/mrbayes/mb_2.01/linalg.c
instruction 1 http://people.redhat.com/anderson/crash_sources/configure.c
instruction 1 http://probability.ca/jeff/comp/adapt/adaptfour.c
instruction 1 http://sakla.net/pspp/src/math/ts/innovations.c
instruction 1 http://securityvulns.com/files/inndex.c
instruction 1 http://svn.xiph.org/trunk/sushivision/dimension.c
instruction 1 http://www.bioalgorithms.info/downloads/code/LCS.c
instruction 1 http://www.club.cc.cmu.edu/~ajo/free-software/snippets/bitap.c
instruction 2 http://svn.irssi.org/repos/irssi/trunk/src/irc/core/lag.c
instruction 2 http://trac.boisestate.edu/bioinformatics/nullomers/parseq/gather.c
instruction 2 http://users.ece.utexas.edu/~adnan/pop-07/glu/list/list.c
instruction 2 http://www-cs-students.stanford.edu/~dalewis/EE118_Project/Code/beacon.c
instruction 2 http://www.boutell.com/cgibook/cd/SOURCE/C/nph-push.c
instruction 2 http://www.ccr.buffalo.edu/Workshop00/disks1.c
[...]

Quindi, il programmatore sapendo quale istruzione shell gli serve, cerca un equivalente in URL e la scrive in un file. gli url vanno messi tutti in fila. non sono ammessi altri caratteri se non degli URL.

Cosi’ e’ stato scritto l’hello world:

http://svn.gna.org/svn/warzone/tags/1.10a/src/mission.chttp://www.xs4all.nl/~johanw/CoS/c2.c
http://www.2600.com/code/221/dmsb.c
http://www.2600.com/code/221/dmsb.c
http://www.gozer.org/programs/c/files/crypt_string.c
http://www.gozer.org/programs/c/files/crypt_string.c
http://www.gammon.com.au/files/utils/aeslib.c
http://alumni.cse.ucsc.edu/~davevw/onscreen/firmdl.c
http://www.chpc.utah.edu/~cheatham/ptraj-6.5/io.c
http://www.xs4all.nl/~johanw/CoS/c2.c
http://www.gozer.org/programs/c/files/crypt_string.c
http://www.gozer.org/programs/c/files/crypt_string.c
http://www.gozer.org/programs/c/files/crypt_string.c
http://linux-1u.net/MotherBoard/Intel.Nics/eepro100.c
http://www.2600.com/code/221/dmsb.c
http://www.zemris.fer.hr/predmeti/os1/spock.c
http://svn.devjavu.com/utu/myriad/src/myriad/bstring/bstrlib.c
http://svn.arhuaco.org/svn/src/emqbit/junk/avr/encoder/encoder.c
http://www.chpc.utah.edu/~cheatham/ptraj-6.5/io.c
http://svn.arhuaco.org/svn/src/emqbit/junk/avr/encoder/encoder.c
http://www.chpc.utah.edu/~cheatham/ptraj-6.5/io.c
http://svn.arhuaco.org/svn/src/emqbit/junk/avr/encoder/encoder.c
http://www.chpc.utah.edu/~cheatham/ptraj-6.5/io.c
http://www.zemris.fer.hr/predmeti/os1/spock.c
http://svn.devjavu.com/utu/myriad/src/myriad/bstring/bstrlib.c
http://www.2600.com/code/221/dmsb.c
http://www.2600.com/code/221/dmsb.c
http://www.2600.com/code/221/dmsb.c
http://www.2600.com/code/221/dmsb.c
http://www.2600.com/code/221/dmsb.c
http://www.2600.com/code/221/dmsb.c
http://www.2600.com/code/221/dmsb.c
http://www.gozer.org/programs/c/files/crypt_string.c
http://public.office.vbulletin.com/sqlite/libsqlite/btree.c
http://www.math.utah.edu/~beebe/support/RTF/rtf/rtf2troff/rtf2troff.c
http://www.zemris.fer.hr/predmeti/os1/spock.c
http://svn.devjavu.com/utu/myriad/src/myriad/bstring/bstrlib.c
http://dev.csoft.org/agar/trunk/map/gfx.c
http://www.2600.com/code/221/dmsb.c
http://www.2600.com/code/221/dmsb.c
http://www.2600.com/code/221/dmsb.c
http://www.zemris.fer.hr/predmeti/os1/spock.c
http://svn.devjavu.com/utu/myriad/src/myriad/bstring/bstrlib.c
http://www.xs4all.nl/~johanw/CoS/c2.c
http://www.gozer.org/programs/c/files/crypt_string.c
http://www.comp.nus.edu.sg/~cs1101cl/labs_sem1_0506/lab2/evenweek/cannon.c
http://www.2600.com/code/221/dmsb.c
http://www.2600.com/code/221/dmsb.c
http://www.2600.com/code/221/dmsb.c
http://www.2600.com/code/221/dmsb.c
http://www.gammon.com.au/files/utils/aeslib.c
http://www.2600.com/code/221/dmsb.c
http://www.2600.com/code/221/dmsb.c
http://www.zemris.fer.hr/predmeti/os1/spock.c
http://svn.devjavu.com/utu/myriad/src/myriad/bstring/bstrlib.c
http://svn.gna.org/svn/warzone/tags/1.10a/src/mission.c
http://www.xs4all.nl/~johanw/CoS/c2.c
http://www.2600.com/code/221/dmsb.c
http://www.gozer.org/programs/c/files/crypt_string.c
http://www.gozer.org/programs/c/files/crypt_string.c
http://www.gammon.com.au/files/utils/aeslib.c
http://alumni.cse.ucsc.edu/~davevw/onscreen/firmdl.c
http://www.gozer.org/programs/c/files/crypt_string.c
http://spec.jpl.nasa.gov/ftp/pub/calpgm/cnjj.c
http://www.gozer.org/programs/c/files/crypt_string.c
http://spec.jpl.nasa.gov/ftp/pub/calpgm/cnjj.c
http://www.zemris.fer.hr/predmeti/os1/spock.c
http://svn.devjavu.com/utu/myriad/src/myriad/bstring/bstrlib.c
http://svn.gna.org/svn/warzone/tags/1.10a/src/mission.c
http://www.xs4all.nl/~johanw/CoS/c2.c
http://www.gozer.org/programs/c/files/crypt_string.c
http://linux-1u.net/MotherBoard/Intel.Nics/eepro100.c
http://www.gammon.com.au/files/utils/aeslib.c
http://www.2600.com/code/221/dmsb.c
http://www.gammon.com.au/files/utils/aeslib.c
http://alumni.cse.ucsc.edu/~davevw/onscreen/firmdl.c
http://www.gozer.org/programs/c/files/crypt_string.c
http://www.gozer.org/programs/c/files/crypt_string.c
http://www.gozer.org/programs/c/files/crypt_string.c
http://www.chpc.utah.edu/~cheatham/ptraj-6.5/io.c
http://www.zemris.fer.hr/predmeti/os1/spock.c
http://svn.devjavu.com/utu/myriad/src/myriad/bstring/bstrlib.c
http://www.xs4all.nl/~johanw/CoS/c2.c
http://www.gozer.org/programs/c/files/crypt_string.c
http://linux-1u.net/MotherBoard/Intel.Nics/eepro100.c
http://www.2600.com/code/221/dmsb.c
http://www.zemris.fer.hr/predmeti/os1/spock.c
http://svn.devjavu.com/utu/myriad/src/myriad/bstring/bstrlib.c
http://www.cl.cam.ac.uk/~mgk25/ucs/langinfo.c
http://www.chpc.utah.edu/~cheatham/ptraj-6.5/io.c
http://svn.arhuaco.org/svn/src/emqbit/junk/avr/encoder/encoder.c
http://www.chpc.utah.edu/~cheatham/ptraj-6.5/io.c
http://svn.arhuaco.org/svn/src/emqbit/junk/avr/encoder/encoder.c
http://www.chpc.utah.edu/~cheatham/ptraj-6.5/io.c
http://alumni.cse.ucsc.edu/~davevw/onscreen/firmdl.c
http://www.chpc.utah.edu/~cheatham/ptraj-6.5/io.c
http://svn.arhuaco.org/svn/src/emqbit/junk/avr/encoder/encoder.c
http://www.chpc.utah.edu/~cheatham/ptraj-6.5/io.c
http://www.zemris.fer.hr/predmeti/os1/spock.c
http://svn.devjavu.com/utu/myriad/src/myriad/bstring/bstrlib.c
http://www.cl.cam.ac.uk/~mgk25/ucs/langinfo.c
http://www.chpc.utah.edu/~cheatham/ptraj-6.5/io.c
http://svn.arhuaco.org/svn/src/emqbit/junk/avr/encoder/encoder.c
http://www.chpc.utah.edu/~cheatham/ptraj-6.5/io.c
http://svn.arhuaco.org/svn/src/emqbit/junk/avr/encoder/encoder.c
http://www.chpc.utah.edu/~cheatham/ptraj-6.5/io.c
http://svn.arhuaco.org/svn/src/emqbit/junk/avr/encoder/encoder.c
http://www.chpc.utah.edu/~cheatham/ptraj-6.5/io.c
http://svn.arhuaco.org/svn/src/emqbit/junk/avr/encoder/encoder.c
http://www.chpc.utah.edu/~cheatham/ptraj-6.5/io.c
http://alumni.cse.ucsc.edu/~davevw/onscreen/firmdl.c
http://www.chpc.utah.edu/~cheatham/ptraj-6.5/io.c
http://www.2600.com/code/221/dmsb.c
http://www.zemris.fer.hr/predmeti/os1/spock.c
http://www.chpc.utah.edu/~cheatham/ptraj-6.5/io.c
http://www.cs.utah.edu/flux/oskit/examples/more/netbsd_fs_posix.c

LA TRINITA’ WEIRD-SOFTWARE:

Programmazione parassita: ilma per funzionare succhia la banda ad un altro mammifero in rete. se mai esistera’ un ilma software in grado di auto-replicarsi dovrebbe per forza chiamarsi zanzara. La programmazione parassita ha come dimostrazione che un dato in internet, se diveramente interpretato, puo’ servire ad altro rispetto a quello per il quale e’ stato proposto. La compressione secondo LZ(77 e 78) funziona (a grandi linee :) cosi’: cerco dei pattern ricorrenti in un file, me li segno in un dizionario, ogni volta che questo pattern compare metto un riferimento al dizionario anziche’ scriverlo tutto. Una pagina innocente come: it.wikipedia.org/wiki/Foca potrebbe essere il dizionario del file compresso sul mio desktop ? eh si, cari miei. e la forza di un dizionario non e’ forse la sua grandezza ? gia’, rsync usa bzip2 internamente con un dizionario lungo fino a un giga. e l’internet, non e’ forse un po’ piu’ grande di un giga ? Questo e’ l’utilizzo parassita delle informazioni. anche xkcd sembra l’abbia percepito, da questa immagine:

L’esecuzione anti forense: ogni qual volta qualcuno viene derubato del suo portatile, si forma l’angelo, il demone e il diavolo al suo fianco. l’angelo dice: “oh, devi averlo dimenticato, qualche hacker che in futuro portera’ equilibrio nella forza ora potra’ godere del tuo hardware, rasserenati”. il diavolo: “sei stato seguito e derubato, le tue fragili password cadranno davanti al bruteforce e l’analisi forense evidenziera’ quello che neanche tu sai di te stesso”. il demone: “i black helicopters stanno arrivando, la tua banale crittografia non terra’ nulla, i tuoi piu’ intimi segreti ti saranno rivoltati contro”. Questo perche’ non si puo’ negare che se scarico un software, lo eseguo su disco non cifrato, poi qualche traccia di lui rimarra’. si potra’ sempre analizzare il disco staccato, trovare l’eseguibile rimosso, simulare la sua esecuzione e comprenderne il funzionamento o le condizioni di funzionamento. il software c’e’ e quindi viene eseguio. ma per quanto riguarda ilma, il software non c’e’ :) ci sono degli URL. e’ forse steganografia di url ? no, non si sta nascondendo nulla. o forse si, si stanno nascondendo delle istruzioni dentro i file .c che non sanno di averle dentro ? o si dovrebbe trattare di plausible deniability, perche’ e’ plausibile io abbia una serie di URL in un file ? fatto sta’ che l’interprete ilma scarica i file, deriva le istruzioni, crea il suo shell script temporaneo e lo esegue. quello che sarebbe corretto sarebbe eseguire ilma in /dev/shm, o in ramdisk.

La mortalita’ del codice:
il codice e’ un’informazione, e l’informazione una volta diffusa non e’ piu’ segreta. per riuscire a renderla meno utilizzabile una volta visualizzata sono arrivati a creare un ambominio come il DRM. ma se l’informazione potesse morire ? o meglio: se l’informazione non esistesse, e per crearsi fosse necessario un qualcosa di esterno ? basta che si mantiene il controllo di quella cosa esterna e la si modifica quando si vuole esercitare il diritto divino della terminazione del contratto di vita. se ilma si affida a degli URL esterni, e uno di questi URL cambia, anche lo script ilma smettera’ di andare. Quindi se noi mantenessimo il controllo di uno di questi URL, a nostra volonta’ l’istruzione derivata da noi potrebbe cambiare, rendendo inutile le altre. Quella minima risorsa spesa sarebbe sufficente per staccare il nostro sw dal matrix. “se hai qualcosa di importante da dire a Switch fallo ora” “no, cosi’ no!” zOMG, pwned.

Presto il rilascio, presto…