TECH 으로 돌아가기
TECH HACKER NEWS 6분 읽기 30 READS

보드게임 하나를 리버스 엔지니어링하다: 18시간 끝에 만난 '공개된 비밀'

보드게임 하나를 리버스 엔지니어링하다: 18시간 끝에 만난 '공개된 비밀'
SOURCE IMAGE · HACKER NEWS

안드로이드 앱을 뜯어보는 이른바 '토끼굴(rabbit hole)'은 보안 연구자나 취미 개발자에게 익숙한 경험이다. 한 개발자가 선물로 받은 음악 맞히기 보드게임 'Hitster'를 분석한 기록은, 그 토끼굴이 얼마나 깊을 수 있는지와 동시에 얼마나 허무하게 끝날 수 있는지를 함께 보여준다. 결론부터 말하면 그는 암호화된 데이터를 푸는 데 약 18시간을 썼지만, 정작 같은 데이터가 암호화 없이 공개 서버에 그대로 올라와 있었다.

게임 구조와 분석의 출발점

Hitster는 카드마다 QR 코드가 있고, 전용 앱으로 스캔하면 Spotify나 Apple Music을 통해 곡이 재생되는 방식이다. 카드 앞면에는 아티스트, 발매 연도, 곡 제목이 적혀 있다. QR 코드를 스캔하면 지역 코드(글쓴이의 경우 독일을 뜻하는 DE)와 카드 ID가 담긴 URL로 연결된다. 즉 내부적으로는 '카드 ID → 음원 트랙'이라는 매핑이 존재한다. 다만 지역마다 카드 버전이 여러 개여서, 같은 카드 ID 1번이 영국에서는 'Wet Dream', 독일에서는 'Tage wie diese'가 되는 식으로 카드 ID만으로는 곡이 특정되지 않는다. 앱이 음원 구독을 요구한다는 점이 분석의 동기였다.

글쓴이는 APK를 내려받아 jadx로 자바 코드를 디컴파일했고, res/raw 폴더에서 암호화된 것으로 보이는 gameset_database_4.json을 발견했다. 형식 판별 도구는 이를 Base64로 식별했는데, 이는 암호화가 아니라 인코딩이므로 먼저 디코딩했다. 그래도 읽을 수 없는 바이트가 나왔고, AES 계열 암호화로 추정했다.

허술하게 숨겨진 복호화 로직

흥미로운 지점은 여기서부터다. 안드로이드 앱 리버스 엔지니어링이 처음이었던 글쓴이가 'AES'를 전역 검색하자, k43.java라는 파일에 복호화 전 과정이 그대로 담겨 있었다. 코드를 따라가 보면 디코딩된 데이터의 앞 12바이트는 IV(논스), 뒤쪽 16바이트는 인증 태그였다. 전체 길이에서 이 28바이트를 뺀 값을 문자열로 바꿔 또 다른 비밀 문자열과 이어 붙인 뒤 SHA-256으로 해싱해 AES 키를 만드는 구조였다. 암호 방식은 AES-GCM이었다. 즉 코드에 적힌 문자열 자체가 키가 아니라, 키를 파생시키는 재료였던 셈이다.

복호화 절차는 다 파악됐지만 정작 그 '비밀 문자열'이 보이지 않았다. Rust 커뮤니티 디스코드 통화로 함께 작업하던 중, 누군가 길이 32바이트짜리 배열을 찾아보라고 조언했다. byte[32] 검색은 소득이 없었지만 패턴을 바꿔 검색하자 m17.java에서 두 개의 배열이 나왔고, 이를 XOR한 결과를 텍스트로 해석하니 비밀 문자열이 드러났다. 이 문자열로 Rust 복호화기를 작성해 돌리자, 약 3만 1,000줄에 달하는 매핑 데이터가 나왔다. 여러 지역의 카드 ID와 Apple Music·Spotify 트랙, 그리고 ISRC 코드까지 담긴 파일이었다.

18시간 끝의 반전

문제는 이 모든 과정이 사실상 불필요했다는 점이다. 코드를 조금 더 살펴보다 HTTPS URL부터 검색했다면 hitster.jumboplay.com/hitster-assets/ 경로를 먼저 발견했을 것이고, 약간의 추측을 더해 gameset_database.json을 붙여보니 암호화되지 않은 전체 데이터가 그대로 공개돼 있었다. 18시간을 들인 '비밀'이 실은 비밀이 아니었던 것이다.

이 사례는 보안 설계에 관한 실무적 교훈을 몇 가지 압축해서 보여준다. 첫째, 클라이언트 측에 복호화 키와 로직을 함께 담는 방식은 보호가 되지 않는다. 디컴파일된 코드에서 'AES' 한 번 검색으로 전체 절차가 드러났고, 키 파생 재료마저 XOR 트릭 수준으로 숨겨져 있었다. 클라이언트에 배포되는 순간 그 비밀은 더 이상 비밀이 아니라는 원칙이 그대로 재확인된다. 둘째, 데이터를 애써 암호화해두고도 동일한 데이터를 인증 없는 공개 엔드포인트에 올려두면 암호화 자체가 무의미해진다. 공격자에게는 가장 약한 고리만 있으면 충분하기 때문이다.

동시에 분석자 입장에서도 배울 점이 있다. 복잡한 암호 해독에 곧바로 뛰어들기 전에 앱이 접근하는 네트워크 엔드포인트와 하드코딩된 URL을 먼저 훑어보는 것이, 훨씬 적은 비용으로 목표에 도달하는 길일 수 있다는 점이다. 다만 이 기록은 개인이 선물받은 게임을 대상으로 한 취미성 분석이며, 상용 서비스나 타인의 시스템에 같은 기법을 적용하는 것은 약관 위반이나 법적 문제로 이어질 수 있다는 점은 분명히 구분해 둘 필요가 있다.

SOURCE · HACKER NEWS
원문 전체 보기 → https://wuemeli.com/blog/reversing-hitster-game/
SHARE
NEXT · CHOOSE

변화를 읽었다면,
내가 만들 수익 구조를 고릅니다.

정보를 더 모으는 데서 멈추지 않고, 광고·외주·판매·중개·구독 중 내 상황에 맞는 출발점을 정해보세요.

21가지 수익 구조 살펴보기 →
처리 중...