모든 프로젝트
Reverse Engineering2026

2048 Reverse Engineering & Binary Patching

오픈소스 2048 게임의 실행 파일을 IDA로 분석하고, 점수 계산 로직을 찾아 소스코드를 수정하지 않고 바이너리 패치를 통해 획득 점수를 변경한 프로젝트입니다.

  • Assembly
  • C
  • macOS
분석·패치 완료

01

프로그램 구조 분석

IDA를 이용해 main부터 게임의 입력 처리와 이동 로직을 추적했습니다.

입력 → 이동 함수

W → moveUp
A → moveLeft
S → moveDown
D → moveRight

moveLeft는 보드를 회전한 뒤 moveUp을 재사용하고, 다시 회전해 원래 방향으로 되돌리는 구조였습니다.

입력 처리와 방향별 이동 함수 추적 · main
W / A / S / D 입력 분기
moveLeft의 rotateBoard / moveUp 재사용

02

타일 병합 및 점수 로직 분석

이동 함수를 따라 실제 타일 이동과 병합을 처리하는 slideArray까지 확인했습니다.

C · 점수 계산식

*score += 1 << ++array[t];

타일은 숫자 자체 대신 2의 지수로 저장됩니다. 병합 시 지수를 1 늘리고, 1 << n으로 실제 타일 값과 획득 점수를 계산합니다.

저장된 지수 → 타일 값

1 → 2    2 → 4
3 → 8    4 → 16
타일 병합과 점수 계산 로직 · 심볼 제거 후 화면

03

x86-64 Assembly 분석

Decompiler의 점수 계산식을 실제 x86-64 명령어까지 추적했습니다.

C

*score += 1 << ++array[t];

Assembly · 비트 시프트 부분

mov eax, 1
shl eax, cl

mov eax, 1로 기준값을 설정하고, shl eax, cl로 1 << n을 계산합니다. 이어지는 add 명령에서 이 값을 점수에 더합니다.

C 코드와 실제 Assembly 명령 연결

04

Stripped Binary 재분석

함수 심볼이 포함된 바이너리로 구조를 이해한 뒤, 심볼을 제거한 실행 파일을 다시 분석했습니다.

분석용 실행 파일 준비

clang -arch x86_64 -O0 2048.c -o 2048_stripped
strip 2048_stripped

함수명이 sub_100000… 형태로 표시되는 상태에서 키 입력, 반복 구조, 함수 호출 관계를 단서로 각 함수의 역할을 추론했습니다.

키 입력을 단서로 역할 추론

'w'
 ↓
sub_100000D60
 ↓
moveUp으로 추론

위의 병합 함수 후보 화면에서는 sub_100000AC0의 반복문과 비트 시프트 연산으로 slideArray의 역할을 확인했습니다.

함수 심볼이 제거된 바이너리에서 기능 재추론

05

Binary Patching

점수 계산 명령어의 주소 0x100000B86을 확인하고, 실행 파일의 해당 바이트를 변경했습니다.

Before

mov eax, 1

2 + 2 → 4

점수 +4

After

mov eax, 2

2 + 2 → 4

점수 +8

점수 계산의 기준값만 1에서 2로 바꿨습니다. 타일 이동과 병합 규칙은 유지하면서 획득 점수가 2배가 되도록 변경했습니다.

분석용 바이너리를 준비한 이후에는 소스코드를 수정하거나 다시 컴파일하지 않고, 실행 파일을 직접 패치해 동작을 변경했습니다.

패치 대상 주소와 원래 명령어 확인
바이너리 패치 후 2048 실행 화면

Troubleshooting

문제 해결 과정

01

IDA에서 ARM64 바이너리를 열 수 없음

문제

Apple Silicon Mac에서 기본으로 컴파일한 실행 파일을 IDA로 열었지만, 설치된 IDA 버전에서 ARM 프로세서를 지원하지 않아 분석할 수 없었습니다.

원인

clang이 기본적으로 ARM64 Mach-O 실행 파일을 생성하고 있었습니다.

해결

분석용 바이너리를 x86-64 아키텍처로 다시 컴파일했습니다.

x86-64 분석용 바이너리 컴파일

clang -arch x86_64 -O0 2048.c -o 2048_x86

그 결과 IDA에서 정상적으로 x86-64 Assembly를 분석할 수 있었습니다.

02

잘못된 위치를 패치해 의도와 다른 동작 발생

문제

점수를 변경하기 위해 기계어 패턴을 검색해 수정했지만, 점수가 아니라 타일 병합 결과 자체가 달라지는 문제가 발생했습니다.

원인

같은 형태의 기계어 패턴이 여러 위치에 존재해 점수 계산 코드가 아닌 다른 연산을 수정했습니다.

해결

단순 바이트 검색 대신 IDA에서 점수 계산 코드를 다시 추적했습니다.

C · 점수 계산식

*score += 1 << ++array[t];

Assembly · 패치 대상 명령어

mov eax, 1
shl eax, cl

해당 명령의 정확한 주소인 0x100000B86을 확인했습니다.

출처 및 라이선스

원본 게임: mevdschee/2048.c · 작성자: Maurits van der Schee

원본 게임은 MIT 라이선스로 공개되어 있습니다. 이 페이지는 해당 실행 파일을 분석하고 패치한 과정을 기록합니다.