해법
2021년 1월, 《페이퍼 마리오》 스피드러너 Morpheus는 생방송 도중 정체불명의 게임 크래시를 우연히 발견했다. 커뮤니티는 그 원인을 '이펙트 행렬'로 추적했다. 이는 망치 연기 같은 시각 효과의 세부 정보를 저장하는 데이터 구조로, 원래는 일시적인 효과를 영구히 저장하게 만드는 메뉴 글리치를 통해 플레이어가 행렬을 넘쳐흘러 무관한 메모리로 침범할 수 있고, 콘솔은 이를 쓰레기 기계어 코드로 실행한다.
그 크래시를 유용한 코드로 바꾸려면 마리오의 3D 좌표가 행렬의 정확한 오프셋에 떨어지도록 극도로 정밀하게 위치시켜야 했다. 중력이 수직 위치를 제약하기 때문에 이는 극악했다. 2월 중순까지 러너 Fray가 위치 계산을 마치고 에뮬레이션 도구로 코드 실행을 입증했으며, 며칠 뒤 Rain은 이전의 어떤 글리치 런보다도 빠르게 크레딧으로 워프하는 완전한 도구 보조 스피드런(TAS)을 공개했다. 그러나 그 위치 조정은 인간의 능력을 넘어섰고, 바로 이 지점에서 《시간의 오카리나》가 등장한다.
스트리머 JCog는 그 연결고리를 설명했다. 오버플로가 일어나면 실행이 플레이어 플래그와 유휴 타이머 근처로 점프한다. "저장된 효과를 해제하기 전에 그 유휴 타이머를 0x810에서 0x81f 사이, 즉 69초까지 도달하게 두면 실행이 확장 팩 메모리로 점프하는데, 《페이퍼 마리오》는 그 메모리를 사용하지 않습니다." 그 요령은 기존의 《시간의 오카리나》 ACE 기법, 즉 유명한 아윙 삽입 글리치와 같은 계열의 기법을 정교하게 구성한 파일 이름으로 두 번 반복해 선택한 어셈블리 명령을 먼저 그 확장 팩 메모리에 적재하는 것이다.
마지막 재료는 하드웨어의 특이점이다. 초기 N64는 전원을 끈 뒤 몇 초 동안 확장 팩 RAM을 살려두는데, 이는 Rare가 폐기한 '스톱 앤 스왑' 크로스 카트리지 해금 시스템의 배경이 된 것과 같은 하드웨어 특성이다. 《오카리나》를 플레이해 명령을 심고, 전원을 내린 뒤 《페이퍼 마리오》로 핫스왑하면, 그 오버플로가 이제 당신의 코드가 들어 있는 메모리로 점프한다. 두 게임 모두 공식적으로 확장 팩을 사용하지 않지만, 함께라면 그것을 실행 통로로 바꿔놓았다.
달성한 것
두 게임이 공격에서 협력할 수 있다. 한 게임이 확장 팩 RAM에 기계어 코드를 심고, 카트리지 핫스왑이 다른 게임에서 그 코드로 실행을 넘긴다.
통한 이유
세 가지 독립적인 결함, 즉 이펙트 행렬 오버플로, 두 번째 게임의 ACE 쓰기, 전원 차단 후 RAM 지속성을 아무도 대비하지 않은 크로스 카트리지 공격으로 조합한다.
유휴 타이머 요령은 인간에게 불가능한 정밀도 요구를 대기 타이머로 바꿔, 이 익스플로잇을 개념적으로 실제 하드웨어에서 수행 가능하게 만든다.
1990년대에 취소된 기능인 스톱 앤 스왑을 20년 뒤 공격 원시 요소로 되살린다.
발견은 커뮤니티의 순차적 과정이었다. 한 러너의 우연한 크래시, 다른 이의 계산, 세 번째 이의 TAS, 그리고 한 스트리머의 메모리 맵 설명이 이어졌다.
공격 표면은 조합된다. 한 게임의 버그, 다른 게임의 쓰기 원시 요소, 그 사이의 정리되지 않은 하드웨어 상태가 합쳐져 어느 단일 요소도 혼자서는 드러내지 못하는 임의 코드 실행이 될 수 있다.
그 후
Rain의 도구 보조 런은 인간이 실행 가능한 가장 빠른 글리치 경로보다 더 빠르게 《페이퍼 마리오》를 곧장 크레딧으로 워프했다. Ars Technica의 기사는 이 방법을 TAS 기록 경신으로 규정했으며, 요구되는 위치 정밀도 때문에 실시간 인간 실행은 여전히 불가능하다.
근거 확인하기
출처
- How to beat Paper Mario really fast by... playing Ocarina of Time? Ars Technica · arstechnica.com ·