최근 수정 시각 : 2024-03-10 12:37:44

임의 코드 실행


1. 개요

임의 코드 실행(arbitrary code execution)이란 보안 관련 용어로, 보안상 허점을 이용해 해커가 원하는 임의의 코드를 실행시켜 원래대로라면 일어나서는 안되는 일이나 권한부여를 받게 만드는 것을 말한다.

미국의 해킹 대회인 PWN2OWN도 주로 이 임의 코드 실행을 목표로 경쟁을 하게 되며, 어도비가 사실상 플래시 플레이어의 지원을 포기하고 제작 프로그램을 애니메이팅 툴로 노선 전환을 한 것도 이 임의 코드 실행이 가능한 허점이 넘쳐나기 때문이다.[1]

2. 게임에서

주로 게임 내에서 여러 버그들이 시너지를 일으켜 발생하는 상황으로, 보통은 게임이 멈추거나 재시작되곤 하지만 사실 그 사이에 윗 문단에서처럼 플레이어가 원하는 코드를 넣을 수 있는 상황을 말한다. 버그로 인한 상황이기 때문에 수년간 사람들의 관심을 끌지 못한 버그가 사실 임의 코드 실행이 가능하도록 만드는 요소라는 게 발견되는 경우도 많다.

임의 코드 실행이 일어나는 근본적인 원인은 어떠한 이유로 잘못된 메모리 주소를 참조하는 것부터 시작된다. 이런 메모리 주소로 이동하면 대부분 상정된 코드의 중간부터 시작될 텐데, 고전 콘솔게임 대부분의 코딩 언어인 어셈블리어의 특성상 코드를 중간부터 읽을 경우 내용이 아예 달라질 수 있다.[2][3] 이것이 치명적인 오류를 만들어 내면 게임이 크래시 혹은 자동 리셋되는 것이고, 실행과 무관하거나 약간 비정상적인 값을 리턴하면 아무 일도 일어나지 않거나 약간의 버그가 나는 정도에 그치며, 이것을 적절한 게임 플레이로 미리 조작해 두면 엔딩을 보게 만드는 코드로 가게 만들 수 있는 것이다.

일반적으로 정규 루트를 밟는다면 몇 시간이나 걸려야 볼 수 있는 엔딩을 순식간에 띄우는 유형의 플레이가 많다. 다만, '초고속 엔딩 유도=임의 코드 실행'이라고 착각하면 안된다. 단순히 특정 타이밍에 게임을 리셋해 세이브 파일을 망가뜨리는 것을 통해 임의 코드 실행이 아님에도 엔딩을 끌어내는 것이 가능하기 때문.[4]

엔딩 보기가 일차적으로 완료되면 이후 해당 현상을 어떻게 써먹을 수 있는지에 대한 연구로 넘어가는데, 특히 TAS 분야 유저들이 이 부분을 많이 연구한다.[5] 심한 경우 엔딩 불러오기가 아니라 아예 게임 속 미니 게임을 즉석으로 코딩해서 집어넣는다든가 다른 프로그램으로 마개조하는 사례도 있다고 볼 수 있다.

스피드런에서는 성배나 다름 없는 취급을 받는다. ACE로 엔딩 크레딧 워프가 가능해지는 순간[6] 이전의 모든 기록은 의미가 없어지고 그저 ACE 빨리 실행하기 대회로 바뀌기 때문이다. 특히 TAS의 영역을 넘어서 RTA로 ACE가 가능해지는 순간에는 any% 카테고리의 존재의의 자체가 바뀌어 버린다.

2.1. 임의 코드 실행 사례

2.1.1. 마리오 시리즈

2.1.1.1. 슈퍼 마리오브라더스 3
파일:상세 내용 아이콘.svg   자세한 내용은 슈퍼 마리오브라더스 3 문서
8번 문단을
부분을
참고하십시오.
2.1.1.2. 슈퍼 마리오 월드

Masterjun이라는 플레이어에 의해 밝혀졌다. 엔딩 크레딧을 띄우기 직전에 했던 뻘짓들로 인해서 바로 엔딩으로 넘어가게 한 것이다. 이런 방법으로 클리어한 최단 기록은 41초 68.

