Javascript com apenas seis caracteres
Utilizando apenas os caracteres !+[]()
é possível escrever quase qualquer programa Javascript, mas como isso é possível?
Você provavelmente já deve ter se deparado com o JSFuck em algum momento. Vamos entender como algumas coisas podem ser feitas utilizando apenas esses seis caracteres. Neste artigo iremos criar a string ideias
com esses caracteres.
Básico
A ideia básica por trás disso é utilizar o mecanismo de coersão implícita da linguagem que permite criarmos cada um dos caracteres que desejamos. O Javascript trabalha com valores “falsos” que podem ser o booleano false
, uma string vazia ou o número 0, e valores “verdadeiros” que podem ser o booleano true
, valores diferentes de zero, strings, arrays ou objetos.
Para a criação da nossa string utilizaremos os caracteres de soma (+
), negação (!
), criação de arrays ([]
) e agrupamentos (()
) da linguagem.
Com o seguinte código conseguimos criar um array em Javascript:
[]
Estes dois caracteres, porém, não servem só para isso. Colchetes também são utilizados para acessar uma posição dentro de um array, quando passado um parâmetro. Outra coisa que podemos lembrar é que um array vazio também representa um valor “verdadeiro”, assim como um número inteiro positivo. Com isso conseguimos fazer a seguinte loucura:
[][[]]
O código acima está criando um array e tentando acessar a posição “verdadeira”, ou 1, do mesmo, resultando assim em undefined
. Mas para que isso nos serve? Se somarmos undefined
com um array vazio, o Javascript irá converter para nós na string "undefined"
, desta forma:
[][[]]+[]
é o equivalente a undefined+""
Criando números
No Javascript, assim como em várias outras linguagens, strings são tratadas como arrays, logo, conseguimos acessar caracteres dela utilizando nossos colchetes. O que precisamos agora são de números, para conseguir acessar as posições desejadas da string.
Como visto anteriormente, um array vazio é o equivalente a um valor “verdadeiro”. Se negarmos o array com o caractere !
teremos um valor false
, e negando duas vezes temos o true
. Ao colocar o caractere +
na frente de um valor booleano, ele é convertido para um inteiro. Desta forma, o booleano True pode ser convertido para 1 adicionando o caractere +
na frente.
+![]
é equivalente a +false
que é equivalente a 0
+!![]
é equivalente a +true
que é equivalente a 1
Para obter os demais números, basta adicionar o valor 1 a quantidade de vezes desejada:
1 | 1 === +!![] |
Acessando caracteres de uma string
Agora que conseguimos criar números, podemos acessar as posições desejadas na string "undefined"
bara buscar os caracteres que quisermos. O caractere “i”, por exemplo, fica no índice 5, logo conseguimos buscá-lo com o seguinte código:
"undefined"[5]
é equivalente a ([][[]]+[])[+!![]+!![]+!![]+!![]+!![]]
que é equivalente a "i"
O caractere “d”, por sua vez, está no índice 2, logo podemos utilizar o seguinte código para buscá-lo:
"undefined"[2]
é equivalente a ([][[]]+[])[+!![]+!![]]
que é equivalente a "d"
Nem todos caracteres podem ser encontrados na string “undefined”, por isso precisamos encontrar outros métodos para diferentes caracteres. Transformando os booleanos true
e false
para strings conseguimos alguns caracteres extras:
![]+[]
é equivalente a "false"
!![]+[]
é equivalente a "true"
Para os caracteres restantes da nossa string desejadas isso já nos é suficiente. Conseguimos encontrar o “e” no índice 3 da string “true” e os caracteres “a” e “s” nos índices 1 e 3 da string “false” respectivamente. É possível fazermos então o seguinte:
"true"[3]
é equivalente a (!+[]+[])[+!![]+!![]+!![]]
que é equivalente a "e"
"false"[1]
é equivalente a (![]+[])[+!![]]
que é equivalente a "a"
"false"[3]
é equivalente a (![]+[])[+!![]+!![]+!![]]
que é equivalente a "s"
Juntando tudo
Para finalizar a nossa string, basta concatenarmos todos os caracteres encontrados com o +
da seguinte maneira:
1 | ([][[]]+[])[+!![]+!![]+!![]+!![]+!![]] //i |
Executando o código acima no console do seu navegador você poderá ver que a string “ideias” será impressa na tela.
Conclusão
Apesar de ser possível a criação de código Javascript com apenas seis caracteres, não são muitas os casos de uso para isto. Um dos possíveis usos seria a ofuscação de códigos que acabam ficando disponíveis para usuários finais da aplicação, porém temos que lembrar que codificar desta forma pode deixar o código muito mais extenso, além de ter uma performance reduzida drasticamente.
O repositório do JSFuck exemplifica ainda como conseguir realizar outras funcionalidades do javascript, além de números e strings.