유니클로 티셔츠에 숨겨진 난독화된 배시 스크립트 해독하기

Decoding the obfuscated bash script on a Uniqlo t-shirt

요약

유니클로가 아카마이와 협업해 판매하는 티셔츠 뒷면에 난독화된 배시 스크립트가 인쇄되어 있어 화제다. 이 스크립트는 base64로 인코딩된 문자열을 eval 명령어로 실행하는 방식으로, 실제로 실행하면 'PEACE FOR ALL'이라는 메시지가 단말기 화면에서 움직이는 이스터 에그가 출력된다. OCR을 통해 코드를 추출하는 과정에서 오류 수정이 까다로웠지만, 최종적으로 완전한 문자열을 복원하는 데 성공했다. 같은 라인의 다른 디자인은 코드가 잘려 있어 실행이 불가능했지만, 이 티셔츠는 정상 작동하는 완전한 스크립트를 담고 있다.

본문 기반 요약
원문 보기 HN 토론

전체 번역

난독화된 자기 평가 배시 스크립트, CDN 아카마이가 소매점을 통해 소비자에게 제공
아내가 “내가 본 티셔츠 보여줄게…”라고 말했을 때, 나는 뭘 기대해야 할지 몰랐지만, 뒷면에 부활절 달걀 메시지를 출력하도록 설계된 난독화된 배시 스크립트가 인쇄되어 있을 거라고는 전혀 예상하지 못했다. 나는 클릭베이트성 제목을 쓰는 버릇이 없고, 이 사이트가 조회수를 얼마나 받는지 전혀 모르지만, 한 달에 두 자릿수 인간조차 안 될 거라고 장담한다. 하지만 부편집자들이 그런 제목으로 얼마나 재미를 보는지 이해는 간다. 위 제목은 엄밀히 말해 완전히 정확하지만, 아마 당신이 생각하는 그런 뜻은 아니다. 문제의 난독화된 코드는 사실 이스터 에그로, 유니클로 매장에서 아카마이가 'Peace for All' 캠페인을 지원하기 위해 디자인한 훌륭한 티셔츠에 제공되고 있다. 그리고 정말 멋지다! 앞면에는 중괄호 안에 하트가 있다:
뒷면에는 커다란 영숫자 블록이 있다:
저건… 쉬뱅인가?!
아내가 내가 보고 싶어할 거라고 맞췄다. 저건… 쉬뱅이었나? 텍스트 블록을 자세히 살펴보자:
그래, 쉬뱅이다! 그것도 번화가 매장에서 판매되는 티셔츠에 말이다. 그리고 base64로 인코딩된 Here 문자열을 base64 --decode를 통해 eval에 전달하는 것이 분명하다. 흥미롭다. 나는 아내에게 “그게 기본적으로 사람들이 바이러스를 유포하는 방식이야”라고 말하고 샀다.

