3P by GN⁺ | ★ favorite | 댓글 1개
  • NES Tetris의 킬 스크린 충돌이 단순한 게임 종료가 아니라, 수정하지 않은 하드웨어와 카트리지에서 새 동작을 실행하는 진입점으로 활용됨
  • 레벨 155 이후 점수 계산이 프레임 사이에 끝나지 않으면 제어 흐름이 깨지고, 게임이 의도치 않은 RAM 위치를 명령처럼 읽는 임의 코드 실행으로 이어질 수 있음
  • Famicom의 확장 컨트롤러 포트 입력 RAM이 점프 루틴 위치와 겹쳐, 3·4번 컨트롤러 버튼 입력으로 충돌 뒤 이동할 주소를 조작할 수 있음
  • Displaced Gamers는 점프 대상을 하이스코어 테이블로 보내 이름과 점수 데이터를 NES CPU opcode처럼 읽게 하는 개념증명 코드를 공개함
  • 입력 가능한 문자와 숫자, 저장 장치 부재 때문에 실용성은 제한적이지만, 충돌 회피 패치나 RAM 전체 제어로 확장될 가능성이 있음

킬 스크린 충돌이 코드 실행으로 바뀌는 과정

  • NES Tetris의 충돌은 점수 처리기가 새 점수를 프레임 사이에 계산하는 데 너무 오래 걸릴 때 발생할 수 있음
    • 이 상황은 레벨 155 이후에 나타날 수 있음
    • 지연이 생기면 제어 코드 일부가 새 프레임 쓰기 루틴에 의해 중단됨
    • 이후 게임은 다음 명령을 찾기 위해 의도하지 않은 RAM 위치로 점프함
  • 일반적으로 이 예기치 않은 점프는 RAM 앞부분의 쓰레기 데이터를 코드처럼 읽게 만들어 빠른 충돌로 이어짐
  • Displaced Gamers의 최근 영상은 NES Tetris가 하이스코어 테이블을 기계어 명령처럼 읽도록 만드는 절차를 공개함
    • 비슷한 임의 코드 실행 글리치는 과거 Super Mario World, Paper Mario, The Legend of Zelda: Ocarina of Time에서도 알려진 바 있음
    • NES Tetris에 외부 코드를 넣는 기본 방법은 최소 2021년부터 공개적으로 이론화되어 있었고, 커뮤니티 내부에는 RAM 전체 제어 방법도 오래전부터 알려져 있었다고 전해짐

Famicom 입력 처리로 점프 위치 제어

  • 이 해킹은 Tetris의 충돌 방식뿐 아니라 Famicom 입력 구조에도 의존함
  • 일본판 Famicom은 미국판 NES와 달리 컨트롤러 2개가 본체에 고정 연결되어 있었고, 서드파티 컨트롤러는 전면 확장 포트에 연결할 수 있었음
  • Tetris 코드는 이 “추가” 컨트롤러 포트의 입력을 읽음
    • 어댑터를 쓰면 표준 NES 컨트롤러 2개를 추가로 연결할 수 있음
    • Famicom에는 Bullet-Proof Software의 별도 Tetris 버전이 있었지만, 이 입력 처리 특성은 NES Tetris 코드에서 작동함
  • 추가 컨트롤러 입력을 처리하는 RAM 영역은 충돌 시 사용되는 점프 루틴의 메모리 위치와 겹침
    • 충돌로 점프 루틴이 중단되면 해당 RAM에는 컨트롤러에서 눌린 버튼을 나타내는 데이터가 들어 있음
    • 플레이어는 이 값을 이용해 충돌 뒤 게임 코드가 이동할 위치를 정밀하게 제어할 수 있음

