Uniqlo tişörtündeki obfuscate edilmiş bash betiğini çözmek
(tris.sherliker.net)- Uniqlo mağazalarında satılan Akamai tasarımlı tişörtte,
base64 --decodeçıktısınıevalile çalıştıran obfuscate edilmiş bir bash kodu basılıydı; ancak bu aslındaPeace for Allkampanyası için hazırlanmış bir easter egg idi - Base64 ile kodlanmış here string çözüldüğünde, terminalde
♥PEACE♥FOR♥ALL♥ifadesini sinüs dalgası animasyonu olarak tekrar tekrar yazdıran bir betik ortaya çıkıyor - Base64’te hata düzeltme olmadığı için metni aktarmak zordu; string padding’i ile tırnak ve süslü parantezlerin doğru eşleştiği kontrol edildikten sonra Android OCR, Tesseract ve Claude çıktıları karşılaştırılarak düzenlendi
- Çözülen betik,
tput,bcve 256 renkli ANSI escape dizilerini birleştirerek terminal boyutuna göre karakter konumlarını ve renklerini hesaplıyor;CTRL+Cile çıkıldığında da imleci geri yüklüyor - Akamai, arka yüzdeki gerçek kodu Linux ile ilişkilendirerek açıkladı; ayrıca yazı tipinin ilk tahmin olan Consolas değil, Roboto Mono olduğu düzeltildi
Tişörtün arkasındaki çalıştırılabilir kod
- Uniqlo x Akamai
Peace for Alltişörtünün ön yüzünde süslü parantezler içinde bir kalp, arka yüzünde ise büyük bir alfanümerik blok yer alıyor - Yakından bakıldığında bu blok, shebang ile başlayan bir bash kodu ve Base64 ile kodlanmış here string’i
base64 --decodeile çözüpevale veren bir yapıya sahip - İlk bakışta bir “virüs dağıtım yöntemi” gibi görünebilse de, gerçek amacı bir easter egg mesajı göstermek
- Tişört, Akamai’nin Uniqlo’nun Peace for All campaign girişimini destekleyerek tasarladığı bir ürün
OCR ve metin aktarım süreci
- Base64’te hata düzeltme özelliği olmadığından, basılı string’i çalıştırılabilir hâlde aktarmak için kusursuz bir kopyalama gerekiyordu
- String beklenen padding ile bitiyordu; tırnaklar ve süslü parantezler de eşleştiği için bunun eksiksiz bir kod olma ihtimali yüksekti
- Aktarım için üç yöntem birlikte kullanıldı
- Android’in circle-to-search içindeki yerleşik OCR özelliği
- Tesseract ve bazı seçenekler ile ince ayarlar
- Claude kullanılarak OCR ve konum tablosu üretimi
- Üç sonucun farkları
diffile karşılaştırılarak uyuşmazlık noktaları bulundu, kalan kısımlar ise elle düzeltildi - Aynı Uniqlo x Akamai serisindeki diğer tişört tasarımları, daha geniş bir kod bloğundan kırpılmış gibi görünüyor; import satırları kesilmiş ve
returnifadesiretuolarak bittiği için derlenebilir durumda değiller
Çözülen bash betiği nasıl çalışıyor
- Base64 çözüldüğünde, açıklayıcı yorumlarla yazılmış bir bash easter egg’i ortaya çıkıyor
- Betiğin başlangıcında İngilizce ve Japonca kutlama mesajları bulunuyor
Congratulations! You found the easter egg! ❤️おめでとうございます!隠されたサプライズを見つけました!❤️
- Animasyonda kullanılan string,
♥PEACE♥FOR♥ALL♥PEACE♥FOR♥ALL...biçiminde tekrar ediyor - Terminal boyutu
tput cols,tput linesile alınıyor; string uzunluğu ise bash’in${#text}ifadesiyle hesaplanıyor - İmleç
tput civisile gizleniyor,SIGINTalındığındatput cnorm; exitile geri getiriliyor
Animasyonun uygulanış biçimi
- Döngü,
for (( t=0; ; t+=1 ))biçiminde bir sonsuz döngü olarak sürekli çalışıyor - Her yinelemede, o anda yazdırılacak karakter
textiçinden tek tek alınıyor - Konum hesaplaması için
bc -lile sinüs değeri hesaplanıyorangle = t * 0.2sine_value = s(angle)x = (cols / 2) + (cols / 4) * sine_value
- Hesaplanan
x, terminal aralığının dışına çıkmaması için 0’dan küçük vecols - 1’den büyük olmayacak şekilde düzeltiliyor - Renk, 256 renk paletinde cyan’a karşılık gelen 12 ile orange’a karşılık gelen 208 arasında bir gradyan olarak hesaplanıyor
- Çıktı, ANSI escape dizileri ve
tput cupkullanılarak belirtilen konuma renklendirilmiş karakter basıp satır sonlarıyla aşağı inen bir yöntemle veriliyor - Sonuç olarak
Peace for Allkampanya mesajı terminalde sürekli bir sinüs dalgası döngüsü olarak görünüyor
Yazı tipi ve Akamai’nin tasarım açıklaması
- Yazı tipiyle ilgili ilk tahmin Consolas olsa da, Hacker News kullanıcısı ralphinus’un doğrulamasının ardından bunun Roboto Mono olduğu düzeltildi
- Yanlış tahmine gerekçe olarak hafif eğik çizgili
0, serifsiz1, ayrıcaBDygile2rakamındaki yuvarlak kıvrımlar gösterildi - Akamai, tişörtün çıkışı sırasında yayımladığı basın bülteni ile tasarımın mesajını açıkladı
- Açık sarımsı kahverengi ton, erken dönem internet bilgisayarlarının “beige box” plastik kasalarına gönderme yapıyor; ön yüzdeki kalp ise internetin dünya genelinde iyilik için kullanılmasını simgeliyor
- Arka yüzdeki gerçek kod, Linux’a bir referans olarak konumlandırılıyor; Akamai bunu “internetin açık kaynak dili” ve daha güvenli, daha bağlantılı bir dünyaya giden ortak dil olarak tanımlıyor
- Aynı tişörte ilgi duyan başka bir örnek olarak Wen Chuan Lee yazısı da bulunuyor; o yazı da ilgili başka bir yazıya bağlanıyor
1 yorum
Hacker News yorumları
“Uniqlo x Akamai’nin aynı seride sattığı diğer tişörtteki kodun bariz biçimde tamamlanmamış bir tasarım olması”
Tişörtün arızalı çıkıp iade edilmesi gerektiğini hayal etmek komik
“Neden iade ediyorsunuz, bedeni mi uymadı yoksa beğenmediniz mi?”
“Hayır, 37. satırda söz dizimi hatası var, çalışmıyor; ayrıca sokaktaki insanların benim güvenli olmayan Bash betik yazımını teşvik ettiğimi düşüneceğinden endişeleniyorum.”
Böyle şeyleri seviyorsanız Martin Kleppe’nin işleri de hoşunuza gidebilir. Örneğin Quine Clock var
https://aem1k.com/qlock/
Birkaç yıl önce obfuscate edilmemiş hâline tersine mühendislik uyguladığım bir sürüm de var
https://gist.github.com/olooney/a89db3932b089925b71b68d7e9f2...
Bunun dışında da harika ASCII görselleştirmeleri yaptı
https://aem1k.com/
Çok etkileyici, ama yine de
Yazı tipi Consolas değil, Roboto Mono
Daha da tuhafı, yazı tipinin kendisi düzgün bir sabit aralıklı font olmasına rağmen tişörtteki dizgi öyle değil. Kerning uygulanmış; özellikle ‘Iy’ çiftinde göze çarpıyor ve ‘i’ gibi dar karakterler yatayda daha az yer kaplıyor gibi görünüyor. Tahminimce InDesign’daki “optical kerning” benzeri bir araçla dizilmiş
Sabit aralıklı font kullanmanın nedeni ızgaraya iyi oturmasıdır. Ama o ızgaranın içinde bile harfleri biraz sola ya da sağa kaydıracak pay var; bu da daha okunabilir bir sabit aralıklı font sağlayabilir. Elbette harf her sola kaydığında sağdaki boşluğun büyüyüp berbat bir sonuç üretme ihtimali de neredeyse aynı derecede yüksek
Bu tişört gerçekten harika. Gerçek tasarımcının üretim sürecini anlattığı güzel bir video var. Bilerek OCR’ı zorlaştırma süreci de dahil: https://youtu.be/jocGLiecpjU?t=526
https://archive.org/details/1983-01-compute-magazine/page/96...
Samsung S24U’da ana ekrandaki “circle to search” düğmesine uzun basıp yapay zeka araç arayüzünü açtım, ardından metne uzun basarak tamamını tek seferde kopyaladım. Resmi adını bilmiyorum ama yaklaşık 2 saniye sürdü
Bunu OCR’dan geçirmek kâbus gibi ve kendini iyi bir OCR/görü modeli diye tanıtan şeyler için iyi bir benchmark
Yine de güncel Claude veya GPT gibi iyi görü modellerini kullanan ajan tarzı bir araca görseli verip satırlara böldürür, sonra her satırı ayrı ayrı OCR yapmasını isterseniz epey kolay olacak gibi
Bu betiğin obfuscate edilmeden önce LLM ile yazılıp yazılmadığını da merak ediyorum. Yorum satırları oldukça fazla görünüyor; bu durumda yine de sorun değil :)
Tebrik mesajı hem İngilizce hem Japonca var ve bir kalp emojisi bulunuyor. Camgöbeğinden turuncuya giden bir gradyan niyeti varmış, ama aralık ANSI bloğunda başlayıp 256 renk bloğunun ortasında bitiyor; 256 terminal rengi zaten baştan gradyan gibi dizilmemiş. Ayrıca döngünün sonunda sleep yok; LLM olsa savunmacı davranıp eklerdi diye düşünüyorum
Karakterler kolayca ayrılıyor ve okuyucuyu şaşırtacak yapısal bir arka plan yok. Örneğin yoğurt alüminyum kapağındaki son kullanma tarihi gibi değil. Sonucu bozacak metne-benzer dokular neredeyse yok, font da temiz ve standart
Şimdi adını hatırlamıyorum. O zamandan beri aklı dağıtan çok fazla şey oldu
Garip biçimde hashbang kısmı da dahil tüm dizeyi kopyalamaya çalışınca performansı çok daha kötüleşiyor. İçeride ne yapıyor da bu kadar iyi çalışıyor, merak ediyorum
base64 kodlamasına obfuscation demek ha
Havalı JS deobfuscation teknikleri bekliyordum; kibarca söylemek gerekirse hayal kırıklığım tarifsiz ve günümü mahvetti
Vay, mağazada o tişörtü görüp kız arkadaşıma “Bu betiğin gerçekten çalışmasına imkân yok, sadece süs amaçlıdır” demiştim. Daha derine inmeliydim
Fena değil. Script’le ilgili tek hayal kırıklığım, döngünün içine
sleep 0.1
koymuş olabilecekleri. Böylece terminalde çıktısı alınırken gerçekten okunabilir olurdu. Modern terminaller o kadar hızlı kayıyor ki mesajların akıp gittiğini göremiyorsunuz.
Yaklaşık 10Hz yenileme hızına yavaşlatılırsa izlemesi çok güzel olur.
Yazarın birkaç OCR aracını denedikten sonra sonuçlar tutarsız çıkınca, en iyi çıktıyı uzun süre elle düzeltmesi komikti. Doğrudan kendisi yazmak yerine yani.
Telefonda Google Lens üzerinden kullanılan Google OCR da oldukça iyi çıkardı ama %100 doğru değildi. Yine de elle kopyalayarak yazmaktan çok daha az düzeltme süresi gerektirirdi. Yazarın ne kullandığını bilmiyorum ama OCR denemesinin nasıl sonuç verdiğini paylaşsa iyi olurdu; muhtemelen basit bir OCR aracı denemiştir.
Ben olsam elbette OCR’ı seçerdim. Bir sonraki karşıma çıkacak Bash tişörtüne hazırlıklı olmak lazım.
Eski bir iş arkadaşımın üzerinde Go programı olan bir gömleği vardı; her zaman epey havalı olduğunu düşünmüşümdür.
[0] https://github.com/GL-Kageyama/UNIQLO_Akamai_T-shirt_Code