2 poin oleh GN⁺ 5 jam lalu | 1 komentar | Bagikan ke WhatsApp
  • Kaus desain Akamai yang dijual di toko Uniqlo memiliki kode bash terobfuskasi tercetak, yang menjalankan hasil base64 --decode lewat eval, tetapi sebenarnya itu adalah easter egg untuk kampanye Peace for All
  • Saat Here string yang dienkode dengan Base64 dibuka, muncul skrip yang berulang kali menampilkan teks ♥PEACE♥FOR♥ALL♥ di terminal sebagai animasi gelombang sinus
  • Karena Base64 tidak memiliki koreksi galat, transkripsinya sulit; setelah memastikan padding string serta tanda kutip dan kurung kurawal sudah cocok, hasil Android OCR, Tesseract, dan Claude dibandingkan lalu dirapikan
  • Skrip yang didekode menggabungkan tput, bc, dan escape ANSI 256 warna untuk menghitung posisi serta warna karakter sesuai ukuran terminal, dan memulihkan kursor saat keluar dengan CTRL+C
  • Akamai menjelaskan kode nyata di bagian belakang dengan mengaitkannya ke Linux, sementara font yang semula diduga Consolas dikoreksi menjadi Roboto Mono

Kode yang dapat dijalankan di bagian belakang kaus

  • Bagian depan kaus Uniqlo x Akamai Peace for All memiliki hati di dalam kurung kurawal, sementara bagian belakangnya dicetak dengan blok alfanumerik besar
  • Jika dilihat dekat, blok tersebut adalah kode bash yang dimulai dengan shebang, dengan struktur yang membuka Here string berenkode Base64 menggunakan base64 --decode lalu meneruskannya ke eval
  • Sekilas ini bisa tampak seperti “cara menyebarkan virus”, tetapi tujuan sebenarnya adalah menampilkan pesan easter egg
  • Kaus tersebut adalah produk yang didesain Akamai untuk mendukung kampanye Peace for All dari Uniqlo

Proses OCR dan transkripsi

  • Karena Base64 tidak memiliki fungsi koreksi galat, diperlukan transkripsi sempurna agar string tercetak dapat dipindahkan menjadi bentuk yang dapat dijalankan
  • String berakhir dengan padding yang diperkirakan, dan tanda kutip serta kurung kurawal juga cocok, sehingga kemungkinan besar itu adalah kode yang utuh
  • Tiga metode digunakan bersama untuk transkripsi
    • OCR bawaan circle-to-search di Android
    • Tesseract dengan beberapa opsi dan penyesuaian
    • OCR dan pembuatan tabel posisi melalui Claude
  • Ketiga hasil dibandingkan dengan diff untuk menemukan titik ketidaksesuaian, lalu bagian yang tersisa dirapikan secara manual
  • Desain kaus lain dari lini Uniqlo x Akamai yang sama tampaknya terpotong dari blok kode yang lebih lebar; bagian imports terpotong dan return berakhir sebagai retu, sehingga tidak bisa dikompilasi

