- Create-A-Park 저장 파일의 gap name 처리에 있던
strcpy버퍼 오버플로가 original Xbox, Xbox 360, PS2, GameCube 등 여러 플랫폼의 저장 파일·네트워크 익스플로잇으로 이어짐 - THPS4 original Xbox 버전은 31자 제한 문자열을 경계 검사 없이 32바이트 스택 버퍼로 복사해 return address를 덮을 수 있었고, 저장 파일 헤더와 실행 가능한 데이터 세그먼트를 이용해 셸코드를 실행함
- THPS3는 같은 입력이 스택이 아니라 힙을 손상시켜 커스텀 allocator와 vtable 경로를 거친 ROP 체인이 필요했고, THUG 1·2 Xbox 버전은 stack cookie 때문에 gap name 경로가 막힘
- THPS4 멀티플레이에서는 악성 호스트가 park 파일을 클라이언트에 보내 원격 코드 실행과 비동기 파일 전송을 수행했고, 전송 중 드러난 네트워크 메모리 누수는 익스플로잇 안에서 hot patch로 우회함
- Xbox 360의 Tony Hawk’s American Wasteland도 gap name 오버플로로 ROP 실행이 가능하지만, full hypervisor 코드 실행은 4548 kernel의 system call handler 버그와 결합될 때만 가능하며 소스와 패치된 저장 파일이 GitHub에 공개됨
시작점: gap name과 strcpy
- 2016년 original Xbox용 새 저장 파일 해킹 버그를 찾던 과정에서 Tony Hawk’s Pro Skater 4의 custom park 저장 파일이 분석 대상이 됨
- THPS4의 Create-A-Park 기능은 플레이어가 직접 skate park를 만들고, 점프 구간인 gap에 이름을 붙일 수 있게 함
- gap name은 최대 31자와 null terminator로 구성되는 사용자 지정 문자열임
- 이 문자열이
strcpy같은 함수로 처리되면 메모리 손상 primitive가 될 수 있음
- gap name을 긴
0x41반복 문자열로 바꾼 악성 저장 파일을 Xbox에 복사해 로드하자 콘솔이 크래시했고, instruction pointer가0x41414141로 설정됨- gap name이 스택으로 복사되며 return address까지 덮였다는 신호임
- IDA 분석 결과, 저장 파일의 gap 목록을 순회하면서
save_file_gap_data의gap_name을 스택의gap_description gapDesc에strcpy로 복사하고 있었음- 경계 검사가 없어 null terminator를 만날 때까지 복사가 계속됨
- 해당 게임 버전은 stack cookie 없이 컴파일돼 스택 데이터와 return address를 덮을 수 있음
original Xbox THPS4: 실행 가능한 영역으로 셸코드 옮기기
- original Xbox에는 최신 장치처럼 임의 데이터 실행을 막는 하드웨어 DEP가 없지만, 후반 커널과 게임에는 일부 soft DEP가 존재함
- 코드 세그먼트 selector 주소를 바꿔 특정 주소 이하만 실행 가능하게 만드는 방식임
- 스택과 저장 파일이 들어 있는 힙 할당은 실행 가능 영역 밖에 있음
- 게임 실행 파일의 read-write 데이터 세그먼트는 실행 가능 영역 안에 있어, 코드를 그곳으로 복사한 뒤 실행하는 전략이 사용됨
- park 이름은 저장 파일 헤더에 있으며, 플레이어가 저장 파일을 선택하면 UI 표시를 위해 헤더의 첫 136바이트가 실행 파일 데이터 세그먼트의 struct로 복사됨
- 헤더 전체를 마음대로 바꿀 수는 없지만 작은
memcpy스텁을 넣을 공간은 충분함
- 헤더 전체를 마음대로 바꿀 수는 없지만 작은
- THPS4 original Xbox 익스플로잇 흐름
- 저장 파일 로드 후 “Start Game”을 누르기 전, 첫 136바이트가 실행 파일 데이터 세그먼트로 복사됨
- “Start Game”을 누르면 악성 gap name이 스택으로 복사되고 return address가 셸코드 복사 스텁 주소로 덮임
- 함수 반환 시 복사 스텁으로 점프해 저장 파일 버퍼의 큰 payload를 실행 가능한 데이터 세그먼트로 복사함
- 복사 후 payload로 점프해 임의 코드 실행을 얻음
서명 우회와 habibi key
- original Xbox에서 코드 실행을 얻은 뒤에는 서명 검사를 비활성화하고 unsigned executable을 실행해야 함
- payload는 기존 007 Agent Under Fire softmod installer 저장 파일의 payload를 기반으로 구성됨
- 커널 함수와 데이터 주소를 찾고, 실행 파일 서명 검증에 쓰이는 RSA public key 주소를 찾음
- machine state register의 write protection을 비활성화하고 RSA public key를 habibi key로 패치함
- 저장 파일에 포함된 보조 실행 파일을 실행하며, 테스트 중에는
nyan cat실행 파일이 사용됨
- habibi key pair는 2000년대 초 original Xbox Linux hacking group이 만든 것으로 추정되는 RSA 키임
- 커널의 RSA 서명 검사 자체를 무조건 통과시키는 대신 public key를 자신들의 키로 바꿔 Linux loader를 실행하는 방식이었음
- 해당 저장 파일로 pirated content 실행을 막으려는 선택이었지만, 이후 다른 그룹들이 persistent hack 설치용 exploit 파일을 공개함
- habibi public key modulus는 Microsoft RSA public key와 4바이트 차이만 난다는 점이 특이함
- exponent가 3으로 바뀌어야 할 것 같지만 기존 shell code payload들은 exponent를 바꾸지 않음
- 정확히 어떻게 동작하는지는 확실하지 않음
- habibi key 방식은 여러 Xbox kernel 버전과의 호환성 때문에 선택됨
- 서명 검증 함수를 항상 true로 패치하려면 kernel 버전별 instruction pattern 매칭이 필요함
- habibi key는 쉽게 찾을 수 있는 메모리에 4바이트 patch만 하면 됨
변종 분석: THPS3, THUG, THAW
-
Tony Hawk’s Pro Skater 3
- THPS3에도 Create-A-Park와 gap name이 있었지만, 악성 저장 파일 로드 직후에는 크래시하지 않음
- 게임 안에서 skate는 가능했고, “quit game”을 선택할 때 콘솔이 크래시함
- gap name은 스택이 아니라 힙으로 복사됐고, 오버플로가 다음 힙 할당의 allocation header를 덮음
- 다음 allocation이 free될 때 header의 pointer들이 cleanup routine function pointer가 있는 vtable로 이어짐
- THPS3는 THPS4처럼 저장 파일 헤더를 실행 가능한 데이터 세그먼트로 복사하지 않았고, 저장 파일 데이터도 실행 불가능한 힙 메모리에 있었음
pAllocOwnerpointer를 덮어 cleanup function pointer 로드 위치를 제어하고, stack pivot으로 저장 파일 메모리의 ROP chain을 사용함- ROP chain은 몇 개 gadget만으로 힙의 셸코드를 실행 가능한 데이터 세그먼트로 복사하고 그곳으로 점프함
- 이후 THPS4용 generic “hack xbox kernel” payload와 마찬가지로 habibi key 패치와 unsigned executable 실행을 수행함
-
Tony Hawk’s Underground 1 & 2
- THUG에서 gap name을 fuzzing하자 access violation 대신
Buffer overrun detected!메시지와 함께 full bug check가 발생함 - 실행 파일에는 stack cookie check가 존재함
- stack cookie는 return address 앞에 놓이는 무작위 값이며, 함수 반환 전 값이 바뀌었는지 확인함
- return address를 덮으려면 cookie 값을 알아야 하지만 gap name 경로에서는 이를 leak할 방법이 없음
- gap name buffer 뒤와 stack cookie 앞에 손상 가능한 변수들이 있었지만, 곧바로 게임 코드에 의해 덮여 익스플로잇에 유용하지 않았음
- SEH exploitation도 검토됐지만 stack cookie check 전 남은 코드에서 예외를 유발할 방법이 없고, 해당 시점에 SEH chain을 걷는 exception handler도 등록돼 있지 않음
- THUG2도 Xbox 버전에서는 같은 이유로 gap name 기반 익스플로잇이 불가능함
- 다만 다른
strcpy버그와 힙 기반으로 익스플로잇 가능한 버그가 존재함 - PlayStation 2, PC, 그리고 아마 GameCube 버전은 stack cookie 없이 컴파일돼 gap name buffer로 익스플로잇 가능함
- THUG에서 gap name을 fuzzing하자 access violation 대신
-
Tony Hawk’s American Wasteland
- THAW는 THUG 1·2 이후 게임이라 stack cookie가 있을 것으로 예상됐지만, Xbox 버전은 stack cookie 없이 컴파일됨
- gap name buffer overflow에 취약했고, 익스플로잇은 THPS4와 거의 동일하게 구성됨
THPS4 네트워크 RCE: 저장 파일 없이 클라이언트 해킹
- 저장 파일 exploit은 메모리카드가 필요했기 때문에, 더 낮은 진입 장벽의 공격면으로 멀티플레이어 LAN 게임이 선택됨
- Create-A-Park로 만든 park를 LAN multiplayer에서 사용하면 host가 저장 파일을 네트워크로 보내고 client가 로드함
- 악성 park 파일을 보내 client console을 해킹할 수 있다는 가정이 세워짐
- host가 자기 자신을 해킹하지 않도록 게임 실행 파일을 수정해
strcpy버그를 막고, 추가 함수용 code segment도 추가함 - 처음에는 client가 host에 접속해 정상적으로 skate할 수 있었지만 payload가 실행되지 않았고, buffer overflow도 트리거되지 않음
- client 메모리의 park file 데이터가 exploit 파일과 다르게 변형돼 있었음
- host가 park file을 로드한 뒤 메모리에서 다시 저장하고 그 결과를 client에 보내면서 exploit 데이터가 망가짐
- 해당 function call을 NOP 처리하자 client가 악성 park file을 받고 compromise되어 LED 색이 바뀜
- 네트워크 경로에서는 저장 파일 헤더가 데이터 세그먼트로 복사되지 않으므로 THPS4 로컬 exploit의 셸코드 복사 스텁을 사용할 수 없음
- THPS3와 유사한 ROP chain으로 셸코드를 실행 가능한 메모리로 복사함
THUG 소스 코드 발견과 네트워크 코드 활용
- 네트워크로 보조 payload executable을 client에 전달해야 했지만, 로컬 저장 파일 exploit처럼 save game folder에 파일을 함께 넣을 수 없었음
- burned CD나 로컬 네트워크 주소에서 executable을 로드하는 방법도 검토됐지만 채택되지 않음
- Xbox winsock implementation은 기본적으로 secure socket connection을 사용해 Python script로 Xbox security layer를 재현해야 했음
- park save file 관련 자료를 찾던 중
Sk4Ed_Dead문자열 검색으로 GitHub의thug저장소를 발견함- homebrew tool이 아니라 Tony Hawk’s Underground 전체 게임 소스 코드로 파악됨
- THPS4 자체는 아니지만 코드베이스가 충분히 유사해 networking code와 hook 작성에 활용됨
- 소스 코드에는 park file loading code와
strcpy버그가 있는 정확한 line이 있었음- Visual Studio project file을 재구성하고 몇 가지 compiler error를 고쳐 final game asset으로 실행 가능한 빌드를 만들 수 있었음
- 최종 버전과 완전히 같지는 않지만 매우 가까운 코드로 보임
- 목표는 단순 RCE를 넘어, match에 접속한 console에서 조용히 RCE를 얻고 unsigned code 실행을 가능하게 한 뒤 게임 중에 보조 executable을 전송하는 방식으로 바뀜
실행 복구와 비동기 파일 전송
- client가 게임을 계속 플레이하는 동안 payload 전송을 진행하려면 shell code 실행 후 게임 실행 흐름 복구가 필요함
- ROP chain은 stack pivot 전에 기존 stack pointer를 저장하고, shell code 실행 후 나중에 복원하도록 변경됨
- 이후 shell code를 실행 가능한 메모리로 복사하고 점프함
- 게임의 networking system은 message ID와 handler function을 등록하고, 수신 메시지의 ID에 맞는 handler를 호출하는 구조임
- 사용되지 않는 message ID를 등록해 간단한 파일 전송 프로토콜을 구현함
- client가 접속하면
MSG_ID_PAYLOAD_REQUEST를 host에 보내 전송을 시작함 - host는
MSG_ID_PAYLOAD_DATA메시지로 payload 데이터를 보냄 - client가
PAYLOAD_MSG_ID_END를 받으면 전송이 완료됨
- client가 접속하면
15년 된 메모리 누수와 hot patch
- 파일 전송 중 client console이 null pointer dereference로 크래시함
- network data allocator가 NULL을 반환했고, networking memory pool의 free byte가 0이 됨
- THUG 소스 코드에는 message data buffer가 free되는 코드가 있었지만, THPS4 shipped build에는 해당 수정이 없었음
stream_desc의p_databuffer가 메시지마다 해제되지 않아 networking memory pool이 소진됨- 일반적인 multiplayer play에서는 오래 머물지 않는 한 문제가 되지 않았을 수 있음
- 익스플로잇은 client code를 hook해
p_desc->p_databuffer를 올바른 free function으로 해제하도록 hot patch함 - hot patch 후 host와 client console에서 파일 전송이 성공했고, client는
nyan-catexecutable을 실행함- tunneling app을 사용해 다른 지역의 친구 console에도 원격으로 같은 exploit을 테스트함
최종 original Xbox 네트워크 exploit 흐름
- client가 악성 host console에 접속하고 네트워크로 “Hack Xbox” park file을 받음
- client가 park file을 parse하면서 buffer overflow가 발생하고, 스택의 return address가 덮여 ROP chain이 시작됨
- ROP chain은 full shell code payload를 실행 가능한 메모리 영역으로 복사하고 점프함
- shell code는 게임 실행으로 돌아가기 전에 필요한 hook과 patch를 설정하고 player를 match에 spawn시킴
- player가 게임 안에서 skate하는 동안 host가 executable file을 client로 보내고, client HDD에 저장함
- 파일 전송 완료 후 shell code가 client kernel을 habibi key 사용 상태로 패치하고 전송된 secondary executable을 boot함
- LED 색을 바꾸지 않으면 사용자는 다른 application이 갑자기 boot되기 전까지 진행 상황을 알아차리기 어려움
Xbox 360: THAW와 4548 kernel
- Xbox 360용 Tony Hawk’s American Wasteland도 gap name buffer overflow에 취약함
- 목표는 새로운 kernel version에서 console을 exploit하는 것이었지만, 새로운 hypervisor bug 없이는 불가능했음
- 대신 THAW의
strcpy버그와 기존 4548 kernel system call handler bug를 결합해 Xbox 360의 첫 software-only exploit을 만들 수 있었음 - Xbox 360의 기존 King Kong hack은 modified shader file을 사용해 kernel memory에 arbitrary write를 수행하고 system call handler bug를 exploit했음
- 이 방식은 modified King Kong disc를 사용하기 위해 console을 열고 DVD drive firmware를 수정해야 했음
- game save bug는 ROP chain을 시작하는 다른 entry point가 될 수 있음
Xbox 360 저장 파일 서명과 개발 콘솔의 역할
- Xbox 360 game save file은 console마다 고유한 RSA key pair로 서명됨
- 각 console의 key store에는 game save 서명에 쓰이는 cryptographic key가 있음
- 다른 console에서 저장 파일을 검증할 수 있는 이유는 RSA public key가 save file header에 포함돼 있기 때문임
- 이 public key 자체는 Microsoft만 가진 다른 RSA key pair로 서명됨
- 아무 public key나 header에 넣어 통과시킬 수는 없음
- 임의로 수정한 save file을 다른 console에서 쓰려면 어느 한 Xbox 360 console의 decrypted key store가 필요함
- Xbox 360 hacking의 출발점은 development console과 SDK 유출이었음
- 실행 코드가 암호화돼 있었기 때문에, 외부에서 code를 inspect하지 못하면 bug를 찾을 수 없었음
- development console과 SDK는 executable code decrypt와 boot chain, hypervisor, game code reverse engineering에 필요한 정보를 제공함
4548 system call handler bug
- Xbox 360에는 hypervisor real mode와 kernel mode가 있음
- hypervisor real mode는 가장 privileged mode임
- kernel mode에서는 OS와 game이 실행됨
- CPU에는 L2 cache 옆에 memory encryption과 hashing을 담당하는 cryptography unit이 있음
- kernel mode에서는 hypervisor page가 encrypted + hashed 상태로 보이며, 임의로 덮으면 hypervisor 접근 시 console이 halt됨
- real mode에서는 64-bit physical address의 상위 32비트가 encryption과 hashing 제어에 사용됨
0x80000000.00000000mask를 적용하면 encryption과 hashing을 무시한 memory access가 가능함- kernel mode가 hypervisor에 physical address를 제공할 수 있는 곳에서는 상위 32비트를 반드시 clear해야 함
- 정상 system call handler는
slwi명령으로 system call ordinal을 왼쪽으로 2비트 shift하고, 결과의 상위 32비트를 버려 32-bit offset만 사용함 - 4548 kernel의 system call handler는
slwi대신sldi를 사용함sldi는 64-bit로 동작하므로 r0의 상위 32비트도 table index offset 계산에 반영됨- ordinal range check는 r0의 하위 32비트에만 적용됨
- 예를 들어
0x20000000.0000003F는 range check를 통과하면서0x80000000.000000FCoffset을 만들어 unprotected memory access를 유도할 수 있음
- 이 변화는 developer의 의도적 수정이라기보다 compiler bug였을 가능성이 높다고 평가됨
Xbox 360 exploit 구성
- kernel mode에서 encrypted hypervisor memory view를 덮으면 보통 console이 halt되지만, system call handler가 상위 protection bit가 설정된 주소로 function pointer를 읽게 만들면 fault 없이 덮은 값을 읽을 수 있음
- exploit 단계
- shell code를 memory에 load하고 physical address를 얻음
- kernel memory manager variable을 바꿔 encrypted hypervisor memory view를 write 가능한 address range로 노출함
- hypervisor system call function pointer를
mtctr r4; bctrinstruction sequence 주소로 덮음 - r0에 악성 ordinal을 넣고, r4에는 shell code physical address에
0x80000000.00000000mask를 OR한 값을 넣음 - system call instruction을 실행해 hypervisor가 덮은 function pointer를 읽고
mtctr r4; bctr를 통해 shell code로 점프하게 함
- THAW 저장 파일 exploit은 PowerPC ROP chain을 사용함
- Ida-Sploiter IDA plugin을 수정해 PowerPC gadget 검색을 지원하게 함
- 전체 exploit은 24개 ROP gadget으로 구성됨
- THAW Xbox 360 전체 흐름
- gap name buffer overflow로 return address를 첫 ROP gadget으로 덮음
- stack pointer를 save buffer 안의 ROP chain으로 pivot함
MmAllocatePhysicalMemoryEx로 hypervisor shell code용 physical memory를 할당함memcpy로 shell code를 복사하고MmGetPhysicalAddress로 physical address를 얻음- encrypted hypervisor memory view를 write 가능하게 mapping함
- system call function address를
mtctr r4; bctrsequence로 덮음 - malicious system call ordinal과 shell code physical address로
syscall을 실행함 - hypervisor code execution을 얻은 뒤 LED color를 바꾸고 executable RSA signature check를 패치함
- kernel mode ROP chain으로 돌아와
ObCreateSymbolicLink로 HDD folder를 mapping하고XLaunchNewImage로 unsigned secondary payload를 실행함
- 이 방식은 어떤 Xbox 360 OS version에서도 THAW의
strcpy버그로 ROP 실행을 얻을 수 있지만, full hypervisor code execution은 4548 kernel에서만 가능함- 새로운 hypervisor bug가 발견되면 이 entry point와 결합해 더 최신 kernel version에도 적용할 수 있음
2024년 공개와 추가 플랫폼 포팅
- 2024년에 Tony Hawk exploit들이 정리돼 공개됨
- 같은
strcpybug는 Tony Hawk 시리즈의 5개 iteration과 여러 console·handheld platform에 존재함 -
PlayStation 2
- THPS4 네트워크 RCE exploit이 PlayStation 2 버전으로 포팅됨
- PCSX2나 다른 console을 사용하고 THPS4 disc만 있으면 network를 통해 console을 hack할 수 있음
- exploit은 network로 uLaunchElf를 전송하고, 전송 완료 시 실행함
- 이후 USB stick 같은 다른 media에서 FreeMcBoot 또는 FreeHDBoot installer를 로드할 수 있음
- PS2 save game exploit은 유용성이 낮음
- memory card에 파일을 복사할 방법이 있다면 바로 FreeMcBoot을 설치하면 됨
- FreeMcBoot memory card를 Amazon에서 15달러에 구매하거나, phat console과 network adapter에서 FreeHDBoot을 사용할 수 있음
-
GameCube
- THPS4 save game exploit이 GameCube 버전으로 포팅됨
- network RCE나 다른 save game exploit 버전은 포팅되지 않음
- GameCube memory card에 파일을 복사하는 일은 간단하지 않고, pre-hacked save file이 든 memory card가 eBay에서 50달러 이상에 팔려 왔음
- GameCube 버전의 Tony Hawk game에는 network support가 없어 network adapter가 있어도 network exploit을 사용할 수 없음
- 이미 여러 game save exploit이 있고 persistent software hack이 없기 때문에, 많은 사용자가 modchip을 선택함
-
Windows
- THUG PRO용 game save exploit도 만들어졌고, 7년 전에 bug report가 전달됐지만 당시에는 수정에 관심이 없었음
- Windows에서 exploit이 제공하는 가치가 없어 공개하지 않음
- PC용 Tony Hawk game들은 같은
strcpybug가 있고 exploitable함 - network play에서 exploit 가능한 다른
strcpybug도 있음 - ASLR을 강제로 적용하고 Administrator로 실행하지 말 것을 권장함
공개 자료
- 전체 source code와 patched game save files는 GitHub에 공개됨
- 하나의
strcpybug가 여러 플랫폼에서 저장 파일 exploit, network RCE, Xbox 360 software-only exploit entry point로 이어짐