좀 더 자세하게 설명하자면, 요시가 바로 소화 안 되는 물체를 입에 머금고 있을 경우 해당 데이터는 255(FF)의 값을 지니게 되고 메모리에 기록되며 시간이 지날수록 값이 줄어들어서 소화시키는 코드를 실행하게 된다. 하지만 아무 아이템도 먹지 않았는데 먹은 것이 됐을 경우 그 아이템을 뱉어내면 소화 데이터는 바로 0(00)이 되고 아이템이 튀어나와야 하지만, 애초에 먹은 아이템이 없기에 에러가 일어나는데, 아무 것도 먹지 않은 상태는 255(FF)의 코드이므로 존재하지 않는 #255 아이템을 뱉어내게 된다. 이후에 정상적인 아이템을 먹었다가 뱉어내면 그 데이터가 기존의 데이터를 덮어씌우게 되며 그 행동을 할 때의 화면의 스프라이트와 위치 가속도 등 각종 데이터가 영향을 미쳐서 뱉어내는 아이템의 코드를 바꾸게 된다. 이 영상에서는 화면의 물체의 위치+각종 데이터+여덟 개의 컨트롤러 입력까지 동원해 코드를 바꾼 거고 그 코드가 엔딩 크레딧으로 넘어가는 코드를 실행한 것이다.


비슷한 방법을 통해 RTA를 실현시킨 사람이 있다. Sethbling이라는 유튜버가 세운 기록으로, 원래는 요시에게 먹일 수 없는 척을 버그로 먹이게 함으로써 글리치를 일으켜서 엔딩을 불러온 것이다.


Masterjun이 같은 방법으로 메모리에 다른 코드를 입력하여 아예 미니 게임을 창조했다. 더 정확히 말하자면 게임 안에서 ASM을 코딩한 것.(TASVideos 설명) AGDQ 2014에서의 시연 영상 AGDQ 2015에 공개된 영상과 아래 영상에서는 아예 슈퍼 마리오브라더스 1편을 만들어서 하고 있다.

Masterjun이 녹화한 영상. 무비에서는 아예 스피드런까지 시전해버린다.


소리도 나오는데 아마도 더미 데이터를 이용한 모양이다.


AGDQ 2016에서는 위와 같은 메모리 커럽션을 이용해서 슈퍼 마리오 메이커 올스타즈를 만들어 냈다. 직접 시연하기도 했으나 후에 불안정한 문제 때문인지 결국 그래픽이 깨져 버렸다.

2.1.2. 포켓몬스터 시리즈

포켓몬스터 시리즈의 임의 실행 코드를 다루는 블로그(일본어)
2.1.2.1. 포켓몬스터 레드·그린
  • 트위치 채팅 프로그램 (Pokemon Plays Twitch)
    AGDQ 2015에서 슈퍼 게임보이가 장착된 실제 슈퍼 패미컴에 실제 ACGQ를 생중계중이던 트위치 채널의 채팅과 연동된 TASBot이 조작 할 수있는 컨트롤러 4개를 연결해서, 메모리 변조를 사용한 ASM 임의 코드 실행으로 트위치 채팅창 그래픽과 실제 채팅 내용을 구현하였다. 채팅창에 HELIX, anarchy와 같은 Twitch Plays Pokemon 관련 밈이 올라오는 걸 실제 게임 화면에서 확인 할 수 있고, 심지어 FrankerZ와 같은 트위치 이모티콘들도 도트로나마 재현해냈다. 이들은 바로 전에 슈퍼 마리오 월드 안에서 슈퍼 마리오 브라더스를 구동시키기도 했다.
  • 미사용 아이템 8F 설명
    8F를 사용하면 게임 내 포켓몬 수, 아이템 수와 종류 등을 코드로 인식해 실행하게 된다. 따라서 다른 버그를 사용해 특정 포켓몬아이템을 세팅하면 유저가 원하는 코드를 실행할 수 있다. 보통은 아이템이나 포켓몬을 얻는 정도지만 아예 다른 게임을 구현하여 돌릴 수 있다.


    8F를 이용한 임의 코드 실행으로 을 돌리는 영상.