하이스코어 테이블을 실행 코드처럼 읽기

  • Displaced Gamers의 점프 제어 방식에는 특정 컨트롤러 입력이 필요함
    • 3번 컨트롤러에서 up을 누름
    • 4번 컨트롤러에서 right, left, down을 누름
    • leftright를 동시에 입력하려면 컨트롤러 조작이 필요함
  • 이 입력은 점프 코드를 게임의 하이스코어 목록 이름과 점수가 저장된 RAM 영역으로 보냄
  • B-Type 하이스코어 테이블의 목표 위치에 (G를 넣으면, 게임은 하이스코어 테이블의 다른 영역으로 다시 점프함
  • 이후 게임은 이름과 점수를 순차적으로 읽고, Displaced Gamers가 “bare metal” 코드라고 부른 방식으로 NES CPU의 opcode처럼 처리함

개념증명이 보여준 가능성과 한계

  • 하이스코어 이름 입력 영역에는 43개 기호만 사용할 수 있고, 점수에는 10개 숫자만 들어갈 수 있음
    • 이 제약 때문에 NES에서 가능한 opcode 중 일부만 하이스코어 테이블에 “코딩”할 수 있음
  • 제한된 입력만으로도 짧은 개념증명 코드는 가능했음
    • 예시 데이터에는 ))"-P)라는 이름과 A-Type 2위 점수 8,575가 포함됨
    • 이 루틴은 게임 점수의 상위 자릿수 두 개를 0으로 만듦
    • 점수 처리 시간을 낮춰 충돌 원인을 줄이지만, 계속 플레이하면 점수는 다시 충돌 “위험 구간”에 도달함
  • 기본 NES Tetris에는 배터리 백업 저장 장치가 없어, 전원을 켤 때마다 필요한 하이스코어와 복잡한 이름을 직접 만들어야 함
  • 하이스코어 테이블 공간도 제한적이어서 Tetris 실제 코드 위에 복잡한 프로그램을 직접 넣기는 어려움
  • HydrantDude는 특정 하이스코어 이름과 숫자 조합으로 부트스트래퍼를 만들고, 다시 다른 부트스트래퍼를 만들어 RAM 전체 제어를 얻는 방식이 있다고 씀

충돌 회피를 넘어선 재프로그래밍 가능성

  • RAM 전체 제어가 가능해지면 상위권 플레이어가 NES Tetris의 충돌 버그를 패치하도록 게임을 다시 코딩할 수도 있음
  • 이 방식은 레벨 255를 넘어가려는 플레이어에게 특히 도움이 될 수 있음
    • 레벨 255 이후 게임은 다시 Level 0으로 돌아감
  • 같은 원리를 더 확장하면 Super Mario World 스피드러너 사례처럼 Tetris를 Flappy Bird로 바꾸는 식의 변형도 가능함

댓글과 토론

