[Flare-On 11] Challenge 4: FLARE Meme Maker 3000 Write-up
오픈소스를 활용한 js 난독화와 복호화
1. 파일 메타정보 확인
파일명: mememaker3000.html
파일 형식: HTML 문서 (내부에 CSS 및 JS 포함)
특징: 외부 리소스(이미지 파일 등)를 로드하지 않고, 단일 HTML 파일 내부에 Base64로 인코딩된 이미지 데이터와 난독화된 자바스크립트 페이로드가 모두 포함된 형태. 분석을 방해하기 위한 클라이언트 사이드 기반의 웹 리버싱 문제다.
2. 파일 실행
파일을 브라우저에서 열면 ‘FLARE Meme Maker 3000’이라는 제목과 함께 간단한 밈(Meme) 생성기 UI가 나타난다.
드롭다운 메뉴를 통해 ‘Doge’, ‘Distracted Boyfriend’ 등 다양한 밈 템플릿을 선택할 수 있다.
‘Remake’ 버튼을 누르면 이미지 위 캡션들의 위치가 초기화되고 무작위 텍스트가 채워진다.
캡션 박스는 contenteditable 속성이 적용되어 있어 사용자가 직접 텍스트를 타이핑하고 수정할 수 있다.
문제의 목표는 숨겨진 조건을 만족하는 특정 밈 템플릿과 텍스트 조합을 찾아내어 플래그를 획득하는 것이다.
3. 파일 정적분석
HTML 소스코드를 확인한 결과, <script> 태그 내부에 거대한 자바스크립트 코드(2,458,284자)가 존재했다.
3.1. 자바스크립트 난독화 해제
코드는 while(!![]) 루프를 이용한 배열 셔플링(push(shift())), 복잡한 수식을 통한 Opaque Predicate, 16진수 인덱스를 통한 문자열 참조 등 ‘JavaScript Obfuscator’의 전형적인 시그니처를 보이고 있었다.
효율적인 분석을 위해 난독화된 스크립트 부분만 추출하여 오픈소스 도구인 javascript-obfuscator를 이용해 가독성 있는 형태로 복구했다.
3.2. 핵심 검증 로직 분석 (Sink-to-Source)
복구된 코드에서 가장 중요한 부분은 Base64로 인코딩된 성공 메시지(Q29uZ3JhdHVsYXRpb25z…)를 디코딩하여 alert 창으로 띄워주는 a0k() 함수였다. 이 함수는 캡션 박스에서 keyup 이벤트가 발생할 때마다 실시간으로 호출되며, 플래그를 뱉어내기 위해 다음 조건들을 모두 통과해야 한다.
이미지 조건:
1
a !== Object.keys(a0e)[0x5]
선택된 이미지의 파일명(a)이 a0e 객체의 6번째(인덱스 5) 키값과 일치해야 한다. 다를 경우 즉시 return 된다.
텍스트 조건:
1
if (a0c.indexOf(b) == 0xe && a0c.indexOf(c) == a0c.length - 0x1 && a0c.indexOf(d) == 0x16)
첫 번째 캡션(b): 평문 밈 문구들이 저장된 a0c 배열의 인덱스 14(0xe)와 일치해야 한다.
두 번째 캡션(c): a0c 배열의 마지막 인덱스(25)와 일치해야 한다.
세 번째 캡션(d): a0c 배열의 인덱스 22(0x16)와 일치해야 한다.
조건을 모두 만족하면 3초간의 무한 루프 딜레이를 거친 후, 입력한 문자열과 원본 배열의 글자들을 substring 등으로 조립하여 최종 플래그를 생성한다.











