Mengurai Skrip bash Terobfuskasi pada Kaus Uniqlo
(tris.sherliker.net)- Kaus desain Akamai yang dijual di toko Uniqlo memiliki kode bash terobfuskasi tercetak, yang menjalankan hasil
base64 --decodelewateval, tetapi sebenarnya itu adalah easter egg untuk kampanyePeace 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 denganCTRL+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 Allmemiliki 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 --decodelalu meneruskannya keeval - 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
returnberakhir sebagairetu, 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 colsdantput lines, sementara panjang string dihitung dengan${#text}di bash - Kursor disembunyikan dengan
tput civis, dan saat menerimaSIGINT, kursor dikembalikan dengantput 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 -langle = t * 0.2sine_value = s(angle)x = (cols / 2) + (cols / 4) * sine_value
- Nilai
xyang dihitung dikoreksi agar tidak keluar dari rentang terminal, yakni minimal 0 dan maksimalcols - 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 Allmuncul 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
0yang sedikit miring,1tanpa serif, serta lengkungan membulat padaBDygdan angka2 - 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
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”
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/
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
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
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
https://archive.org/details/1983-01-compute-magazine/page/96...
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 :)
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
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
Sekarang saya tidak ingat namanya. Terlalu banyak hal yang menguras pikiran sejak itu
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
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
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
Lucu melihat penulis mencoba berbagai alat OCR, hasilnya tidak konsisten, lalu menghabiskan waktu lama memperbaiki keluaran terbaik secara manual. Bukannya langsung mengetiknya sendiri
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
Aku pun tentu akan memilih OCR. Harus siap menghadapi kaus Bash berikutnya
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