2.1.2.2. 포켓몬스터 피카츄
  • 세이브 도중에 재부팅하여 프로그래밍이 가능한 버그 상황을 만들고 아이템 위치와 수량을 이용해 원하는 코드를 작성하는데, 잘만 이용한다면 뭐든지 만들 수 있다.

    다른 1세대 시리즈 모두가 같은 허점을 공유하지만 연구하는 사람들 사이에서는 유난히 피카츄 버전이 인기가 많다. 이러한 가능성을 엿본 용자들은 이걸 이용해서 별별 프로그램을 만들어 내기 시작했으며, 아래는 이를 이용해 만든 사례이다.
  • 음악 재생

    음악이 재생되는 부분만 보려면 12분 20초부터 보면 된다.[7]


파일:CC-white.svg 이 문서의 내용 중 전체 또는 일부는 문서의 r209에서 가져왔습니다. 이전 역사 보러 가기
파일:CC-white.svg 이 문서의 내용 중 전체 또는 일부는 다른 문서에서 가져왔습니다.
[ 펼치기 · 접기 ]
문서의 r209 (이전 역사)
문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)
2.1.2.3. 포켓몬스터 금·은
영문판의 동전 케이스 버그(Coin Case Glitch)[9]를 특정 포켓몬[10]의 울음소리를 듣고 난 후 발동하면 글리치 차원(Glitch Dimension)으로 재시작되며, 게임 스프라이트 색이 변경되고 여러 부가효과가 나타난다. 그 외에 같은 효과를 내는 울음소리 프리셋은 이상해씨(0x0F. 해당 프리셋 중에 이상해씨와 피카츄만 가능)의 울음소리를 듣고 발동하면 플레이어의 행동 여하에 따라 다른 버전의 사용되지 않은 필드 데이터나 포켓몬 정보를 불러와 원하는 포켓몬을 얻을 수 있다.

상세 설명
울음소리 프리셋 설명
2.1.2.4. 포켓몬스터 에메랄드

대표적인 방법은 유석열매 버그로 인한 오버플로를 통해 메모리 값 조작하기. 에메랄드에도 이러한 임의 코드 실행을 통해 평범한 방법으로 갈 수 없는 탄생의 섬에서 테오키스를 잡거나 더미 데이터 BGM을 불러오거나, 게임을 실행할 수 있다.


혹은 외부 프로그램을 이용해서 6V 이로치 포켓몬을 잡는 경우도 있다.


파일:CC-white.svg 이 문서의 내용 중 전체 또는 일부는 문서의 r209에서 가져왔습니다. 이전 역사 보러 가기
파일:CC-white.svg 이 문서의 내용 중 전체 또는 일부는 다른 문서에서 가져왔습니다.
[ 펼치기 · 접기 ]
문서의 r209 (이전 역사)
문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)
2.1.2.5. 포켓몬스터 다이아몬드·펄

비틀기 버그를 활용하여 기필코 DS 시절 게임에서 임의 코드 실행을 성공시켰다.

2.1.3. 젤다의 전설 시간의 오카리나


플레이어 이름을 고정하고 포인터를 조작해서 바로 엔딩 크레딧을 가는 것이 가능하다. TAS는 물론 사람 손으로도 가능해 일반 스피드런에서도 쓰인다.

2.1.4. 클래식

주의할 점은, 이 임의 코드 실행 사례는 어떠한 둠 소스 포트를 경유해서 실행한 것이 아닌, 오직 원본 도스 바닐라 둠만 가지고 코드 인젝션한 것이다. 참고로 둠의 비공식 이식 중 상당수가 특정 시스템에서 임의 코드 실행 혹은 그에 준하는 취약점이 발견되었을 때 가장 먼저 해보는 것들 중 하나이다(...).


화면에 뱀 게임 삽입. 화면에만 따로 띄우는 거기 때문에 메뉴 및 스탭, 기본 포함 데모는 스네이크 게임과 관련이 없다.


클래식 바닐라 둠에 임의 코드 실행으로 둠 소스 포트에서나 지원할 법한 효과를 주입. 색깔 있는 광원이라든가, 색깔 있는 몬스터, 투명 사이버데몬, 들어가면 무조건 죽는 포스 필드, 안개 효과 등이 있다.

