2 pontos por GN⁺ 5 시간 전 | 1 comentários | Compartilhar no WhatsApp
  • Uma camiseta com design da Akamai vendida nas lojas da Uniqlo trazia impresso um código bash ofuscado que executava com eval o resultado de base64 --decode, mas na prática era um easter egg da campanha Peace 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, bc e 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 com CTRL+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 All há 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 --decode e a passa para eval
  • À 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 diff para 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 return termina em retu, 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 cols e tput lines, e o comprimento da string é calculado com ${#text} do bash
  • O cursor é ocultado com tput civis, e ao receber SIGINT ele é restaurado com tput 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 -l para obter o valor do seno
    • angle = t * 0.2
    • sine_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 e cols - 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 cup para imprimir o caractere colorido na posição definida, descendo com quebras de linha
  • Como resultado, a mensagem da campanha Peace for All aparece 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 0 com inclinação leve, o 1 sem serifa e as curvas arredondadas de BDyg e do número 2
  • 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

 
GN⁺ 5 시간 전
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”

    • Para os funcionários do atendimento ao cliente da Uniqlo: se alguém tentar devolver uma camiseta por causa de um erro no código de computador impresso, basta recusar e responder: “Um script kiddie de verdade teria percebido esse erro antes de comprar”
    • Estou shell-shocked com tanta falta de garantia de qualidade. Pelo menos dá para aplicar um patch?
  • 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/

    • Isso é mesmo um Quine?
      É 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

    • Será que alguém já fez uma fonte monoespaçada com kerning dinâmico? É uma ideia meio maluca que eu nem tinha considerado antes de ler o comentário acima. À primeira vista parece não fazer sentido, mas me ouça
      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
    • Parece correto. Adicionei uma correção ao texto e citei este comentário também
  • 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

    • Talvez seja mais rápido simplesmente digitar tudo manualmente do que encontrar um método de OCR. Deve dar aquela sensação de copiar código de jogos da revista COMPUTE! de 45 anos atrás
      https://archive.org/details/1983-01-compute-magazine/page/96...
    • Sou o autor do texto. Não tinha visto esse link, muito obrigado. Fico feliz de ver isso, e também é bom saber que a dificuldade com OCR não era um problema só meu, mas um projeto intencional
    • Vi o link, mas não encontrei a parte em que ele diz que tornou o OCR difícil. O que exatamente foi feito para dificultar o OCR?
    • Mas o OCR não é difícil. Nem sei por que o texto dedicou uma seção inteira a isso
      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 :)

    • Não parece ter sido escrito por LLM. Algumas coisas chamam a atenção
      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
    • Não é tão difícil. Nosso modelo industrial de OCR leu corretamente na primeira tentativa com os parâmetros padrão
      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
    • A última vez que as pessoas na internet ficaram obcecadas tentando fazer OCR de algum base64 foi alguns meses atrás. Foi quando o DoJ divulgou em massa os e-mails de uma pessoa falecida, mas em PDFs rasterizados
      Agora não me lembro do nome. Houve coisas demais sugando minha atenção nesse meio-tempo
    • O recurso de copiar texto de imagens do Safari lida com quase toda a parte base64 da string. Ele só leu o primeiro caractere errado, como I em vez de T
      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
    • É mesmo um pesadelo? Colei a primeira miniatura reduzida da camiseta no ChatGPT e ele decodificou de primeira, além de dizer o que o script Bash faz
  • 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

    • É fácil deixar passar. Na maior parte do tempo, não estamos calmos, então nossos pensamentos ficam no piloto automático
  • 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

    • Então talvez dê para costurar um patch nisso?
  • 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

    • Pensei a mesma coisa. Mas eu sou da geração que cresceu passando horas copiando “jogos” publicados em revistas e livros num teclado de borracha. E depois passava mais algumas horas corrigindo os typos
    • Rodei no PaddlePaddle OCR e ele processou perfeitamente.
      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
    • Levei quase 2 minutos para digitar 4 linhas e deixei passar um caractere
      Eu certamente escolheria OCR também. Afinal, é preciso estar preparado para a próxima camiseta de Bash que aparecer
    • Isso me lembra a realidade da automação de tarefas em ambientes corporativos. É comum engenheiros gastarem mais de 40 horas automatizando algo que um iniciante faria manualmente em 10 minutos e que só é necessário uma vez por semana. Parece que automatizar tudo é o futuro
    • “Só digitar” provavelmente gera mais erros para uma pessoa média
  • 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

    • Não tive certeza se você quis dizer um programa para jogar Go ou a linguagem Go. Seria divertido se alguém fizesse um programa de Go em Go
    • Comprei uma este ano que tinha código Go. Nem imaginei que fosse código de verdade; achei que fosse só conteúdo aleatório