Mignolo col prof alla conquista del mondo con Javascript

No, non è un’imprecazione, è il prodotto di una sfida per programmatori. Il tema è:

“Come scrivere qualunque tipo di codice Javascript eseguibile utilizzando il minor numero di caratteri possibile?”

JSFuck ne usa solamente sei: +, !, (, ), [, ].
Poco importa che il codice risulterà illeggibile e lungo in maniera esagerata. La vera domanda è: perché?

Ma veniamo prima al come.
Utilizzando questi sei caratteri è possibile scrivere qualunque codice Javascript. La base di tutto risiede nel metodo Javascript:


[]["filter"]["constructor"]

Tramite la proprietà “constructor” si può creare una Funzione con delle stringhe di testo. Ad esempio l’istruzione alert(1) può essere scritta così:


alert(1)
/*è equivalente a */
[]["filter"]["constructor"]("alert(1)")()

Del metodo abbiamo già le parentesi quadre e tonde che fanno parte del limitatissimo set a disposizione. Se riuscissimo a generare un alfabeto completo avremmo tutto quello che ci serve per conquistare il mondo!

Partiamo dalla lettera “a”:

La lettera “a” è inclusa nella parola “false”, che è tipicamente un valore booleano che possiamo trasformare in stringa.


/*negazione applicata ad un array vuoto*/
![] === false 

/*per trasformare il valore booleano 
in una stringa sommo un array vuoto*/
![]+[] === "false"

Ora che siamo in possesso della stringa di testo “false”, recuperiamo la lettera “a”:


/*contando da 0, l'indice 1 
fa riferimento alla seconda lettera 
della parola "false".*/
"false"[1] === "a"

/*tradotto parzialmente 
in JSfuck equivale a:*/
(![]+[])[1] === "a"

Ci siamo quasi, ma prima recuperiamo il carattere “1”:


![] === false;
/*valore inverso con la negazione*/
!![] === true

//converto in numero
+!![] === 1

Ora abbiamo tutti gli elementi per ottenere il carattere “a” in puro stile JSFuck.


"false"[1] === "a"

/*tradotto:*/
(![]+[])[+!![]] === "a"

Recuperare altri caratteri può assere molto più complicato. Ad esempio la lettera “I” è generata da un codice che comincia ad essere piuttosto lungo:


(+(+!+[]+(!+[]+[])[!+[]+!+[]+!+[]]+(+!+[])+(+[])+(+[])+(+[]))+[])[+[]] === "I"

Esistono anche dei convertitori con cui si possono sperimentare delle traduzioni. Ad esempio alert(1) può essere definito da una sequenza di “soli” 1227 caratteri composta esclusivamente dai nostri sei di base:


alert(1)
/*equivale a:*/
[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]][([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[+!+[]]+([][[]]+[])[+[]]+([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+(!![]+[])[+!+[]]]((![]+[])[+!+[]]+(![]+[])[!+[]+!+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]+(!![]+[])[+[]]+(![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[!+[]+!+[]+[+[]]]+[+!+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[!+[]+!+[]+[+[]]])()

Per chi volesse approfondire la questione consiglio questo bellissimo articolo scritto da Jasper Cashmore. Altri riferimenti li potete trovare anche su Wikipedia.

Va bene, ma perché tutto questo?
Tutto nasce dal contest Yet Another Useless Contest. Less chars needed to run arbitrary JS code che farebbe parte di studi e ricerche di tecniche di sicurezza informatica e offuscamento di codice. Roba seria, pare.
Ma forse la verità è che non si tratti altro che di un gioco. Una specie di rompicapo da risolvere, che dà lo stesso piacere che si può trovare nel completare un sudoku o un qualunque enigma da Settimana Enigmistica. Qualcosa di superfluo che non serve a nulla se non a soddisfare l’insopprimibile istinto creativo che ci è proprio. E scusate se è poco.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato.

Questo sito usa Akismet per ridurre lo spam. Scopri come i tuoi dati vengono elaborati.