그리고 이 프로젝트는 ACE II라는 소스포트로 독자화되기에 이른다. 다른 게임의 무기를 구현하는 등 요즘 소스포트선에서 할수있는 것들을 도스 바닐라환경에서 최대한 하게 할수 있는것으로 보인다. 둠월드 스레드, 깃헙 레포지토리,오버뷰 영상

2.1.5. 슈퍼 동키콩


현재 1분 4초대를 유지중이다.

2.1.6. RPG Maker 3 & 드래곤 퀘스트 7


PlayStation 2 실기를 이용하는 방법인데, PlayStationRPG Maker 3의 기능을 이용해 그림을 그린 다음 그걸 PlayStation용 메모리 카드에 저장해 놓고는 역시 PlayStation판 드래곤 퀘스트 VII 에덴의 전사들의 새 세이브 데이터를 동일한 메모리 카드에 저장, 드퀘7의 해당 세이브 데이터를 다시 불러보면 어느 새 최종 보스 앞까지 다다르게 만든 상황이 나오게 된다. 그리고 최종 보스를 쓰러뜨린 대가로 관짝이 되어버린 주인공이 압권.

3. 관련 문서


[1] 플래시뿐만 아니라 모든 에뮬레이터에서 해당되는 사항이다. SNES의 국민 에뮬레이터였던 ZSNES와 N64 국민 에뮬레이터인 Project64의 1.7 이하 버전도 이 문제를 떠안고 있다.[2] 쉽게 예시를 들면, 〈아버지가방에들어가신다〉는 '아버지가 방에 들어가신다'로 상정된 내용이지만, 앞을 잘라내고 〈가방에들어가신다〉부터 읽어버리면 '가방에 들어가신다'로 내용이 바뀌어 버린다.[3] 좀 더 실제와 가까운 예시를 들면 〈ABCDEFGH〉라는 코드는 'AB는 EF와 GH의 합(CD)'이라는 내용인데, 중간부터 읽어 〈BCDEFGHI〉로 읽으면 'BC는 FG와 HI의 곱(DE)'이라는 전혀 다른 결과가 도출된다. CD와 DE 둘 다 원래는 정상적으로 '더해라', '곱해라'를 실행하는 기능인데, 순서가 한 번 밀리자 전혀 다른 기능으로 바뀌는 것이 포인트다. 여기에 원래 코드와 상관 없던 I가 코드 실행에 사용되는 것에서 보이듯 기존 코드 뒤의 다른 메모리를 침범하는 부작용도 일어난다.[4] 반례랍시고 링크된 방법도 임의 코드 실행에 해당한다. SRAM glitch를 이용해 임의 코드를 입력할 수 있는 타이밍을 만들어 내서 엔딩을 불러내는 커맨드를 실행시키는 것이기 때문.[5] 가끔 일부 변태 유저가 수작업으로 이걸 파는 경우가 있지만, 기본적으로 프레임 단위 정확한 입력이 필요한 관계로 TAS보다 효율도 떨어지고 파는 사람도 그렇게 많지 않다.[6] 보통 이것을 'game end glitch'라고 칭한다.[7] 이때 나오는 음악은 My Little Pony: Friendship is Magic의 오프닝 테마이다.[8] 원본 음질이 아니고 게임보이 컬러 사양에 맞게 음질을 열화시킨 것. 자세히 들어보면 노이즈가 껴 있는 것을 알 수 있다.[9] 영문판의 동전 케이스 출력 대사는 정상적인 데이터 끝 표시로 끝나지 않고 최근 들은 포켓몬의 울음소리 데이터 포인터로 끝난다. 따라서 도감에서 포켓몬의 울음소리를 들어 해당 울음소리 정보를 포인터 주소에 저장하고 코인 케이스 출력 대사를 보면 해당 포인터 주소에 있는 정보를 불러오게 된다.[10] 울음소리 프리셋뿐만이 아니라 음 높이, 속도 같은 데이터도 가져오기 때문에 같은 울음소리 프리셋을 쓴다고 전부 같은 효과가 나지는 않는다. 대표적인 버그 프리셋인 0x22 프리셋은 골덕 계열과 모다피 총 3종류가 사용하는데, 골덕은 임의 코드 실행이 불가능하다. 가능한 포켓몬 목록은 링크 참조. 효과에 Glitch dimension이라고 적혀 있는 포켓몬만 유의미한 효과를 볼 수 있다.

분류