Perilaku skrip bash yang didekode

  • Setelah Base64 didekode, muncul easter egg bash dengan komentar yang rapi
  • Di awal skrip terdapat pesan ucapan selamat dalam bahasa Inggris dan Jepang
    • Congratulations! You found the easter egg! ❤️
    • おめでとうございます!隠されたサプライズを見つけました!❤️
  • String yang dianimasikan berulang dalam bentuk ♥PEACE♥FOR♥ALL♥PEACE♥FOR♥ALL...
  • Ukuran terminal diambil dengan tput cols dan tput lines, sementara panjang string dihitung dengan ${#text} di bash
  • Kursor disembunyikan dengan tput civis, dan saat menerima SIGINT, kursor dikembalikan dengan tput cnorm; exit

Cara implementasi animasi

  • Loop berjalan terus sebagai loop tak hingga dalam bentuk for (( t=0; ; t+=1 ))
  • Pada setiap iterasi, karakter yang akan ditampilkan saat ini diambil satu per satu dari text
  • Perhitungan posisi dilakukan dengan menghitung nilai sinus menggunakan bc -l
    • angle = t * 0.2
    • sine_value = s(angle)
    • x = (cols / 2) + (cols / 4) * sine_value
  • Nilai x yang dihitung dikoreksi agar tidak keluar dari rentang terminal, yakni minimal 0 dan maksimal cols - 1
  • Warna dihitung sebagai gradien di antara 12, yang merepresentasikan cyan, dan 208, yang merepresentasikan orange, dalam palet 256 warna
  • Output mencetak karakter berwarna di posisi yang ditentukan menggunakan escape ANSI dan tput cup, lalu turun ke bawah dengan baris baru
  • Hasilnya, pesan kampanye Peace for All muncul di terminal sebagai loop gelombang sinus yang berkelanjutan

Font dan penjelasan desain Akamai

  • Dugaan awal untuk font adalah Consolas, tetapi setelah konfirmasi pengguna Hacker News ralphinus, dikoreksi menjadi Roboto Mono
  • Dasar dugaan yang keliru itu mencakup 0 yang sedikit miring, 1 tanpa serif, serta lengkungan membulat pada BDyg dan angka 2
  • Saat meluncurkan kaus tersebut, Akamai menjelaskan pesan desainnya melalui siaran pers
  • Warna cokelat kekuningan cerah merujuk pada casing plastik “beige box” dari komputer era internet awal, sementara hati di bagian depan menunjukkan bahwa internet telah digunakan untuk tujuan baik di seluruh dunia
  • Kode nyata di bagian belakang adalah referensi ke Linux, dan Akamai mengaitkannya sebagai “bahasa open-source internet” sekaligus bahasa bersama menuju dunia yang lebih aman dan lebih terhubung
  • Contoh lain dari orang yang tertarik pada kaus yang sama adalah tulisan Wen Chuan Lee, yang juga mengarah ke tulisan terkait lainnya

1 komentar

 
GN⁺ 5 jam lalu
Pendapat Hacker News
  • “Kaus lain yang dijual di lini yang sama oleh Uniqlo x Akamai jelas kodenya adalah desain yang belum selesai
    Lucu membayangkan kausnya tidak berfungsi lalu harus dikembalikan
    “Mengapa Anda mengembalikannya, ukurannya tidak pas atau Anda tidak suka?”
    “Bukan, ada syntax error di baris ke-37 jadi tidak bisa dijalankan, dan saya khawatir orang-orang di jalan mengira saya mempromosikan scripting Bash yang tidak aman”

    • Untuk staf layanan pelanggan Uniqlo: kalau ada yang mencoba mengembalikan kaus karena kesalahan kode komputer yang tercetak, tolak saja dan jawab, “Kalau benar-benar script kiddie, Anda pasti sudah melihat error itu sebelum membeli”
    • Saya shell-shocked melihat quality assurance yang sebegini kurang. Setidaknya bisa diberi patch tidak?
  • Kalau suka hal semacam ini, mungkin Anda juga akan suka karya Martin Kleppe. Misalnya Quine Clock
    https://aem1k.com/qlock/
    Ada juga hasil reverse engineering dalam bentuk yang tidak diobfuscate yang saya buat beberapa tahun lalu
    https://gist.github.com/olooney/a89db3932b089925b71b68d7e9f2...
    Selain itu ia juga membuat banyak visualisasi ASCII yang keren
    https://aem1k.com/

    • Apakah itu benar-benar Quine?
      Memang sangat mengesankan, tapi tetap saja
  • Font-nya bukan Consolas, melainkan Roboto Mono
    Yang lebih aneh, font itu sendiri adalah font monospace yang benar, tetapi tata letak di kausnya tidak demikian. Ada kerning, terutama terlihat pada pasangan ‘Iy’, dan karakter sempit seperti ‘i’ tampak memakan ruang horizontal lebih sedikit. Dugaan saya, ini ditata dengan alat seperti “optical kerning” di InDesign

    • Apakah ada orang yang pernah membuat font monospace dengan kerning dinamis? Sebelum membaca komentar di atas, ini ide agak nyeleneh yang bahkan tidak pernah terpikir oleh saya. Awalnya terdengar tidak masuk akal, tapi dengarkan dulu
      Alasan memakai font monospace adalah agar pas dengan grid. Namun di dalam grid itu masih ada ruang untuk sedikit menggeser huruf ke kiri atau kanan, dan itu bisa saja menghasilkan font monospace yang lebih mudah dibaca. Tentu saja, setiap kali huruf digeser ke kiri, ruang di kanan bertambah besar, sehingga peluang hasilnya menjadi mengerikan juga sama besarnya
    • Sepertinya benar. Saya sudah menambahkan koreksi di tulisan, dan juga mengutip komentar ini
  • Kaus ini benar-benar bagus. Ada video bagus dari desainer aslinya yang menjelaskan proses pembuatannya. Termasuk proses yang sengaja membuat OCR sulit: https://youtu.be/jocGLiecpjU?t=526

    • Mungkin lebih cepat mengetik langsung daripada mencari cara OCR. Rasanya seperti menyalin kode game dari majalah COMPUTE! 45 tahun lalu
      https://archive.org/details/1983-01-compute-magazine/page/96...
    • Saya penulisnya. Terima kasih banyak untuk tautan yang belum saya lihat ini. Senang melihatnya, dan juga lega bahwa OCR yang sulit itu bukan cuma masalah saya, melainkan memang desain yang disengaja
    • Saya melihat tautannya, tapi tidak menemukan bagian yang mengatakan OCR dibuat sulit. Tepatnya apa yang dilakukan sehingga OCR menjadi sulit?
    • Tapi OCR-nya tidak sulit. Saya juga tidak tahu mengapa tulisan itu mengalokasikan satu seksi penuh untuk bagian tersebut
      Di Samsung S24U, saya menekan lama tombol “circle to search” di home screen untuk memunculkan antarmuka alat AI, lalu menekan lama teks dan menyalin semuanya sekaligus. Saya tidak tahu nama resminya, tapi hanya butuh sekitar 2 detik
  • Melakukan OCR untuk ini adalah mimpi buruk, dan menjadi benchmark yang bagus untuk hal-hal yang mengaku sebagai model OCR/vision yang bagus
    Namun kalau memberikan gambar ke alat bergaya agen yang memakai model vision bagus seperti Claude atau GPT terbaru, lalu memintanya membagi per baris dan melakukan OCR tiap baris secara terpisah, sepertinya bisa dilakukan cukup mudah
    Saya juga penasaran apakah skrip ini sendiri ditulis dengan LLM sebelum diobfuscate. Komentarnya tampak cukup banyak, meski dalam kasus ini masih oke :)

    • Sepertinya bukan ditulis LLM. Ada beberapa hal yang menonjol
      Ada pesan ucapan selamat dalam bahasa Inggris dan Jepang, serta satu emoji hati. Ada niat membuat gradasi dari cyan ke oranye, tetapi rentangnya dimulai dari blok ANSI dan berakhir di tengah blok 256 warna, padahal 256 warna terminal pada dasarnya tidak disusun seperti gradasi. Selain itu tidak ada sleep di akhir loop, yang menurut saya mungkin akan ditambahkan LLM secara defensif
    • Tidak sesulit itu. Model OCR industri kami membacanya dengan tepat pada percobaan pertama dengan parameter default
      Karakternya mudah dipisahkan, dan tidak ada latar belakang struktural yang membingungkan pembaca. Berbeda, misalnya, dengan tanggal kedaluwarsa di tutup aluminium yoghurt. Hampir tidak ada tekstur mirip teks yang bisa mengacaukan hasil, dan font-nya juga bersih serta standar
    • Terakhir kali orang-orang internet terobsesi melakukan OCR pada base64 adalah beberapa bulan lalu. Saat DoJ merilis banyak email dari seseorang yang sudah meninggal, tetapi dalam bentuk PDF yang dirasterisasi
      Sekarang saya tidak ingat namanya. Terlalu banyak hal yang menguras pikiran sejak itu
    • Fitur salin teks dari gambar di Safari hampir menangani seluruh bagian base64 dari string. Hanya karakter pertama yang salah dibaca sebagai I, bukan T
      Anehnya, kalau mencoba menyalin seluruh string termasuk bagian hashbang, performanya jauh lebih buruk. Saya penasaran apa yang terjadi di dalamnya sampai bisa bekerja sebaik ini
    • Benarkah ini mimpi buruk? Saya menempelkan thumbnail pertama kaus itu ke ChatGPT, dan ia langsung mendekodekannya sekaligus memberi tahu apa yang dilakukan skrip Bash itu
  • Menyebut encoding base64 sebagai obfuscation
    Saya mengharapkan teknik deobfuscation JS yang keren, tapi kalau mau dibilang baik-baik, kekecewaan saya tak terlukiskan dan hari saya jadi rusak

  • Wah, saya melihat kaus itu di toko dan berkata kepada pacar saya, “Tidak mungkin skrip itu benar-benar berjalan, pasti cuma hiasan.” Seharusnya saya menggali lebih jauh

    • Mudah terlewat. Sebagian besar waktu kita tidak tenang, sehingga pikiran berada dalam mode autopilot
  • Tidak masalah. Satu-satunya hal yang terasa kurang dari skrip itu adalah sepertinya seharusnya ada
    sleep 0.1
    di dalam loop. Dengan begitu, saat ditampilkan di terminal, keluaran benar-benar bisa dibaca. Terminal modern menggulir terlalu cepat, jadi kita tidak bisa melihat pesan-pesannya lewat
    Kalau diperlambat menjadi sekitar pembaruan 10Hz, tampilannya akan sangat enak dilihat

    • Kalau begitu, mungkin kita bisa menjahitkan patch ke situ?
  • Lucu melihat penulis mencoba berbagai alat OCR, hasilnya tidak konsisten, lalu menghabiskan waktu lama memperbaiki keluaran terbaik secara manual. Bukannya langsung mengetiknya sendiri

    • Aku juga berpikir begitu. Tapi aku termasuk generasi yang tumbuh dengan menyalin “game” dari majalah dan buku selama berjam-jam di keyboard karet. Setelah itu masih perlu beberapa jam lagi untuk memperbaiki salah ketik
    • Aku menjalankannya lewat PaddlePaddle OCR dan hasilnya sempurna
      Google OCR yang dipakai lewat Google Lens di ponsel juga mengekstraknya cukup baik, meski tidak 100% akurat. Tetap saja, waktu untuk memperbaikinya pasti jauh lebih sedikit daripada menyalin dengan tangan. Entah penulis memakai apa, tapi akan menarik kalau ia membagikan seperti apa percobaan OCR-nya; mungkin ia mencoba alat OCR yang sederhana
    • Butuh hampir 2 menit untuk memasukkan 4 baris, dan aku melewatkan satu karakter
      Aku pun tentu akan memilih OCR. Harus siap menghadapi kaus Bash berikutnya
    • Ini mengingatkanku pada realitas otomatisasi kerja di lingkungan perusahaan. Sering terjadi para engineer menghabiskan lebih dari 40 jam untuk mengotomatiskan pekerjaan yang bisa dilakukan manual oleh junior dalam 10 menit dan hanya dibutuhkan seminggu sekali. Sepertinya masa depan adalah otomatisasi tanpa kompromi
    • “Tinggal diketik” kemungkinan besar akan menghasilkan lebih banyak kesalahan bagi orang rata-rata
  • Mantan rekan kerjaku dulu punya kemeja berisi program Go, dan aku selalu menganggapnya cukup keren
    [0] https://github.com/GL-Kageyama/UNIQLO_Akamai_T-shirt_Code

    • Aku tidak yakin apakah yang dimaksud program permainan Go atau bahasa Go. Akan menarik kalau ada yang membuat program Go dalam Go
    • Tahun ini aku membeli satu yang berisi kode Go. Sama sekali tidak terpikir bahwa itu kode sungguhan; kukira cuma isi acak