Déchiffrer le script bash obfusqué d’un t-shirt Uniqlo
(tris.sherliker.net)- Le t-shirt au design Akamai vendu dans les magasins Uniqlo comportait un code bash obfusqué imprimé, qui exécutait avec
evalle résultat debase64 --decode, mais il s’agissait en réalité d’un easter egg pour la campagnePeace for All - Une fois décodé le Here string encodé en Base64, on obtient un script qui affiche en boucle dans le terminal le message
♥PEACE♥FOR♥ALL♥sous forme d’animation sinusoïdale - Comme Base64 n’intègre pas de correction d’erreurs, la transcription était délicate ; après avoir vérifié le padding de la chaîne ainsi que les guillemets et accolades, les résultats d’OCR Android, de Tesseract et de Claude ont été comparés puis consolidés
- Le script décodé combine
tput,bcet des séquences d’échappement ANSI 256 couleurs pour calculer la position et la couleur des caractères selon la taille du terminal, et restaure le curseur lors d’une sortie avecCTRL+C - Akamai a expliqué le lien entre le vrai code au dos et Linux ; la police, initialement supposée être Consolas, a été corrigée en Roboto Mono
Du code exécutable au dos du t-shirt
- Le devant du t-shirt Uniqlo x Akamai
Peace for Allmontre un cœur entre accolades, tandis que le dos affiche un grand bloc alphanumérique - En regardant de près, ce bloc est du code bash commençant par un shebang, structuré pour décoder un Here string encodé en Base64 avec
base64 --decodepuis le passer àeval - À première vue, cela peut ressembler à une « méthode de diffusion de virus », mais l’objectif réel est d’afficher un message easter egg
- Le t-shirt est un produit conçu par Akamai en soutien à la campagne Peace for All d’Uniqlo
Processus d’OCR et de transcription
- Base64 ne disposant pas de mécanisme de correction d’erreurs, il fallait une transcription parfaite pour convertir la chaîne imprimée en une forme exécutable
- La chaîne se terminait par le padding attendu, et les guillemets comme les accolades correspondaient, ce qui rendait probable qu’il s’agisse d’un code complet
- Trois méthodes ont été utilisées ensemble pour la transcription
- L’OCR intégré à circle-to-search sur Android
- Tesseract avec plusieurs options et ajustements
- L’OCR et la génération d’un tableau de positions via Claude
- Les trois résultats ont été comparés par diff afin de repérer les divergences, puis les parties restantes ont été nettoyées manuellement
- Un autre design de t-shirt de la même ligne Uniqlo x Akamai semble avoir été coupé dans un bloc de code plus large : les imports sont tronqués et
returnse termine parretu, le rendant impossible à compiler
Fonctionnement du script bash décodé
- Le décodage du Base64 révèle un easter egg bash bien commenté
- Le début du script contient des messages de félicitations en anglais et en japonais
Congratulations! You found the easter egg! ❤️おめでとうございます!隠されたサプライズを見つけました!❤️
- La chaîne animée est répétée sous la forme
♥PEACE♥FOR♥ALL♥PEACE♥FOR♥ALL... - La taille du terminal est récupérée avec
tput colsettput lines, et la longueur de la chaîne est calculée avec${#text}en bash - Le curseur est masqué avec
tput civis, et à la réception deSIGINT, il est restauré avectput cnorm; exit
Implémentation de l’animation
- La boucle s’exécute en continu sous forme de boucle infinie
for (( t=0; ; t+=1 )) - À chaque itération, le caractère à afficher est pris un par un dans
text - Le calcul de position utilise
bc -lpour obtenir la valeur du sinusangle = t * 0.2sine_value = s(angle)x = (cols / 2) + (cols / 4) * sine_value
- La valeur calculée de
xest corrigée pour rester dans les limites du terminal, entre 0 etcols - 1 - La couleur est calculée comme un dégradé entre 12, correspondant au cyan, et 208, correspondant à l’orange, dans la palette 256 couleurs
- L’affichage utilise des séquences d’échappement ANSI et
tput cuppour imprimer le caractère coloré à la position indiquée, puis descend à la ligne suivante - Au final, le message de la campagne
Peace for Allapparaît dans le terminal sous forme de boucle sinusoïdale continue
Police et explication du design par Akamai
- L’hypothèse initiale concernant la police était Consolas, mais après vérification par l’utilisateur Hacker News ralphinus, elle a été corrigée en Roboto Mono
- Parmi les indices ayant mené à la mauvaise hypothèse figuraient le
0légèrement barré en diagonale, le1sans empattement, ainsi que les courbes arrondies deBDyget du chiffre2 - Lors de la sortie du t-shirt, Akamai a expliqué le message du design dans un communiqué de presse
- Le brun clair évoque les boîtiers en plastique « beige box » des premiers ordinateurs connectés à Internet, tandis que le cœur au recto représente l’usage d’Internet à des fins positives dans le monde entier
- Le vrai code au dos est une référence à Linux, qu’Akamai relie à « la langue open source d’Internet » et à un langage commun pour un monde plus sûr et mieux connecté
- Parmi les autres personnes intéressées par ce même t-shirt figure un article de Wen Chuan Lee, qui renvoie vers un autre article lié
1 commentaires
Avis sur Hacker News
« L’autre t-shirt vendu dans la même gamme par Uniqlo x Akamai contient du code qui est manifestement un design inachevé »
C’est drôle d’imaginer devoir renvoyer un t-shirt parce qu’il dysfonctionne
« Pourquoi le renvoyez-vous, la taille n’allait pas ou il ne vous plaisait pas ? »
« Non, il y a une erreur de syntaxe à la ligne 37, donc il ne s’exécute pas, et je crains que les gens dans la rue pensent que je fais la promotion de scripts Bash non sécurisés »
Si vous aimez ce genre de choses, le travail de Martin Kleppe pourrait aussi vous plaire. Par exemple, il y a la Quine Clock
https://aem1k.com/qlock/
J’en avais aussi fait une rétro-ingénierie sous forme non obfusquée il y a quelques années
https://gist.github.com/olooney/a89db3932b089925b71b68d7e9f2...
Il a aussi créé beaucoup d’autres excellentes visualisations ASCII
https://aem1k.com/
C’est extrêmement impressionnant, mais quand même
La police n’est pas Consolas, mais Roboto Mono
Le plus étrange, c’est que la police elle-même est bien une police à chasse fixe, mais que la composition du t-shirt ne l’est pas. Il y a du crénage, particulièrement visible sur la paire « Iy », et les caractères étroits comme « i » semblent occuper moins d’espace horizontal. À vue de nez, cela a dû être composé avec un outil du type « optical kerning » d’InDesign
On utilise une police à chasse fixe parce qu’elle s’aligne bien sur une grille. Mais même à l’intérieur de cette grille, il y a de la marge pour déplacer un caractère un peu vers la gauche ou vers la droite, ce qui pourrait donner une police à chasse fixe plus lisible. Bien sûr, chaque fois qu’un caractère est décalé vers la gauche, l’espace à droite augmente, avec une probabilité à peu près équivalente de produire un résultat horrible
Ce t-shirt est vraiment génial. Il existe une bonne vidéo où le designer explique le processus de création. Elle inclut aussi la manière dont ils ont délibérément rendu l’OCR difficile : https://youtu.be/jocGLiecpjU?t=526
https://archive.org/details/1983-01-compute-magazine/page/96...
Sur un Samsung S24U, j’ai maintenu le bouton « circle to search » de l’écran d’accueil pour ouvrir l’interface des outils d’IA, puis j’ai fait un appui long sur le texte et tout copié d’un coup. Je ne connais pas le nom officiel de la fonction, mais ça a pris environ 2 secondes
Faire de l’OCR là-dessus est un cauchemar, et c’est un bon benchmark pour les outils qui prétendent être de bons modèles OCR/vision
Cela dit, avec un outil agentique branché sur un bon modèle de vision récent comme Claude ou GPT, en lui donnant l’image, en la découpant ligne par ligne puis en lui demandant de faire l’OCR de chaque ligne séparément, ça devrait se faire assez facilement
Je me demande aussi si ce script lui-même a été écrit par un LLM avant l’obfuscation. Il semble y avoir pas mal de commentaires, mais dans ce cas ça va quand même :)
Le message de félicitations est à la fois en anglais et en japonais, et il y a un emoji cœur. Il y avait clairement une intention de dégradé du bleu-vert à l’orange, mais la plage commence dans le bloc ANSI et se termine au milieu du bloc des 256 couleurs, alors que les 256 couleurs de terminal ne sont de toute façon pas organisées en dégradé. Et il n’y a pas de sleep à la fin de la boucle, alors qu’un LLM l’aurait probablement ajouté par précaution
Les caractères se séparent facilement, et il n’y a pas d’arrière-plan structurel qui perturbe le lecteur, contrairement par exemple à une date de péremption sur un opercule en aluminium de yaourt. Il n’y a presque pas de textures quasi textuelles pour brouiller le résultat, et la police est nette et standard
Je ne me souviens plus du nom maintenant. Il s’est passé trop de choses accaparantes depuis
Bizarrement, si j’essaie de copier toute la chaîne, y compris la partie hashbang, les performances deviennent bien pires. Je me demande ce qu’ils font en interne pour que ça marche aussi bien
Appeler l’encodage base64 de l’obfuscation
Je m’attendais à une technique sympa de désobfuscation JS ; pour rester poli, ma déception est incommensurable et ma journée est gâchée
Waouh, j’avais vu ce t-shirt en boutique et dit à ma copine : « Ce script ne peut pas vraiment fonctionner, c’est sûrement juste décoratif. » J’aurais dû creuser davantage
Pas mal. Mon seul regret à propos du script, c’est qu’il aurait sans doute fallu mettre
sleep 0.1
dans la boucle. Comme ça, on pourrait vraiment lire ce qui s’affiche dans le terminal. Les terminaux modernes défilent trop vite pour qu’on voie les messages passer.
Ralentir à environ 10 Hz de rafraîchissement rendrait le tout très agréable à regarder
J’ai trouvé ça drôle de voir l’auteur essayer plusieurs outils d’OCR, obtenir des résultats inégaux, puis passer un long moment à corriger manuellement la meilleure sortie. Au lieu de simplement retaper le texte lui-même
L’OCR de Google via Google Lens sur téléphone l’a aussi extrait plutôt correctement, mais pas avec 100 % d’exactitude. Cela dit, corriger le résultat aurait probablement pris bien moins de temps que le recopier à la main. Je ne sais pas ce que l’auteur a utilisé, mais j’aurais aimé qu’il partage ses essais d’OCR ; il a probablement testé des outils d’OCR assez basiques
Moi aussi, je choisirais évidemment l’OCR. Il faut être prêt pour le prochain t-shirt Bash que je croiserai
Un ancien collègue avait un t-shirt avec un programme Go, et je l’ai toujours trouvé plutôt cool
[0] https://github.com/GL-Kageyama/UNIQLO_Akamai_T-shirt_Code