OCR은 번거로웠다
좋은 소식과 나쁜 소식이 있었다: 나쁜 소식은 base64에 오류 수정 기능이 없어서 전사가 완벽해야 한다는 점이었다. 한숨. 좋은 소식은 문자열이 손상되지 않은 것 같다는 점이었다. 적어도 예상된 패딩으로 종료되고 따옴표와 중괄호가 일치했다. 이는 다행스러운 일인데, 유니클로 x 아카마이가 같은 라인에서 판매하는 다른 티셔츠 디자인은 분명히 불완전하기 때문이다. 예를 들어, 임포트가 잘려 있고 “return” 대신 “retu”로 끝난다. 이는 안타까운 일인데, 색상 조합이 정말 예쁘고 누구나 공감할 수 있는 매우 관용적인 명령어 go doStuff(msg, work...가 포함되어 있기 때문이다. , 더 넓은 텍스트 블록에서 잘려나간 조각으로 절대 컴파일될 수 없었다. 나는 여러 방식으로 OCR을 실행했다: 첫째, 안드로이드의 서클 투 서치 기능에 내장된 OCR을 사용했는데, 종종 매우 좋은 성능을 보인다. 둘째, 몇 가지 옵션과 조정을 거쳐 Tesseract를 사용했다. 셋째, Claude를 통해 실행했다. 세 결과를 비교하여 불일치를 찾고 Claude가 빠른 스캔을 위해 위치 표를 출력하도록 한 후, 나머지를 정리하는 것은 지루하지만 간단한 작업이 되었다. 결과 문자열은 다음과 같았다:

IyEvYmluL2Jhc2gKCiMgQ29uZ3JhdHVsYXRpb25zISBZb3UgZm91bmQgdGhlIGVhc3RlciBlZ2chIOKdpO+4jwojIOOBiuOCgeOBp+OBqOOBhuOBlOOBluOBhOOBvuOBme+8gemaoOOBleOCjOOBn+OCteODl+ODqeOCpOOCuuOCkuimi+OBpOOBkeOBvuOBl+OBn++8geKdpO+4jwoKIyBEZWZpbmUgdGhlIHRleHQgdG8gYW5pbWF0ZQp0ZXh0PSLimaVQRUFDReKZpUZPUuKZpUFMTOKZpVBFQUNF4pmlRk9S4pmlQUxM4pmlUEVBQ0XimaVGT1LimaVBTEzimaVQRUFDReKZpUZPUuKZpUFMTOKZpVBFQUNF4pmlRk9S4pmlQUxM4pmlIgoKIyBHZXQgdGVybWluYWwgZGltZW5zaW9ucwpjb2xzPSQodHB1dCBjb2xzKQpsaW5lcz0kKHRwdXQgbGluZXMpCgojIENhbGN1bGF0ZSB0aGUgbGVuZ3RoIG9mIHRoZSB0ZXh0CnRleHRfbGVuZ3RoPSR7I3RleHR9CgojIEhpZGUgdGhlIGN1cnNvcgp0cHV0IGNpdmlzCgojIFRyYXAgQ1RSTCtDIHRvIHNob3cgdGhlIGN1cnNvciBiZWZvcmUgZXhpdGluZwp0cmFwICJ0cHV0IGNub3JtOyBleGl0IiBTSUdJTlQKCiMgU2V0IGZyZXF1ZW5jeSBzY2FsaW5nIGZhY3RvcgpmcmVxPTAuMgoKIyBJbmZpbml0ZSBsb29wIGZvciBjb250aW51b3VzIGFuaW1hdGlvbgpmb3IgKCggdD0wOyA7IHQrPTEgKSk7IGRvCiAgICAjIEV4dHJhY3Qgb25lIGNoYXJhY3RlciBhdCBhIHRpbWUKICAgIGNoYXI9IiR7dGV4dDp0ICUgdGV4dF9sZW5ndGg6MX0iCiAgICAKICAgICMgQ2FsY3VsYXRlIHRoZSBhbmdsZSBpbiByYWRpYW5zCiAgICBhbmdsZT0kKGVjaG8gIigkdCkgKiAkZnJlcSIgfCBiYyAtbCkKCiAgICAjIENhbGN1bGF0ZSB0aGUgc2luZSBvZiB0aGUgYW5nbGUKICAgIHNpbmVfdmFsdWU9JChlY2hvICJzKCRhbmdsZSkiIHwgYmMgLWwpCgogICAgIyBDYWxjdWxhdGUgeCBwb3NpdGlvbiB1c2luZyB0aGUgc2luZSB2YWx1ZQogICAgeD0kKGVjaG8gIigkY29scyAvIDIpICsgKCRjb2xzIC8gNCkgKiAkc2luZV92YWx1ZSIgfCBiYyAtbCkKICAgIHg9JChwcmludGYgIiUuMGYiICIkeCIpCgogICAgIyBFbnN1cmUgeCBpcyB3aXRoaW4gdGVybWluYWwgYm91bmRzCiAgICBpZiAoKCB4IDwgMCApKTsgdGhlbiB4PTA7IGZpCiAgICBpZiAoKCB4ID49IGNvbHMgKSk7IHRoZW4geD0kKChjb2xzIC0gMSkpOyBmaQoKICAgICMgQ2FsY3VsYXRlIGNvbG9y