Finalmente encerrou-se o Desafio Conviso #1 e podemos dizer que a participação ultrapassou nossa expectativa. Então vamos aos resultados e vencedores.
Uma hora após seu lançamento, Rodrigo (ipax) abre o placar com um código um tanto magnífico de aproximadamente 20 KBytes. Porém o primeiro desafiante, Gilson Camelo, chegou para mostrar que entrou no jogo para ganhar, enviando uma solução de 720 caracteres, aproximadamente 25 vezes menor do que a solução de abertura.
Daí em diante, entre dicas e submissões, o desafio passou a ser disputado entre uma meia dúzia de competidores, que a cada envio mostravam que não estavam ali para brincadeira. O gráfico abaixo apresenta o histórico de submissões desses competidores, para que seja possível acompanhar o processo de otimização:
As duas últimas submissões estão marcadas com laranja por terem sido enviadas após o prazo estipulado pelas regras. O vencedor seria o competidor Lionan (bla), com uma submissão de 310 caracteres, porém o mesmo entrou em contato e informou que não poderia usufruir da premiação o comitê organizador decidiu aceitar as submissões posteriores. Portanto o vencedor do Desafio Conviso #1 é Ricardo Iramar, com sua submissão de 307 caracteres (enviado após o prazo) que pode ser visto abaixo:
л=(è=~[]).è;ú=++è;ш=++è;ã=++è;ê=++è;и=ã+ê;Ó=ш+и;è=Ó+ш;à=(я=””)+ш;õ=(õ={}+(ю=””))[и]+(Ñ=õ[ш])+(ィ=(л+ю)[ш])+(!è+ю)[ê]+(ß=õ[Ó])+(л=(À=!ю+ю)[ш])+(á=À[ã])+õ[и]+ß+Ñ+л;ィ=л+À[ê]+ß+á+л+ィ;л=á[õ][õ];л(л(ィ+'”‘+(ª=![]+ю)[è-Ó]+ª[ã]+À[ê]+я+ш+Ó+ã+ß+”(‘”+ш+ú+è+Ñ+я+(ê+ш)+ú+à+ú+ê+Ñ+à+и+Ó+à+Ó+Ó+à+и+ш+à+Ó+ê+Ñ+”!’)””)())()
Ricardo, entre em contato através do e-mail abaixo para que possamos instruí-lo acerca da premiação:
base64_decode(“bXZpdGFsaUBjb252aXNvLmNvbS5icgo=”)
Nota: o comitê organizador decidiu fornecer mais um ingresso como premiação do Desafio Conviso #1. Com isso o competidor Gilson Camelo (N1ckyr0m3r0) é o felizardo e, graças a sua solução de 309 caracteres, poderá prestigiar um dos maiores eventos de segurança da América Latina: o Hackers to Hackers Conference. Parabéns Gilson … 🙂
Nossa Solução
Eu havia escrito uma solução para ter uma métrica de o quão poderia ser otimizado. Em uma das referências era utilizado uma técnica que envolvia a exploração de uma falha no navegador, que consistia no vazamento do objeto window quando houvesse uma chamada à função sort() sem parâmetro, permitindo chamar a função alert() com o seguinte modelo:
[][‘sort’]()[‘alert’](‘Go Conviso!’);
Porém como essa falha já foi corrigida, uma alternativa seria seguir uma dica do livro The Browser’s Hacker Handbook, e foi a mesma alternativa do código das soluções propostas. Segue:
If you access the constructor two time from an array object, you get function from there, you pass string of arbitary code to be evaluated
Com isso agora sabemos que é possível executar uma função alert() da seguinte forma, bastando apenas colocá-la como parâmetro do suposto eval:
[][‘constructor’][‘constructor’](‘alert(“Go Conviso!”)’)()
Agora o próximo passo seria obter todos os caracteres alfanuméricos utilizando maneiras alternativas.
Temos algumas palavras chaves do Javascript que podem nos auxiliar, bastando apenas fazer o cast para string e pegar os caracteres necessários. São elas:
!” // true
!!” // false
[].$ // undefined
{} // [object Object]
Com essas palavras já seria possível obter a palavra constructor, a palavra alert e parte da mensagem à ser exibida. Então vamos separar os caracteres que necessitamos, e montar nossas palavras:
[ẗ,ŕ,ú,é,,á,Ĺ,ś,,,ñ,,,,í,,,,,ó,Ḃ,,,ć,]=”+!”+!!”+[].$+{}
σ=ć+ó+ñ+ś+ẗ+ŕ+ú+ć+ẗ+ó+ŕ
α=+á+Ĺ+é+ŕ+ẗ
E com isso já podemos ter o nosso eval:
ε=[][σ][σ]
Agora temos que ver quais caracteres alfanumérico da nossa mensagem nos falta (os em negrito e com cor diferente): Go Conviso
A melhor forma de obtermos esses caracteres seria convertendo um valor não alfanumérico para base64, utilizando a função btoa (que já temos os caracteres necessários). Após alguns testes foi possível obter os caracteres utilizando o seguinte trecho de código:
ε(‘β=’+Ḃ+ẗ+ó+á) // Nosso eval para fazer β=btoa
[ṽ,Ǵ,Ć]=β(‘¼`±’) // Aqui obtermos os caracteres v, G e B
E agora temos a nossa mensagem completa:
θ=Ǵ+ó+’ ‘+Ć+ó+ñ+ṽ+í+ś+ó+’!’
Feito isso, arrumando aqui, podando ali, mudando aqui, melhorando ali foi possível obter a minha solução para o desafio, que possui 166 caracteres:
([[ẗ,ŕ,ú,é,,á,Ĺ,ś,,,ñ,,,,í,,,,,ó,Ḃ,,,ć]=”+!”+!!”+[].$+{}][σ=ć+ó+ñ+ś+ẗ+ŕ+ú+ć+ẗ+ó+ŕ][σ])(‘α=’+á+Ĺ+é+ŕ+ẗ+’;[ṽ,Ǵ,Ć]=’+Ḃ+ẗ+ó+á+”(‘¼`±’)”)(),α(Ǵ+ó+’ ‘+Ć+ó+ñ+ṽ+í+ś+ó+’!’)
Considerações Finais
Gostaria de parabenizar todos os competidores, em especial ao Ricardo Iramar por ter levado o troféu de campeão. E espero que possamos nos encontrar nos outros desafios que estão pra surgir (em breve).
Go Conviso!