임의 코드 실행
1. 개요
임의 코드 실행(arbitrary code execution)이란 보안 관련 용어로, 보안상 허점을 이용해 해커가 원하는 임의의 코드를 실행시켜 원래대로라면 일어나서는 안되는 일이나 권한부여를 받게 만드는 것을 말한다.
미국의 해킹 대회인 PWN2OWN도 주로 이 임의 코드 실행을 목표로 경쟁을 하게 되며, 어도비가 사실상 플래시 플레이어의 지원을 포기하고 제작 프로그램을 애니메이팅 툴로 노선전환을 한 것도 이 임의 코드 실행이 가능한 허점이 넘쳐나기 때문.
2. 게임에서
주로 게임 내에서 여러 버그들이 시너지를 일으켜 발생하는 상황으로, 보통은 게임이 멈추거나 재시작되곤 하지만 사실 그 사이에 윗 문단에서처럼 플레이어가 원하는 코드를 넣을 수 있는 상황을 말한다. 버그로 인한 상황이기 때문에 수년간 사람들의 관심을 끌지 못한 버그가 사실 임의 코드 실행이 가능하도록 만드는 요소라는 게 발견되는 경우도 많다.
임의 코드 실행이 일어나는 근본적인 원인은 어떠한 이유로 잘못된 메모리 주소를 참조하는 것부터 시작된다. 이런 메모리 주소로 이동하면 대부분 상정된 코드의 중간부터 시작될 텐데, 고전 콘솔게임 대부분의 코딩 언어인 어셈블리어의 특성상 코드를 중간부터 읽을 경우 내용이 아예 달라질 수 있다[1][2] . 이것이 치명적인 오류를 만들어 내면 게임이 크래시 혹은 자동 리셋되는 것이고, 실행과 무관하거나 약간 비정상적인 값을 리턴하면 아무 일도 일어나지 않거나 약간의 버그가 나는 정도에 그치며, 이것을 적절한 게임 플레이로 미리 조작해두면 엔딩을 보게 만드는 코드로 가게 만들 수 있는 것이다.
일반적으로 정규루트를 밟는다면 몇시간이나 걸려야 볼 수 있는 엔딩을 순식간에 띄우는 유형의 플레이가 많다. 다만, '초고속 엔딩 유도 = 임의 코드 실행'이라고 착각하면 안된다. 단순히 특정 타이밍에 게임을 리셋해 세이브파일을 망가뜨리는 것을 통해 임의 코드 실행이 아님에도 엔딩을 끌어내는 것이 가능하기 때문. 해당 내용을 읽어보면 그 코드를 실행하기 위한 과정보다 세이브 파일을 망가뜨리는 과정이 더 부각되는 방식이다 보니 그렇지 정확히는 임의 코드 실행이 맞다. 엔딩을 불러내는 과정이 망가진 세이브파일에서 잠깐동안 커맨드 입력이 가능한 순간에 엔딩을 불러내는 코드를 입력해내는 것이기 때문.
엔딩보기가 일차적으로 완료되면 이후 해당 현상을 어떻게 써먹을 수 있는지에 대한 연구로 넘어가는데, 특히 TAS분야 유저들이 이 부분을 많이 연구한다.[3] 심한 경우 엔딩 불러오기가 아니라 아예 다른 프로그램으로 마개조하는 사례도 있다고 볼 수 있다.
2.1. 임의 코드 실행 사례
2.1.1. 슈퍼 마리오브라더스 3
해당 문서 참고.
2.1.2. 슈퍼 마리오 월드
Masterjun이라는 플레이어에 의해 밝혀졌다. 엔딩 크레딧을 띄우기 직전에 했던 뻘짓들로 인해서 바로 엔딩으로 넘어가게 한 것이다.[4] 이런 방법으로 클리어한 최단 기록은 41초 81.
비슷한 방법을 통해 RTA를 실현시킨 사람이 있다. Sethbling이라는 유튜버가 세운 기록으로, 원래는 요시에게 먹일 수 없는 척을 버그로 먹이게 함으로써 글리치를 일으켜서 엔딩을 불러온 것.
Masterjun이 같은 방법으로 메모리에 다른 코드를 입력하여 아예 미니게임을 창조했다. 더 정확히 말하자면 게임 안에서 ASM을 코딩한 것.TASVideos 설명 AGDQ 2014에서의 시연 영상 AGDQ 2015에 공개된 영상에서는 아예 슈퍼 마리오 브라더스 1을 만들어서 하고 있다.
AGDQ 2016에서는 위와 같은 메모리 커럽션을 이용해서 슈퍼 마리오 '''메이커''' 올스타즈를 만들어냈다. 직접 시연하기도 했으나 후에 불안정한 문제 때문인지 결국 그래픽이 깨져 버렸다.
2.1.3. 포켓몬스터 레드·그린
- 트위치 채팅 프로그램 (Pokemon Plays Twitch)
AGDQ 2015에서 슈퍼 게임보이가 장착된 실제 슈퍼 패미컴에 실제 ACGQ를 생중계중이던 트위치채널의 채팅과 연동된 TASBot이 조작할수있는 컨트롤러 4개를 연결해서, 메모리 변조를 사용한 ASM 임의 코드 실행으로 트위치 채팅창 그래픽과 실제 채팅 내용을 구현하였다. 채팅창에 HELIX, anarchy와 같은 Twitch Plays Pokemon 관련 밈이 올라오는 걸 실제 게임 화면에서 확인 할 수 있고, 심지어 FrankerZ와 같은 트위치 이모티콘들도 도트로나마 재현해냈다. 이들은 바로 전에 슈퍼 마리오 월드 안에서 슈퍼 마리오 브라더스를 구동시키기도 했다.
2.1.4. 포켓몬스터 피카츄
세이브 도중에 재부팅하여 프로그래밍이 가능한 버그 상황을 만들고 아이템 위치와 수량을 이용해 원하는 코드를 작성하는데, 잘만 이용한다면 뭐든지 만들 수 있다. 다른 1세대 시리즈 모두가 같은 허점을 공유하지만 연구하는 사람들 사이에서는 유난히 피카츄버전이 인기가 많다. 가능성을 엿본 용자들은 이걸 이용해서 별 프로그램을 만들어내기 시작했으며, 아래는 이를 이용해 만든 사례이다.
- 파이값 구하기
- 음악 재생
- 여러 영상 구현하기
게임보이 컬러의 한계를 시험하는 ACE로 순수한 버튼입력 코딩으로 다음과 같은 요소들이 재생된다. 당연히 게임 자체를 할 수 있게 만드는 건 아니고, 그 게임의 영상을 실시간으로 코딩해 재생하는 것이다.
- 포켓몬스터 금(세이브 데이터 로드까지)
- 포켓몬스터 크리스탈(오버월드 부터)
- 닌텐도 테트리스 원본 TAS
- 젤다의 전설 꿈꾸는 섬 DX
- 슈퍼 마리오 브라더스 DX
- Still Alive 재생 (음성 포함) [6]
- 네모바지 스폰지밥 영상
2.1.5. 포켓몬스터 에메랄드
에메랄드에도 이러한 임의 코드 실행을 통해 평범한 방법으로 갈 수 없는 탄생의 섬에서 테오키스를 잡거나 더미 데이터 BGM을 불러오거나, 퐁 게임을 실행할 수 있다.
3. 관련 문서
[1] 쉽게 예시를 들면, <아버지가방에들어가신다>는 '아버지가 방에 들어가신다'로 상정된 내용이지만, 앞을 잘라내고 <가방에들어가신다>부터 읽어버리면 '가방에 들어가신다'로 내용이 바뀌어버린다.[2] 좀 더 실제와 가까운 예시를 들면 <ABCDEFGH>라는 코드는 'AB는 EF와 GH의 합(CD)'이라는 내용인데, 중간부터 읽어 <BCDEFGHI>로 읽으면 'BC는 FG와 HI의 곱(DE)'이라는 전혀 다른 결과가 도출된다. CD와 DE 둘다 원래는 정상적으로 '더해라', '곱해라'를 실행하는 기능인데, 순서가 한번 밀리자 전혀 다른 기능으로 바뀌는 것이 포인트다. 여기에 원래 코드와 상관없던 I가 코드 실행에 사용되는 것에서 보이듯 기존 코드 뒤의 다른 메모리를 침범하는 부작용도 일어난다.[3] 가끔 일부 변태 유저가 수작업으로 이걸 파는 경우가 있지만, 기본적으로 프레임 단위 정확한 입력이 필요한 관계로 TAS보다 효율도 떨어지고 파는 사람도 그렇게 많지 않다[4] 좀 더 자세하게 설명하자면, 요시가 바로 소화 안 되는 물체를 입에 머금고 있을 경우 해당 데이터는 255(FF)의 값을 지니게 되고 메모리에 기록되며 시간이 지날수록 값이 줄어들어서 소화시키는 코드를 실행하게 된다. 하지만 아무 아이템도 먹지 않았는데 먹은 것이 되었을 경우 그 아이템을 뱉어내면 소화 데이터는 바로 0(00)이 되고 아이템이 튀어나와야 하지만, 애초에 먹은 아이템이 없기에 에러가 일어나게 되는데, 아무 것도 먹지 않은 상태는 255(FF)의 코드를 지니고 있어서 존재하지 않는 #255 아이템을 뱉어내게 된다. 이후에 정상적인 아이템을 먹었다가 뱉어내게 되면 그 데이터가 기존의 데이터를 덮어씌우게 되며 그 행동을 할 때의 화면의 스프라이트와 위치 가속도 등 각종 데이터가 영향을 미쳐서 뱉어내는 아이템의 코드를 바꾸게 된다. 이 영상에서는 화면의 물체의 위치+각종 데이터+여덟 개의 컨트롤러 입력까지 동원하여 코드를 바꾸게 된 거고 그 코드가 엔딩 크레딧으로 넘어가게 되는 코드를 실행하게 되는 것.[5] 이때 나오는 음악은 My Little Pony: Friendship is Magic의 오프닝 테마이다.[6] 원본 음질이 아니고 게임보이 컬러 사양에 맞게 음질을 열화시킨것. 자세히 들어보면 노이즈가 껴있는것을 알 수 있다