Uniqlo टी-शर्ट के obfuscated bash स्क्रिप्ट को डिकोड करना
(tris.sherliker.net)- Uniqlo स्टोर में बेची गई Akamai डिज़ाइन टी-शर्ट पर obfuscated bash code छपा था, जो
base64 --decodeके परिणाम कोevalसे चलाता है, लेकिन असल में यहPeace for Allकैंपेन के लिए एक easter egg था - Base64-encoded Here string को खोलने पर एक स्क्रिप्ट मिलती है जो टर्मिनल में
♥PEACE♥FOR♥ALL♥टेक्स्ट को sine wave animation के रूप में बार-बार दिखाती है - Base64 में error correction नहीं होने से transcription मुश्किल थी, इसलिए string padding और quotes·braces के सही होने की जांच के बाद Android OCR, Tesseract और Claude के परिणामों की तुलना कर इसे व्यवस्थित किया गया
- डिकोड की गई स्क्रिप्ट
tput,bcऔर 256-color ANSI escape sequences को मिलाकर टर्मिनल आकार के हिसाब से अक्षरों की स्थिति और रंग निकालती है, औरCTRL+Cपर बंद होने पर cursor को restore करती है - Akamai ने पीछे छपे वास्तविक कोड को Linux से जोड़कर समझाया, और फ़ॉन्ट को शुरुआती अनुमान Consolas नहीं बल्कि Roboto Mono बताया गया
टी-शर्ट के पीछे का executable code
- Uniqlo x Akamai
Peace for Allटी-शर्ट के सामने braces के अंदर heart बना है, और पीछे बड़े alphanumeric block छपे हैं - पास से देखने पर यह ब्लॉक shebang से शुरू होने वाला bash code है, जो Base64-encoded Here string को
base64 --decodeसे खोलकरevalको देता है - ऊपर से देखने पर यह “virus distribution method” जैसा लग सकता है, लेकिन इसका असली उद्देश्य easter egg message दिखाना है
- यह टी-शर्ट Akamai द्वारा Uniqlo की Peace for All campaign के समर्थन में डिज़ाइन किया गया उत्पाद है
OCR और transcription प्रक्रिया
- Base64 में error correction feature नहीं होने के कारण, छपी हुई string को executable रूप में लाने के लिए perfect transcription ज़रूरी थी
- string expected padding पर खत्म हो रही थी और quotes व braces भी मेल खा रहे थे, इसलिए इसके पूर्ण code होने की संभावना अधिक थी
- transcription के लिए तीन तरीकों का साथ में उपयोग किया गया
- Android का circle-to-search built-in OCR
- Tesseract और कुछ options व adjustments
- Claude के जरिए OCR और position table बनाना
- तीनों परिणामों की diff से तुलना कर mismatch वाली जगहें ढूंढी गईं, और बाकी हिस्से को हाथ से ठीक किया गया
- इसी Uniqlo x Akamai लाइन की दूसरी टी-शर्ट डिज़ाइन किसी बड़े code block से कटी हुई लगती है; imports कटे हुए हैं और
returnसिर्फretuतक छपा है, इसलिए वह compile नहीं हो सकती
डिकोड किए गए bash स्क्रिप्ट का व्यवहार
- Base64 को decode करने पर अच्छी तरह comments वाला bash easter egg सामने आता है
- स्क्रिप्ट की शुरुआत में अंग्रेज़ी और जापानी में बधाई संदेश शामिल हैं
Congratulations! You found the easter egg! ❤️おめでとうございます!隠されたサプライズを見つけました!❤️
- animation के लिए इस्तेमाल होने वाली string
♥PEACE♥FOR♥ALL♥PEACE♥FOR♥ALL...के रूप में दोहराई जाती है - टर्मिनल का आकार
tput cols,tput linesसे लिया जाता है, और string length bash के${#text}से निकाली जाती है - cursor को
tput civisसे छिपाया जाता है, औरSIGINTमिलने परtput cnorm; exitसे उसे वापस लाया जाता है
animation कैसे लागू किया गया
- loop
for (( t=0; ; t+=1 ))के रूप में एक infinite loop है जो लगातार चलता रहता है - हर iteration में अभी दिखाया जाने वाला character
textसे एक-एक करके लिया जाता है - position calculation के लिए
bc -lसे sine value निकाली जाती हैangle = t * 0.2sine_value = s(angle)x = (cols / 2) + (cols / 4) * sine_value
- निकाले गए
xको टर्मिनल सीमा से बाहर न जाने देने के लिए 0 से कम नहीं औरcols - 1से ज़्यादा नहीं रहने दिया जाता - रंग 256-color palette में cyan के 12 और orange के 208 के बीच gradient के रूप में निकाला जाता है
- output ANSI escape sequences और
tput cupका उपयोग करके तय position पर रंगीन character प्रिंट करता है, और newline के साथ नीचे की ओर बढ़ता है - नतीजतन
Peace for Allकैंपेन का संदेश टर्मिनल में लगातार चलने वाले sine wave loop के रूप में दिखाई देता है
फ़ॉन्ट और Akamai की डिज़ाइन व्याख्या
- फ़ॉन्ट को लेकर शुरुआती अनुमान Consolas था, लेकिन Hacker News यूज़र ralphinus की पुष्टि के बाद इसे Roboto Mono के रूप में सुधारा गया
- गलत अनुमान के आधार के रूप में हल्का तिरछा
0, serif-रहित1, औरBDygव अंक2की गोल वक्रता जैसी बातें बताई गईं - Akamai ने टी-शर्ट लॉन्च के समय press release के जरिए डिज़ाइन का संदेश समझाया
- हल्का पीला-भूरा रंग शुरुआती इंटरनेट कंप्यूटरों के “beige box” plastic case की ओर इशारा करता है, और सामने का heart यह दर्शाता है कि इंटरनेट का दुनिया भर में अच्छे काम के लिए इस्तेमाल हुआ है
- पीछे का वास्तविक code Linux का reference है, और Akamai इसे “इंटरनेट की open source language” तथा अधिक सुरक्षित और connected दुनिया की साझा भाषा से जोड़ता है
- इसी टी-शर्ट में रुचि लेने वाले दूसरे उदाहरण के रूप में Wen Chuan Lee की पोस्ट भी है, जो आगे एक और संबंधित लेख की ओर जाती है
1 टिप्पणियां
Hacker News की राय
“Uniqlo x Akamai की उसी लाइन में बिकने वाली दूसरी शर्ट का code साफ़ तौर पर अधूरा design है”
सोचिए, T-shirt malfunction करे और उसे return करना पड़े—कितना मज़ेदार है
“आप return क्यों कर रहे हैं, size fit नहीं हुआ या पसंद नहीं आई?”
“नहीं, line 37 में syntax error है इसलिए run नहीं होती, और मुझे चिंता है कि सड़क पर लोग सोचेंगे कि मैं unsafe Bash scripting को promote कर रहा हूँ”
अगर आपको ऐसी चीज़ें पसंद हैं, तो Martin Kleppe का काम भी पसंद आ सकता है। उदाहरण के लिए Quine Clock है
https://aem1k.com/qlock/
कुछ साल पहले मैंने इसका unobfuscated रूप में reverse-engineered version भी बनाया था
https://gist.github.com/olooney/a89db3932b089925b71b68d7e9f2...
इसके अलावा भी उन्होंने कई बेहतरीन ASCII visualizations बनाई हैं
https://aem1k.com/
बेहद impressive तो है, लेकिन फिर भी
Font Consolas नहीं, Roboto Mono है
और भी अजीब बात यह है कि font खुद तो सही monospace font है, लेकिन shirt की typesetting वैसी नहीं है। इसमें kerning है, खासकर ‘Iy’ pair में दिखता है, और ‘i’ जैसे पतले characters कम horizontal space लेते हुए लगते हैं। मेरा अंदाज़ा है कि इसे InDesign के “optical kerning” जैसे किसी tool से typeset किया गया होगा
Monospace font इस्तेमाल करने की वजह यह है कि वह grid में अच्छी तरह fit होता है। लेकिन उसी grid के अंदर भी अक्षरों को थोड़ा left या right shift करने की गुंजाइश होती है, और उससे शायद एक ज्यादा readable monospace font बन सकता है। बेशक, हर बार कोई character left की ओर खिसकेगा तो right side की space बढ़ेगी, और उतनी ही संभावना है कि नतीजा भयानक हो जाए
यह shirt सच में बढ़िया है। इसे बनाने की process समझाते हुए actual designer का एक अच्छा video है। इसमें जानबूझकर OCR को मुश्किल बनाने की process भी शामिल है: https://youtu.be/jocGLiecpjU?t=526
https://archive.org/details/1983-01-compute-magazine/page/96...
Samsung S24U पर home screen के “circle to search” button को long-press करके AI tool interface खोला, फिर text को long-press करके पूरा text एक बार में copy कर लिया। Official नाम नहीं पता, लेकिन लगभग 2 seconds लगे
इसका OCR करना nightmare है, और जो खुद को अच्छा OCR/vision model बताते हैं उनके लिए यह अच्छा benchmark बनता है
हालांकि latest Claude या GPT जैसे अच्छे vision model के साथ agent-style tool को image देकर, उसे line-by-line split करके हर line का अलग OCR करने को कहें तो शायद काफी आसानी से हो जाएगा
यह भी curious हूँ कि obfuscation से पहले यह script खुद LLM से लिखी गई थी या नहीं। Comments काफी ज्यादा लगती हैं, हालांकि इस case में वह ठीक है :)
बधाई का message English और Japanese दोनों में है, और एक heart emoji है। Cyan से orange तक gradient का इरादा था, लेकिन range ANSI block से शुरू होकर 256-color block के बीच में खत्म होती है, और 256 terminal colors वैसे भी gradient की तरह arranged नहीं होते। साथ ही loop के अंत में sleep नहीं है, जबकि LLM शायद defensive तरीके से उसे जोड़ देता
Characters आसानी से अलग होते हैं, और reader को confuse करने वाला कोई structural background भी नहीं है। जैसे yogurt के aluminium lid पर expiry date वाली चीज़ से अलग मामला है। Result बिगाड़ने वाली लगभग-text जैसी texture भी नहीं है, और font भी साफ़ और standard है
अभी नाम याद नहीं आ रहा। इस बीच दिमाग भटकाने वाली बहुत चीज़ें हो चुकी हैं
अजीब बात यह है कि अगर hashbang हिस्से समेत पूरी string copy करने की कोशिश करें तो performance बहुत खराब हो जाती है। अंदर क्या कर रहा है कि इतना अच्छा काम करता है, यह जानने की curiosity है
base64 encoding को obfuscation कहना
मैं किसी cool JS deobfuscation technique की उम्मीद कर रहा था; हल्के शब्दों में कहूँ तो disappointment इतनी ज्यादा थी कि मेरा दिन खराब हो गया
वाह, मैंने store में वह T-shirt देखकर girlfriend से कहा था “वह script सच में काम कर ही नहीं सकती, बस decoration होगी।” और गहराई से देखना चाहिए था
ठीक है। स्क्रिप्ट को लेकर बस एक ही कमी लगी कि लगता है लूप के अंदर
sleep 0.1
डाला गया होगा। तभी टर्मिनल में आउटपुट होते समय उसे सच में पढ़ा जा सकता है। आधुनिक टर्मिनल इतनी तेज़ी से स्क्रॉल होते हैं कि मैसेज गुजरते हुए दिखते ही नहीं
करीब 10Hz refresh तक धीमा कर दें तो देखने में बहुत अच्छा लगेगा
लेखक ने कई OCR टूल आज़माए, नतीजे ऊपर-नीचे रहे, और फिर सबसे अच्छे आउटपुट को काफ़ी देर तक manually ठीक करता रहा—यह देखकर हंसी आई। सीधे खुद टाइप क्यों नहीं कर लिया
फोन पर Google Lens के जरिए Google OCR ने भी काफ़ी अच्छा extract किया, लेकिन 100% accurate नहीं था। फिर भी हाथ से कॉपी करके टाइप करने की तुलना में सुधारने में बहुत कम समय लगता। पता नहीं लेखक ने क्या इस्तेमाल किया, लेकिन अच्छा होता अगर वे बताते कि OCR के प्रयास कैसे रहे; शायद उन्होंने कोई साधारण OCR टूल ही आज़माया होगा
मैं भी जाहिर तौर पर OCR ही चुनता। अगली Bash T-shirt के लिए तैयार रहना पड़ेगा
एक पुराने colleague के पास Go program वाली shirt थी, और मुझे वह हमेशा काफी cool लगती थी
[0] https://github.com/GL-Kageyama/UNIQLO_Akamai_T-shirt_Code