Uniqlo 티셔츠의 난독화된 bash 스크립트 해독하기

3 hours ago 1
  • Uniqlo 매장에서 팔린 Akamai 디자인 티셔츠에는 base64 --decode 결과를 eval로 실행하는 난독화된 bash 코드가 인쇄돼 있었지만, 실제로는 Peace for All 캠페인용 이스터에그였음
  • Base64로 인코딩된 Here string을 풀면 터미널에서 ♥PEACE♥FOR♥ALL♥ 문구를 사인파 애니메이션으로 반복 출력하는 스크립트가 나옴
  • Base64에는 오류 정정이 없어 전사가 까다로웠고, 문자열 패딩과 따옴표·중괄호가 맞는지 확인한 뒤 Android OCR, Tesseract, Claude 결과를 비교해 정리함
  • 디코딩된 스크립트는 tput, bc, 256색 ANSI 이스케이프를 조합해 터미널 크기별 문자 위치와 색상을 계산하고, CTRL+C 종료 시 커서를 복구함
  • Akamai는 뒷면의 실제 코드를 Linux와 연결해 설명했으며, 글꼴은 초기 추정인 Consolas가 아니라 Roboto Mono로 정정됨

티셔츠 뒷면의 실행 가능한 코드

  • Uniqlo x Akamai Peace for All 티셔츠 앞면에는 중괄호 안의 하트가 있고, 뒷면에는 큰 영숫자 블록이 인쇄돼 있음
  • 가까이 보면 블록은 shebang으로 시작하는 bash 코드이며, Base64로 인코딩된 Here string을 base64 --decode로 풀어 eval에 넘기는 구조임
  • 겉보기에는 “바이러스 배포 방식”처럼 보일 수 있지만, 실제 목적은 이스터에그 메시지 출력임
  • 티셔츠는 Akamai가 Uniqlo의 Peace for All campaign을 지원하며 디자인한 제품임

OCR과 전사 과정

  • Base64에는 오류 정정 기능이 없어, 인쇄된 문자열을 실행 가능한 형태로 옮기려면 완벽한 전사가 필요했음
  • 문자열은 예상되는 패딩으로 끝났고 따옴표와 중괄호도 맞아, 온전한 코드일 가능성이 높았음
  • 전사에는 세 가지 방법을 함께 사용함
    • Android의 circle-to-search 내장 OCR
    • Tesseract와 몇 가지 옵션 및 조정
    • Claude를 통한 OCR 및 위치 표 생성
  • 세 결과를 diff로 비교해 불일치 지점을 찾고, 남은 부분은 수작업으로 정리함
  • 같은 Uniqlo x Akamai 라인의 다른 티셔츠 디자인은 더 넓은 코드 블록에서 잘린 듯하며, imports가 잘리고 return이 retu로 끝나 컴파일될 수 없는 상태임

디코딩된 bash 스크립트의 동작

  • Base64를 디코딩하면 주석이 잘 붙은 bash 이스터에그가 나타남
  • 스크립트 시작 부분에는 영어와 일본어 축하 메시지가 들어 있음
    • Congratulations! You found the easter egg! ❤️
    • おめでとうございます!隠されたサプライズを見つけました!❤️
  • 애니메이션 대상 문자열은 ♥PEACE♥FOR♥ALL♥PEACE♥FOR♥ALL... 형태로 반복됨
  • 터미널 크기는 tput cols, tput lines로 가져오고, 문자열 길이는 bash의 ${#text}로 계산함
  • 커서는 tput civis로 숨기며, SIGINT를 받으면 tput cnorm; exit으로 커서를 되돌림

애니메이션 구현 방식

  • 루프는 for (( t=0; ; t+=1 )) 형태의 무한 루프로 계속 실행됨
  • 각 반복마다 현재 출력할 문자를 text에서 한 글자씩 가져옴
  • 위치 계산은 bc -l로 사인값을 구해 처리함
    • angle = t * 0.2
    • sine_value = s(angle)
    • x = (cols / 2) + (cols / 4) * sine_value
  • 계산된 x는 터미널 범위를 벗어나지 않도록 0 이상, cols - 1 이하로 보정됨
  • 색상은 256색 팔레트에서 cyan에 해당하는 12와 orange에 해당하는 208 사이의 그라디언트로 계산됨
  • 출력은 ANSI 이스케이프와 tput cup을 사용해 지정 위치에 색이 입혀진 문자를 찍고, 줄바꿈으로 아래로 내려가는 방식임
  • 결과적으로 Peace for All 캠페인 메시지가 터미널에서 연속적인 사인파 루프로 나타남

글꼴과 Akamai의 디자인 설명

  • 글꼴에 대한 초기 추정은 Consolas였지만, Hacker News 사용자 ralphinus의 확인 뒤 Roboto Mono로 정정됨
  • 잘못된 추정의 근거로는 얕게 사선 처리된 0, 세리프가 없는 1, BDyg와 숫자 2의 둥근 곡선 등이 언급됨
  • Akamai는 티셔츠 출시 당시 보도자료를 통해 디자인 메시지를 설명함
  • 밝은 황갈색은 초기 인터넷 컴퓨터의 “beige box” 플라스틱 케이스를 가리키고, 앞면의 하트는 인터넷이 전 세계에서 선한 목적으로 쓰인 것을 나타냄
  • 뒷면의 실제 코드는 Linux에 대한 참조이며, Akamai는 이를 “인터넷의 오픈소스 언어”이자 더 안전하고 연결된 세계를 향한 공통 언어로 연결함
  • 같은 티셔츠에 관심을 가진 다른 사례로 Wen Chuan Lee의 글이 있으며, 해당 글은 또 다른 관련 글로 이어짐
Read Entire Article