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의 글이 있으며, 해당 글은 또 다른 관련 글로 이어짐
-
Homepage
-
Tech blog
- Uniqlo 티셔츠의 난독화된 bash 스크립트 해독하기