Den obfuskierten Bash-Skript eines Uniqlo-T-Shirts entschlüsseln
(tris.sherliker.net)- Auf einem in Uniqlo-Filialen verkauften T-Shirt mit Akamai-Design war obfuskierter Bash-Code aufgedruckt, der das Ergebnis von
base64 --decodeperevalausführt; tatsächlich handelte es sich aber um ein Easter Egg für die KampagnePeace for All - Entschlüsselt man den Base64-codierten Here-String, erscheint ein Skript, das im Terminal wiederholt den Text
♥PEACE♥FOR♥ALL♥als Sinuswellen-Animation ausgibt - Da Base64 keine Fehlerkorrektur bietet, war die Transkription schwierig; nach Prüfung von String-Padding sowie passenden Anführungszeichen und geschweiften Klammern wurden die Ergebnisse von Android OCR, Tesseract und Claude verglichen und bereinigt
- Das decodierte Skript kombiniert
tput,bcund 256-Farben-ANSI-Escapes, um Zeichenpositionen und Farben je nach Terminalgröße zu berechnen, und stellt beim Beenden mitCTRL+Cden Cursor wieder her - Akamai erklärte den echten Code auf der Rückseite mit Bezug zu Linux; die Schriftart wurde von der ursprünglichen Vermutung Consolas auf Roboto Mono korrigiert
Ausführbarer Code auf der Rückseite des T-Shirts
- Auf der Vorderseite des Uniqlo x Akamai
Peace for All-T-Shirts befindet sich ein Herz in geschweiften Klammern, auf der Rückseite ist ein großer alphanumerischer Block aufgedruckt - Bei näherem Hinsehen beginnt der Block mit einem Shebang und ist Bash-Code, der einen Base64-codierten Here-String per
base64 --decodeentschlüsselt und anevalübergibt - Auf den ersten Blick kann das wie eine „Methode zur Verbreitung von Viren“ wirken, tatsächlich dient es aber der Ausgabe einer Easter-Egg-Nachricht
- Das T-Shirt wurde von Akamai zur Unterstützung von Uniqlos Peace for All campaign gestaltet
OCR und Transkription
- Da Base64 keine Fehlerkorrektur bietet, war eine perfekte Transkription nötig, um den aufgedruckten String in eine ausführbare Form zu übertragen
- Der String endete mit dem erwarteten Padding, und auch Anführungszeichen sowie geschweifte Klammern passten, was auf vollständigen Code hindeutete
- Für die Transkription wurden drei Methoden kombiniert
- Die in Androids Circle-to-Search integrierte OCR
- Tesseract mit einigen Optionen und Anpassungen
- OCR und Positions-Tabellen über Claude
- Die drei Ergebnisse wurden per diff verglichen, um Abweichungen zu finden; die verbleibenden Stellen wurden manuell bereinigt
- Ein anderes T-Shirt-Design derselben Uniqlo-x-Akamai-Reihe scheint aus einem breiteren Codeblock abgeschnitten zu sein; imports sind abgeschnitten, und
returnendet alsretu, sodass es nicht kompilierbar ist
Verhalten des decodierten Bash-Skripts
- Nach dem Decodieren von Base64 erscheint ein gut kommentiertes Bash-Easter-Egg
- Am Anfang des Skripts stehen Glückwunschmeldungen auf Englisch und Japanisch
Congratulations! You found the easter egg! ❤️おめでとうございます!隠されたサプライズを見つけました!❤️
- Der animierte Zieltext wird in der Form
♥PEACE♥FOR♥ALL♥PEACE♥FOR♥ALL...wiederholt - Die Terminalgröße wird mit
tput colsundtput linesermittelt, die Stringlänge mit Bashs${#text}berechnet - Der Cursor wird mit
tput civisausgeblendet; beiSIGINTwird er mittput cnorm; exitwiederhergestellt
Umsetzung der Animation
- Die Schleife läuft als Endlosschleife in der Form
for (( t=0; ; t+=1 )) - In jeder Iteration wird das aktuell auszugebende Zeichen aus
textzeichenweise entnommen - Die Positionsberechnung erfolgt über einen mit
bc -lberechneten Sinuswertangle = t * 0.2sine_value = s(angle)x = (cols / 2) + (cols / 4) * sine_value
- Das berechnete
xwird so begrenzt, dass es nicht außerhalb des Terminalbereichs liegt: mindestens 0 und höchstenscols - 1 - Die Farbe wird als Gradient zwischen 12, das in der 256-Farben-Palette cyan entspricht, und 208, das orange entspricht, berechnet
- Die Ausgabe setzt mithilfe von ANSI-Escapes und
tput cupein farbiges Zeichen an die angegebene Position und wandert per Zeilenumbruch nach unten - Dadurch erscheint die Botschaft der Kampagne
Peace for Allim Terminal als fortlaufende Sinuswellen-Schleife
Schriftart und Akamais Designerklärung
- Die anfängliche Vermutung zur Schriftart war Consolas, wurde nach einer Bestätigung durch den Hacker-News-Nutzer ralphinus aber auf Roboto Mono korrigiert
- Als Grundlage der falschen Vermutung wurden unter anderem die flach schräg angeschnittene
0, die serifenlose1sowie die runden Kurven vonBDygund der Ziffer2genannt - Akamai erläuterte die Designbotschaft bei der Veröffentlichung des T-Shirts in einer Pressemitteilung
- Das helle Gelbbraun verweist auf die „beige box“-Kunststoffgehäuse früher Internet-Computer, das Herz auf der Vorderseite steht dafür, dass das Internet weltweit für gute Zwecke genutzt wurde
- Der echte Code auf der Rückseite ist eine Referenz auf Linux; Akamai verbindet ihn mit der „Open-Source-Sprache des Internets“ und einer gemeinsamen Sprache für eine sicherere, stärker vernetzte Welt
- Ein weiterer Fall von Interesse an demselben T-Shirt ist ein Beitrag von Wen Chuan Lee, der wiederum zu einem weiteren verwandten Beitrag führt
1 Kommentare
Meinungen auf Hacker News
„Das andere Shirt, das Uniqlo x Akamai in derselben Reihe verkauft, ist offensichtlich ein unfertiges Design“
Die Vorstellung, dass ein T-Shirt nicht funktioniert und man es zurückgeben muss, ist lustig
„Warum geben Sie es zurück, hat die Größe nicht gepasst oder hat es Ihnen nicht gefallen?“
„Nein, in Zeile 37 gibt es einen Syntaxfehler, deshalb läuft es nicht, und ich mache mir Sorgen, dass Leute auf der Straße denken könnten, ich würde unsicheres Bash-Scripting bewerben“
Wenn dir so etwas gefällt, könnte dir auch die Arbeit von Martin Kleppe gefallen. Zum Beispiel die Quine Clock
https://aem1k.com/qlock/
Vor ein paar Jahren habe ich sie auch in nicht obfuszierter Form reverse-engineert
https://gist.github.com/olooney/a89db3932b089925b71b68d7e9f2...
Außerdem hat er viele großartige ASCII-Visualisierungen gebaut
https://aem1k.com/
Es ist extrem beeindruckend, aber trotzdem
Die Schrift ist nicht Consolas, sondern Roboto Mono
Noch seltsamer ist, dass die Schrift selbst eine richtige Monospace-Schrift ist, der Satz auf dem Shirt aber nicht. Es gibt Kerning, besonders auffällig beim Paar „Iy“, und schmale Zeichen wie „i“ scheinen weniger horizontalen Platz einzunehmen. Ich vermute, dass es mit einem Tool wie „optical kerning“ in InDesign gesetzt wurde
Der Grund für Monospace-Schriften ist, dass sie gut in ein Raster passen. Aber auch innerhalb dieses Rasters gibt es Spielraum, Buchstaben etwas nach links oder rechts zu verschieben, und dadurch könnte eine besser lesbare Monospace-Schrift entstehen. Natürlich ist die Wahrscheinlichkeit ähnlich groß, dass jedes nach links verschobene Zeichen rechts mehr Leerraum erzeugt und das Ergebnis furchtbar wird
Dieses Shirt ist wirklich gut. Es gibt ein gutes Video, in dem der tatsächliche Designer den Entstehungsprozess erklärt. Darin geht es auch darum, wie es absichtlich OCR schwer gemacht wurde: https://youtu.be/jocGLiecpjU?t=526
https://archive.org/details/1983-01-compute-magazine/page/96...
Auf einem Samsung S24U habe ich den „Circle to Search“-Button auf dem Homescreen lange gedrückt, um die Oberfläche des AI-Tools zu öffnen, dann den Text lange gedrückt und alles auf einmal kopiert. Den offiziellen Namen kenne ich nicht, aber es hat etwa 2 Sekunden gedauert
Das per OCR zu erfassen ist ein Albtraum und ein guter Benchmark für Dinge, die sich selbst als gute OCR-/Vision-Modelle bezeichnen
Allerdings dürfte es ziemlich einfach sein, wenn man einem agentenartigen Tool mit einem guten Vision-Modell wie einem aktuellen Claude oder GPT das Bild gibt, es in Zeilen aufteilen lässt und jede Zeile separat per OCR erfassen lässt
Ich frage mich auch, ob dieses Skript vor der Obfuskierung selbst mit einem LLM geschrieben wurde. Es scheint ziemlich viele Kommentare zu haben, aber in diesem Fall ist das schon okay :)
Die Glückwunschmeldung ist sowohl auf Englisch als auch auf Japanisch enthalten, und es gibt ein Herz-Emoji. Es gab offenbar die Absicht eines Farbverlaufs von Türkis zu Orange, aber der Bereich beginnt im ANSI-Block und endet mitten im 256-Farben-Block; außerdem sind die 256 Terminalfarben von vornherein nicht wie ein Farbverlauf angeordnet. Außerdem gibt es am Ende der Schleife kein sleep, was ein LLM meiner Meinung nach defensiv hinzugefügt hätte
Die Zeichen lassen sich leicht trennen, und es gibt keinen strukturierten Hintergrund, der den Reader verwirren würde. Anders als etwa bei einem Mindesthaltbarkeitsdatum auf dem Aludeckel eines Joghurts. Es gibt auch keine fast-textartige Textur, die das Ergebnis stören könnte, und die Schrift ist sauber und standardmäßig
Mir fällt der Name gerade nicht ein. In der Zwischenzeit gab es zu viele Dinge, die einem den Kopf verdreht haben
Seltsamerweise wird die Leistung viel schlechter, wenn man versucht, den gesamten String inklusive Hashbang zu kopieren. Ich frage mich, was intern passiert, dass es so gut funktioniert
base64-Encoding als Obfuskierung zu bezeichnen
Ich hatte auf eine coole JS-Deobfuskierungstechnik gehofft; gelinde gesagt ist die Enttäuschung unermesslich und mein Tag ist ruiniert
Wow, ich habe dieses T-Shirt im Laden gesehen und zu meiner Freundin gesagt: „Dieses Skript kann unmöglich wirklich funktionieren, das ist bestimmt nur Deko.“ Ich hätte weiter nachforschen sollen
In Ordnung. Mein einziger Kritikpunkt am Skript ist, dass man wohl innerhalb der Schleife
sleep 0.1
hätte einfügen sollen. Dann könnte man die Ausgabe im Terminal tatsächlich lesen. Moderne Terminals scrollen so schnell, dass man die Meldungen gar nicht vorbeiziehen sieht.
Auf etwa 10 Hz Aktualisierung zu verlangsamen, sähe sehr gut aus.
Ich fand es lustig, wie der Autor mehrere OCR-Tools ausprobierte, sehr uneinheitliche Ergebnisse bekam und dann lange manuell die beste Ausgabe korrigierte. Statt es einfach selbst abzutippen.
Google OCR über Google Lens auf dem Handy hat es ebenfalls ziemlich gut extrahiert, war aber nicht zu 100 % korrekt. Trotzdem hätte das Korrigieren sicher viel weniger Zeit gekostet als das Abschreiben von Hand. Ich weiß nicht, was der Autor verwendet hat, aber es wäre schön gewesen, wenn er seine OCR-Versuche geteilt hätte; vermutlich hat er ein eher einfaches OCR-Tool ausprobiert.
Ich würde natürlich auch OCR wählen. Man muss ja für das nächste Bash-T-Shirt gewappnet sein.
Ein früherer Kollege hatte ein Shirt mit einem Go-Programm, das ich immer ziemlich cool fand.
[0] https://github.com/GL-Kageyama/UNIQLO_Akamai_T-shirt_Code