2 Punkte von GN⁺ 5 시간 전 | 1 Kommentare | Auf WhatsApp teilen
  • Auf einem in Uniqlo-Filialen verkauften T-Shirt mit Akamai-Design war obfuskierter Bash-Code aufgedruckt, der das Ergebnis von base64 --decode per eval ausführt; tatsächlich handelte es sich aber um ein Easter Egg für die Kampagne Peace 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, bc und 256-Farben-ANSI-Escapes, um Zeichenpositionen und Farben je nach Terminalgröße zu berechnen, und stellt beim Beenden mit CTRL+C den 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 --decode entschlüsselt und an eval ü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 return endet als retu, 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 cols und tput lines ermittelt, die Stringlänge mit Bashs ${#text} berechnet
  • Der Cursor wird mit tput civis ausgeblendet; bei SIGINT wird er mit tput cnorm; exit wiederhergestellt

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 text zeichenweise entnommen
  • Die Positionsberechnung erfolgt über einen mit bc -l berechneten Sinuswert
    • angle = t * 0.2
    • sine_value = s(angle)
    • x = (cols / 2) + (cols / 4) * sine_value
  • Das berechnete x wird so begrenzt, dass es nicht außerhalb des Terminalbereichs liegt: mindestens 0 und höchstens cols - 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 cup ein farbiges Zeichen an die angegebene Position und wandert per Zeilenumbruch nach unten
  • Dadurch erscheint die Botschaft der Kampagne Peace for All im 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 serifenlose 1 sowie die runden Kurven von BDyg und der Ziffer 2 genannt
  • 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

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

    • An die Mitarbeiter des Uniqlo-Kundendiensts: Wenn jemand versucht, ein Shirt wegen eines Fehlers im aufgedruckten Computercode zurückzugeben, einfach ablehnen und antworten: „Ein echter Script Kiddie hätte den Fehler vor dem Kauf erkannt“
    • Ich bin shell-shocked über so wenig Qualitätssicherung. Könnt ihr wenigstens einen Patch einspielen?
  • 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/

    • Ist das wirklich eine Quine?
      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

    • Hat jemand schon einmal eine Monospace-Schrift mit dynamischem Kerning gemacht? Bis ich den Kommentar oben gelesen habe, war das für mich eine etwas abwegige Idee, an die ich nie gedacht hatte. Auf den ersten Blick klingt es unsinnig, aber hört mich an
      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
    • Scheint zu stimmen. Ich habe im Artikel eine Korrektur ergänzt und auch diesen Kommentar zitiert
  • 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

    • Es könnte schneller sein, es einfach abzutippen, statt nach einer OCR-Methode zu suchen. Fühlt sich wohl an wie vor 45 Jahren, als man Spielcode aus dem COMPUTE!-Magazin abgetippt hat
      https://archive.org/details/1983-01-compute-magazine/page/96...
    • Ich bin der Autor. Den Link kannte ich noch nicht, vielen Dank. Das freut mich, und es ist auch schön zu sehen, dass die OCR-Schwierigkeit nicht nur mein Problem war, sondern absichtlich so designt wurde
    • Ich habe mir den Link angesehen, aber die Stelle nicht gefunden, an der gesagt wird, dass OCR erschwert wurde. Was genau wurde gemacht, damit OCR schwieriger wird?
    • Dabei ist OCR gar nicht schwierig. Ich weiß nicht, warum der Artikel diesem Teil einen ganzen Abschnitt widmet
      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 :)

    • Es wirkt nicht so, als wäre es von einem LLM geschrieben. Ein paar Dinge fallen auf
      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
    • So schwierig ist es nicht. Unser industrielles OCR-Modell hat es mit Standardparametern gleich beim ersten Versuch korrekt gelesen
      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
    • Das letzte Mal, dass sich Internetleute obsessiv mit der OCR von irgendwelchem base64 beschäftigt haben, war vor ein paar Monaten. Damals hatte das DoJ massenhaft E-Mails einer verstorbenen Person veröffentlicht, und zwar als gerasterte PDFs
      Mir fällt der Name gerade nicht ein. In der Zwischenzeit gab es zu viele Dinge, die einem den Kopf verdreht haben
    • Die Funktion zum Kopieren von Text aus Bildern in Safari verarbeitet fast den gesamten base64-Teil des Strings. Nur das erste Zeichen wurde fälschlich als I statt als T gelesen
      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
    • Ist es wirklich ein Albtraum? Ich habe das erste verkleinerte Bild des Shirts in ChatGPT eingefügt, und es hat es auf Anhieb entschlüsselt und mir auch erklärt, was das Bash-Skript macht
  • 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

    • Das übersieht man leicht. Die meiste Zeit sind wir nicht gelassen, und unsere Gedanken laufen im Autopilot
  • 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.

    • Dann könnte man dort vielleicht einen Patch einnähen?
  • 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.

    • Ich dachte dasselbe. Aber ich gehöre zu der Generation, die stundenlang „Spiele“ aus Zeitschriften und Büchern auf einer Gummitastatur abgetippt hat. Danach gingen noch einmal Stunden dafür drauf, Tippfehler zu korrigieren.
    • Ich habe es durch PaddlePaddle OCR laufen lassen, und das hat es perfekt erledigt.
      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.
    • Für die Eingabe von 4 Zeilen habe ich fast 2 Minuten gebraucht und dabei ein Zeichen übersehen.
      Ich würde natürlich auch OCR wählen. Man muss ja für das nächste Bash-T-Shirt gewappnet sein.
    • Das erinnert mich an die Realität der Aufgabenautomatisierung in Unternehmensumgebungen. Es ist üblich, dass Engineers über 40 Stunden damit verbringen, etwas zu automatisieren, das ein Junior in 10 Minuten manuell erledigen könnte und das nur einmal pro Woche nötig ist. Automatisierung um jeden Preis scheint die Zukunft zu sein.
    • „Einfach abtippen“ führt bei durchschnittlichen Menschen wahrscheinlich zu mehr Fehlern.
  • 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

    • Ich war mir nicht sicher, ob damit ein Programm für das Brettspiel Go oder die Sprache Go gemeint war. Es wäre lustig, wenn jemand ein Go-Programm in Go schreiben würde.
    • Ich habe mir dieses Jahr eins mit Go-Code gekauft. Ich hätte nie gedacht, dass es echter Code ist, sondern hielt es einfach für zufälligen Inhalt.