Hacker News 의견들
  • 이런 익스플로잇을 보면 늘 Stross의 Accelerando에 나온 해킹의 궁극적 최종 단계가 떠오름: “시공간 자체의 계산적 초구조에 타이밍 채널 공격을 걸어, 그 아래에 있는 무언가로 뚫고 들어가려는 것”

    • 성공 가능성이 조금이라도 있는 시도를 하는 사람의 광원뿔 안에는 있고 싶지 않음
      진공 붕괴를 일으켜 우주가 블루스크린 나는 아주 좋은 방법처럼 들림
    • 이 책은 저자 블로그에서 무료로 내려받을 수 있음: https://www.antipope.org/charlie/blog-static/fiction/acceler...
    • 방금 동기화 오류를 발견했으니, 시작하기 좋은 경계 사례일지도 모름: https://www.science.org/content/article/quantum-paradox-poin...
    • 그걸 보통 물리학이라고 부르는 것 같음
    • 시공간? 왜 공간에만 한정함, 메타 시간이 훨씬 더 흥미로움
  • 이런 사람들이 정말 좋음
    쓸모없을 가능성이 큰 일을 재미만으로 해보는 해커 마인드가 내게는 없어서 부끄럽게 느껴질 정도임

    • 그런 해커들은 대부분 신탁기금 물고 태어난 사람들인가? 미래가 보장돼 있고 지루함밖에 없는 사람들?
      나머지 우리는 이런 익스플로잇을 할 시간이 없을 만큼 먹고사는 데 바쁨, 말장난 의도는 없음
  • 전체 글을 읽고 싶지는 않지만 “NES 카트리지는 ROM에서 실행되는 줄 알았는데?”가 궁금하다면, 맞음
    다만 이 익스플로잇은 CPU가 최고 점수표 저장용 RAM으로 점프하게 만듦. 정말 멋짐

  • 임의 코드 실행에 도달하는 과정은, 그다음에 무엇을 하느냐보다 늘 더 흥미로움
    게임을 분해해서 언제 어디서 그런 동작을 하는지 알아내고, 어디를 조작해야 명령어를 입력할 수 있는지 찾아내는 집념은 감탄스럽다

  • 누군가 Tetris에서 Doom을 돌리기까지 얼마나 걸릴까?

    • 그건 RAM 확장 카트리지가 필요할지도 모름
  • 제대로 낭비한 시간임

    • 재미로는 뭘 함? 그것도 시간 낭비라고 봄?
      진심으로 묻는 것임. 예전에는 재미있는 일도 시간 낭비라고 여겼는데, 오래 지속된 고스트레스 생활의 대가를 치르면서 나이가 들수록 다르게 생각하게 됨
  • Factorio로 이걸 해보고 싶음
    벨트로 만든 거대한 컴퓨터를 Factorio 안에 만들고, 세그멘테이션 폴트를 내서 게임 밖으로 탈출하게 하는 식으로

  • 오래된 게임에서 임의 코드 실행을 찾아내는 일은 정말 매혹적임
    몇 년 전 Super Mario World에서 이런 걸 봤을 때, 그게 어떻게 가능한지에 한동안 꽂혔음
    좋은 뜻으로, 칭찬으로 하는 말인데 좀 못되게 들릴 수 있음: 정말 똑똑한 사람들이 완전히 쓸모없는 일에 엄청난 시간과 노력을 쓰는 게 좋음
    NES Tetris에 코드를 주입할 당장의 이유가 있나? 아마 없음. 하지만 핵심은 그게 아니라, 무엇이 가능한지 알아내고 낡은 코드와 원시적인 컴퓨터에 어디까지 강제로 시킬 수 있는지 알아내는 데 있음
    고전적 의미에서는 “유용”하지 않을 수 있지만, 스도쿠나 십자말풀이, 애초에 NES Tetris를 하는 것도 마찬가지임

    • 기술적 세부사항에 가려져 있지만, 이 익스플로잇에는 실용적인 목적도 있음
      고수 플레이어들이 특정 지점 이후 플레이를 막는 충돌을 피해서 더 오래 플레이할 수 있게 해줌
      평균적인 플레이어에게는 실용성이 없지만, 최고 점수 경쟁을 원하는 사람들에게는 한계를 해결하고 새로운 경쟁 가능성을 열어줌
    • 정말 똑똑한 사람들이 완전히 쓸모없는 일에 시간과 노력을 쓰는 방식으로 많은 과학적 발견이 이루어짐
      정수론도 원래는 쓸모없다고 여겨졌지만, 지금은 사실상 모든 공개키 암호를 떠받침
    • 쓸모없는 게 아님. 그들은 그 일을 좋아함
      남들이 내가 좋아하지 않지만 하는 일에서 얻는 쓸모는 운 좋은 부산물이거나, 돈이나 인정처럼 간접적으로 나에게 이득을 주는 것임
      좋아해서 하는 일은 가장 중요한 사람, 즉 자기 자신에게 가장 직접적인 형태의 쓸모가 됨
    • 이 사람의 YouTube 채널이 바로 그런 것의 정수임: https://www.youtube.com/@tom7
  • 솔직히 Tetris가 이렇게 늦게야 깨졌다는 게 놀라움
    이게 새로운 any% 실행 시대를 열 것 같음. 목표는 게임의 엔딩 장면이나 크레딧을 최대한 빨리 실행하는 것임
    내가 좋아하는 예는 Ocarina of Time인데, 이미 몇 년 전부터 ACE 익스플로잇이 있었음
    게임이 완전히 망가져 있어서, 게임 메모리를 조작하고 특정 입구 워프를 편집하면 몇 분 만에 “클리어”할 수 있음
    더 놀라운 건 사람들이 손으로, 버튼 몇 개와 아날로그 조이스틱만 써서 메모리를 편집한다는 점임
    3분 만에 크레딧을 띄운 사례: https://www.speedrun.com/oot/runs/z1l1627m

    • Super Mario에서도 비슷한 걸 봤음
      워프 터널의 결함을 찾자 범위 밖 읽기가 발동했고, 그 전에 조이스틱 조작으로 버퍼 바로 바깥에 원하는 동작을 유발할 바이트들을 써둔 식이었음
      Pokemon 게임 중 하나에서는 메모리를 정확히 준비하려고 구매/판매 거래를 잔뜩 한 뒤, 아이템 개수를 오버플로시켜 점프를 발동해야 했음
      정말 환상적인 일임. 언젠가 외계인이 공격해오면 이런 장난들이 우리를 구할 것임
    • 글만 읽어봐서는 그럴 가능성은 낮아 보임
      이 ACE는 먼저 킬 스크린에 도달해야 성립하는 것 같음
      Ocarina of Time의 ACE가 엔딩 크레딧이 올라간 뒤에야 발동한다고 상상해보면, 이미 성공적으로 완주한 뒤에만 일어나므로 기록을 줄일 수 없음
    • 솔직히 Tetris가 이렇게 늦게야 깨졌다는 게 놀랍다고 했는데, 그 전에는 무엇 때문에 임의 실행이 가능하다고 생각했는지 궁금함
  • 이런 종류의 작업이 정말 좋음
    Super Mario World 안에서 결함을 이용해 Flappy Bird를 프로그래밍했던 일이 떠오름. 미친 수준임
    https://www.youtube.com/watch?v=hB6eY73sLV0