mir.pe (일반/어두운 화면)
최근 수정 시각 : 2024-11-03 18:12:22

임의 코드 실행


1. 개요

임의 코드 실행(arbitrary code execution)이란 보안 관련 용어로, 보안 취약점을 이용해 공격자가 원하는 어떠한 코드를 임의로 실행하는 행위 또는 그러한 코드 실행을 가능하게 만드는 치명적인 보안 취약점을 말한다.

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

2. 게임에서

주로 게임 내에서 여러 버그들이 시너지를 일으켜 발생하는 상황으로, 게임 내부 메모리에 플레이어가 원하는 코드를 삽입할 수 있는 상황을 말한다. 버그로 인한 상황이기 때문에 수년간 사람들의 관심을 끌지 못한 버그가 사실 임의 코드 실행이 가능하도록 만드는 요소라는 게 발견되는 경우도 많다.

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

일반적으로 정규 루트를 밟는다면 몇 시간이나 걸려야 볼 수 있는 엔딩을 순식간에 띄우는 유형의 플레이가 많다. 사실상 대부분의 경우 '초고속 엔딩 유도=임의 코드 실행'이라는 공식이 성립한다 봐도 된다. 코드 실행 과정보다 다른 과정이 눈에 띄는 방식의 플레이들이 종종 있지만 결국 본질은 해당 코드를 넣기 위한 틈을 만들기 위해 그러한 삽질을 하는 것.

<How People Reprogram Games...with a CONTROLLER>
어떻게 고전 콘솔게임에서 패드를 통한 임의 코드 실행 코딩이 작동하는지 설명하는 영상이다.

엔딩 보기가 일차적으로 완료되면 이후 해당 현상을 어떻게 써먹을 수 있는지에 대한 연구로 넘어가는데, 특히 TAS 분야 유저들이 이 부분을 많이 연구한다.[4] 심한 경우 엔딩 불러오기가 아니라 아예 게임 속에 간단한 미니게임을 즉석으로 코딩해서 집어넣는다든가 아예 다른 프로그램으로 개조하는 사례도 있다.[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. 포켓몬스터 레드·그린
2.1.2.2. 포켓몬스터 피카츄

파일:CC-white.svg 이 문서의 내용 중 전체 또는 일부는
문서의 r209
, 번 문단
에서 가져왔습니다. 이전 역사 보러 가기
파일:CC-white.svg 이 문서의 내용 중 전체 또는 일부는 다른 문서에서 가져왔습니다.
[ 펼치기 · 접기 ]
문서의 r209 ( 이전 역사)
문서의 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 ( 이전 역사)
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 실기를 이용하는 방법인데, PlayStation RPG 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] 가끔 일부 변태 유저가 수작업으로 이걸 파는 경우가 있지만, 기본적으로 프레임 단위 정확한 입력이 필요한 관계로 TAS보다 효율도 떨어지고 파는 사람도 그렇게 많지 않다. [5] 대부분 고전 콘솔게임 내부에서 실기로 코딩하는데, '아니 그러면 게임패드로 어떻게 코딩을 한다는거지?' 싶은데 슈퍼 패미컴의 입력부는 16개뿐인데 뭔가 브레인퍽처럼 극히 제한된 명령어 기능으로 코딩하는게 연상되기도 한다. 브레인퍽의 명령어 종류가 8(+1)개인데 정확히 그 2배다 방법론적으로 보면 난해한 프로그래밍 언어스럽기도 하다. 그 비밀 중 하나는 바로 위의 영상에서 언급된것 처럼 멀티탭 주변기기로 게임패드를 2개뿐 아닌 여러대로 연결해서 한계는 있지만 그런대로 명령을 내릴 수준까지 입력 시퀀스를 확장한다는듯 하다. 이외에도 패미컴 로봇(R.O.B.)과 라즈베리 파이의 힘을 빌리기도 한다. [6] 보통 이것을 'game end glitch'라고 칭한다. [7] 이때 나오는 음악은 My Little Pony: Friendship is Magic의 오프닝 테마이다. [8] 원본 음질이 아니고 게임보이 컬러 사양에 맞게 음질을 열화시킨 것. 자세히 들어보면 노이즈가 껴 있는 것을 알 수 있다. [9] 영문판의 동전 케이스 출력 대사는 정상적인 데이터 끝 표시로 끝나지 않고 최근 들은 포켓몬의 울음소리 데이터 포인터로 끝난다. 따라서 도감에서 포켓몬의 울음소리를 들어 해당 울음소리 정보를 포인터 주소에 저장하고 코인 케이스 출력 대사를 보면 해당 포인터 주소에 있는 정보를 불러오게 된다. [10] 울음소리 프리셋뿐만이 아니라 음 높이, 속도 같은 데이터도 가져오기 때문에 같은 울음소리 프리셋을 쓴다고 전부 같은 효과가 나지는 않는다. 대표적인 버그 프리셋인 0x22 프리셋은 골덕 계열과 모다피 총 3종류가 사용하는데, 골덕은 임의 코드 실행이 불가능하다. 가능한 포켓몬 목록은 링크 참조. 효과에 Glitch dimension이라고 적혀 있는 포켓몬만 유의미한 효과를 볼 수 있다.

분류