2 puan yazan GN⁺ 5 시간 전 | 1 yorum | WhatsApp'ta paylaş
  • Uniqlo mağazalarında satılan Akamai tasarımlı tişörtte, base64 --decode çıktısını eval ile çalıştıran obfuscate edilmiş bir bash kodu basılıydı; ancak bu aslında Peace for All kampanyası 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, bc ve 256 renkli ANSI escape dizilerini birleştirerek terminal boyutuna göre karakter konumlarını ve renklerini hesaplıyor; CTRL+C ile çı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 All tişö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 --decode ile çözüp evale 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ı diff ile 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 return ifadesi retu olarak 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 lines ile alınıyor; string uzunluğu ise bash’in ${#text} ifadesiyle hesaplanıyor
  • İmleç tput civis ile gizleniyor, SIGINT alındığında tput cnorm; exit ile 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 text içinden tek tek alınıyor
  • Konum hesaplaması için bc -l ile sinüs değeri hesaplanıyor
    • angle = t * 0.2
    • sine_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 ve cols - 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 cup kullanılarak belirtilen konuma renklendirilmiş karakter basıp satır sonlarıyla aşağı inen bir yöntemle veriliyor
  • Sonuç olarak Peace for All kampanya 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, serifsiz 1, ayrıca BDyg ile 2 rakamı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

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

    • Uniqlo müşteri hizmetleri çalışanlarına: Biri basılı bilgisayar kodu hatasını gerekçe göstererek tişört iade etmeye çalışırsa reddedin ve “Gerçek bir script kiddie olsaydınız, satın almadan önce o hatayı fark ederdiniz” diye yanıt verin
    • Kalite güvencesinin bu kadar eksik olması beni shell-shocked etti. En azından bir patch uygulayabilirler mi?
  • 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/

    • Bu gerçekten Quine mı?
      Ç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ş

    • Dinamik kerning uygulanmış sabit aralıklı bir font yapan oldu mu acaba? Yukarıdaki yorumu okuyana kadar aklıma hiç gelmemiş, biraz tuhaf bir fikir. İlk başta mantıksız geliyor ama bir dinleyin
      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
    • Doğru gibi görünüyor. Yazıya bir düzeltme ekledim ve bu yorumu da alıntıladım
  • 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

    • OCR yöntemi aramaktansa doğrudan elle yazmak daha hızlı olabilir. 45 yıl önce COMPUTE! dergisinden oyun kodu kopyalayıp yazmak gibi olurdu
      https://archive.org/details/1983-01-compute-magazine/page/96...
    • Yazının sahibiyim. Görmediğim bir bağlantıydı, gerçekten teşekkürler. Bunu görmek sevindirici; OCR’ın zor olmasının yalnızca benim sorunum değil, bilinçli bir tasarım olduğunu görmek de hoşuma gitti
    • Bağlantıya baktım ama OCR’ı zorlaştırdığını söylediği kısmı bulamadım. Tam olarak ne yapmışlar da OCR zorlaşmış?
    • Ama OCR zor değil. Yazının neden o kısma koca bir bölüm ayırdığını da bilmiyorum
      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 :)

    • LLM yazmış gibi gelmiyor. Birkaç şey göze çarpıyor
      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
    • O kadar zor değil. Bizim endüstriyel OCR modelimiz varsayılan parametrelerle ilk denemede doğru okudu
      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
    • İnternette insanların son kez bir base64’ü OCR’dan geçirmek için takıntı yaptığı zaman birkaç ay önceydi. DoJ, ölmüş bir kişinin e-postalarını topluca yayımlamıştı; rasterleştirilmiş PDF olarak yayımlanmıştı
      Şimdi adını hatırlamıyorum. O zamandan beri aklı dağıtan çok fazla şey oldu
    • Safari’nin görselden metin kopyalama özelliği, dizenin base64 kısmının tamamını neredeyse hallediyor. Sadece ilk karakteri T yerine I diye yanlış okudu
      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
    • Gerçekten kâbus mu? Tişörtün ilk küçük görselini ChatGPT’ye yapıştırdım; tek seferde çözdü ve Bash betiğinin ne yaptığını da anlattı
  • 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

    • Gözden kaçırması kolay. Çoğu zaman sakin olmadığımız için düşüncelerimiz otomatik pilotta oluyor
  • 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.

    • O zaman belki de oraya bir patch dikip ekleyebilirlerdi?
  • 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.

    • Ben de aynı şeyi düşündüm. Ama ben dergilerde ve kitaplarda yayımlanan “oyunları” saatlerce lastik klavyeye kopyalayarak yazıp büyüyen nesildenim. Sonra yazım hatalarını düzeltmek de birkaç saat daha sürerdi.
    • PaddlePaddle OCR’dan geçirdim, kusursuz işledi.
      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.
    • 4 satırı girmem neredeyse 2 dakika sürdü ve bu sırada bir karakteri kaçırdım.
      Ben olsam elbette OCR’ı seçerdim. Bir sonraki karşıma çıkacak Bash tişörtüne hazırlıklı olmak lazım.
    • Kurumsal ortamlarda iş otomasyonunun gerçekliğini hatırlatıyor. Yeni başlayan birinin 10 dakikada elle yapabileceği ve haftada yalnızca 1 kez gereken bir işi otomatikleştirmek için mühendislerin 40 saatten fazla harcaması yaygın. Görünüşe göre gelecek ne pahasına olursa olsun otomasyon.
    • “Sadece yazmak”, ortalama bir kişi için muhtemelen daha fazla hataya yol açar.
  • 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

    • Go masa oyunu programını mı kastettiğinden, yoksa Go dilini mi kastettiğinden emin olamamıştım. Birinin Go ile Go programı yapması eğlenceli olurdu.
    • Bu yıl üzerinde Go kodu olan bir tane aldım. Gerçek kod olduğunu hiç düşünmemiştim; rastgele bir şeyler sanmıştım.