Decifrando o script bash ofuscado da camiseta da Uniqlo
(tris.sherliker.net)- Uma camiseta com design da Akamai vendida nas lojas da Uniqlo trazia impresso um código bash ofuscado que executava com
evalo resultado debase64 --decode, mas na prática era um easter egg da campanhaPeace for All - Ao decodificar a Here string em Base64, surge um script que repete no terminal a mensagem
♥PEACE♥FOR♥ALL♥em uma animação senoidal - Como Base64 não tem correção de erros, a transcrição foi difícil; depois de conferir o padding da string e verificar aspas e chaves, os resultados de OCR do Android, Tesseract e Claude foram comparados e organizados
- O script decodificado combina
tput,bce escapes ANSI de 256 cores para calcular a posição e as cores dos caracteres de acordo com o tamanho do terminal, além de restaurar o cursor ao encerrar comCTRL+C - A Akamai explicou o código real no verso como uma referência ao Linux, e a fonte foi corrigida de uma estimativa inicial de Consolas para Roboto Mono
Código executável no verso da camiseta
- Na frente da camiseta Uniqlo x Akamai
Peace for Allhá um coração entre chaves, e no verso foi impresso um grande bloco alfanumérico - De perto, o bloco é um código bash que começa com shebang e segue uma estrutura que decodifica uma Here string em Base64 com
base64 --decodee a passa paraeval - À primeira vista, pode parecer algo como uma “forma de distribuir vírus”, mas o verdadeiro objetivo é exibir uma mensagem de easter egg
- A camiseta é um produto desenhado pela Akamai em apoio à Peace for All campaign da Uniqlo
OCR e processo de transcrição
- Como Base64 não tem recurso de correção de erros, era necessária uma transcrição perfeita da string impressa para convertê-la em algo executável
- A string terminava com o padding esperado e as aspas e chaves também batiam, o que indicava alta chance de ser código completo
- Três métodos foram usados em conjunto para a transcrição
- OCR nativo do circle-to-search no Android
- Tesseract com algumas opções e ajustes
- OCR via Claude e geração de tabela de posições
- Os três resultados foram comparados com
diffpara encontrar pontos de divergência, e o restante foi ajustado manualmente - Outros designs de camiseta da mesma linha Uniqlo x Akamai parecem ter sido cortados de um bloco de código maior; os imports ficaram truncados e
returntermina emretu, deixando o código sem chance de compilar
Como o script bash decodificado funciona
- Ao decodificar o Base64, aparece um easter egg em bash bem comentado
- No início do script há mensagens de parabéns em inglês e japonês
Congratulations! You found the easter egg! ❤️おめでとうございます!隠されたサプライズを見つけました!❤️
- A string usada na animação repete o padrão
♥PEACE♥FOR♥ALL♥PEACE♥FOR♥ALL... - O tamanho do terminal é obtido com
tput colsetput lines, e o comprimento da string é calculado com${#text}do bash - O cursor é ocultado com
tput civis, e ao receberSIGINTele é restaurado comtput cnorm; exit
Como a animação é implementada
- O loop continua rodando como um loop infinito no formato
for (( t=0; ; t+=1 )) - Em cada repetição, o caractere atual a ser exibido é obtido de
text, um por vez - O cálculo de posição usa
bc -lpara obter o valor do senoangle = t * 0.2sine_value = s(angle)x = (cols / 2) + (cols / 4) * sine_value
- O valor calculado de
xé ajustado para não sair dos limites do terminal, ficando entre 0 ecols - 1 - A cor é calculada como um gradiente entre 12, correspondente ao cyan, e 208, correspondente ao orange, na paleta de 256 cores
- A saída usa escapes ANSI e
tput cuppara imprimir o caractere colorido na posição definida, descendo com quebras de linha - Como resultado, a mensagem da campanha
Peace for Allaparece no terminal em um loop senoidal contínuo
Fonte e explicação da Akamai sobre o design
- A estimativa inicial da fonte era Consolas, mas depois da confirmação do usuário ralphinus no Hacker News, ela foi corrigida para Roboto Mono
- Como base para a estimativa errada, foram citados o
0com inclinação leve, o1sem serifa e as curvas arredondadas deBDyge do número2 - Na época do lançamento da camiseta, a Akamai explicou a mensagem do design em um comunicado à imprensa
- O amarelo-acastanhado claro remete aos gabinetes plásticos “beige box” dos computadores da internet inicial, e o coração na frente representa o uso da internet para o bem em todo o mundo
- O código real no verso é uma referência ao Linux, que a Akamai relaciona à “linguagem open source da internet” e a uma linguagem comum em direção a um mundo mais seguro e conectado
- Outro caso de interesse pela mesma camiseta é o texto de Wen Chuan Lee, que por sua vez leva a outro texto relacionado
1 comentários
Opiniões do Hacker News
“A outra camiseta que a Uniqlo x Akamai vende na mesma linha tem um código que claramente é um design inacabado”
Engraçado imaginar ter que devolver uma camiseta porque ela não funciona direito
“Por que está devolvendo, o tamanho não serviu ou você não gostou?”
“Não, tem um erro de sintaxe na linha 37, então não executa, e estou preocupado que as pessoas na rua pensem que estou promovendo scripting Bash inseguro”
Se você gosta desse tipo de coisa, talvez curta o trabalho do Martin Kleppe. Um exemplo é o Quine Clock
https://aem1k.com/qlock/
Há também uma versão que fiz engenharia reversa anos atrás para uma forma não ofuscada
https://gist.github.com/olooney/a89db3932b089925b71b68d7e9f2...
Ele também fez muitas outras ótimas visualizações ASCII
https://aem1k.com/
É extremamente impressionante, mas ainda assim
A fonte não é Consolas, é Roboto Mono
O mais estranho é que a fonte em si é uma monoespaçada correta, mas a composição na camiseta não é. Há kerning, especialmente perceptível no par “Iy”, e caracteres estreitos como “i” parecem ocupar menos espaço horizontal. Meu palpite é que foi composta com alguma ferramenta como o “optical kerning” do InDesign
O motivo de usar uma fonte monoespaçada é que ela se encaixa bem em uma grade. Mas, mesmo dentro dessa grade, ainda há espaço para mover as letras um pouco para a esquerda ou para a direita, o que poderia resultar em uma fonte monoespaçada mais legível. Claro que, sempre que uma letra for deslocada para a esquerda, o espaço à direita aumenta, então há uma chance igualmente grande de o resultado ficar horrível
Essa camiseta é muito boa. Há um vídeo interessante em que o designer real explica o processo de criação. Ele inclui até o processo de tornar o OCR difícil de propósito: https://youtu.be/jocGLiecpjU?t=526
https://archive.org/details/1983-01-compute-magazine/page/96...
No Samsung S24U, pressionei e segurei o botão “circle to search” na tela inicial para abrir a interface da ferramenta de IA, depois pressionei e segurei o texto e copiei tudo de uma vez. Não sei o nome oficial, mas levou uns 2 segundos
Fazer OCR disso é um pesadelo, e é um bom benchmark para coisas que se dizem bons modelos de OCR/visão
Mas acho que seria bem fácil se você desse a imagem a uma ferramenta agêntica com um bom modelo de visão, como os Claude ou GPT mais recentes, separasse por linhas e mandasse fazer OCR de cada linha individualmente
Também fico curioso se o script em si, antes da ofuscação, foi escrito por um LLM. Parece ter muitos comentários, mas neste caso tudo bem :)
A mensagem de parabéns aparece tanto em inglês quanto em japonês, e há um emoji de coração. Havia a intenção de um gradiente de ciano para laranja, mas o intervalo começa no bloco ANSI e termina no meio do bloco de 256 cores, e as 256 cores de terminal nem são organizadas como um gradiente. Além disso, não há sleep no fim do loop; acho que um LLM teria acrescentado isso de forma defensiva
Os caracteres são fáceis de separar e não há um fundo estrutural que confunda o leitor. É diferente, por exemplo, de uma data de validade em tampa de alumínio de iogurte. Também não há uma textura quase textual para bagunçar o resultado, e a fonte é limpa e padrão
Agora não me lembro do nome. Houve coisas demais sugando minha atenção nesse meio-tempo
Curiosamente, se eu tento copiar a string inteira, incluindo a parte do hashbang, o desempenho fica muito pior. Fico curioso sobre o que ele faz internamente para funcionar tão bem
Chamar codificação base64 de ofuscação
Eu estava esperando alguma técnica sofisticada de desofuscação de JS; para dizer o mínimo, a decepção foi imensa e arruinou meu dia
Uau, eu vi essa camiseta na loja e disse à minha namorada: “Esse script não tem como funcionar de verdade, deve ser só decorativo”. Eu devia ter investigado mais
Nada mal. Minha única ressalva sobre o script é que eu provavelmente teria colocado
sleep 0.1
dentro do loop. Assim, quando fosse exibido no terminal, daria para realmente ler. Terminais modernos rolam rápido demais, e não dá para ver as mensagens passando.
Reduzir para algo como atualização a 10 Hz fica bem agradável de ver
Achei engraçado o autor testar várias ferramentas de OCR, obter resultados inconsistentes e depois passar um tempão corrigindo manualmente a melhor saída. Em vez de simplesmente digitar tudo direto
O OCR do Google via Google Lens no celular também extraiu bem, mas não foi 100% preciso. Ainda assim, corrigir levaria muito menos tempo do que copiar à mão. Não sei o que o autor usou, mas teria sido bom se ele tivesse compartilhado como foram as tentativas com OCR; provavelmente testou alguma ferramenta de OCR simples
Eu certamente escolheria OCR também. Afinal, é preciso estar preparado para a próxima camiseta de Bash que aparecer
Um ex-colega tinha uma camiseta com um programa em Go, e eu sempre achei bem legal
[0] https://github.com/GL-Kageyama/UNIQLO_Akamai_T-shirt_Code