1P by GN⁺ | ★ favorite | 댓글 1개
  • 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_datagap_name을 스택의 gap_description gapDescstrcpy로 복사하고 있었음
    • 경계 검사가 없어 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처럼 저장 파일 헤더를 실행 가능한 데이터 세그먼트로 복사하지 않았고, 저장 파일 데이터도 실행 불가능한 힙 메모리에 있었음
    • pAllocOwner pointer를 덮어 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로 익스플로잇 가능함
  • 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를 받으면 전송이 완료됨

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_descp_data buffer가 메시지마다 해제되지 않아 networking memory pool이 소진됨
    • 일반적인 multiplayer play에서는 오래 머물지 않는 한 문제가 되지 않았을 수 있음
  • 익스플로잇은 client code를 hook해 p_desc->p_data buffer를 올바른 free function으로 해제하도록 hot patch함
  • hot patch 후 host와 client console에서 파일 전송이 성공했고, client는 nyan-cat executable을 실행함
    • 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.00000000 mask를 적용하면 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.000000FC offset을 만들어 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; bctr instruction sequence 주소로 덮음
    • r0에 악성 ordinal을 넣고, r4에는 shell code physical address에 0x80000000.00000000 mask를 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; bctr sequence로 덮음
    • 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들이 정리돼 공개됨
  • 같은 strcpy bug는 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들은 같은 strcpy bug가 있고 exploitable함
    • network play에서 exploit 가능한 다른 strcpy bug도 있음
    • ASLR을 강제로 적용하고 Administrator로 실행하지 말 것을 권장함

공개 자료

  • 전체 source code와 patched game save files는 GitHub에 공개됨
  • 하나의 strcpy bug가 여러 플랫폼에서 저장 파일 exploit, network RCE, Xbox 360 software-only exploit entry point로 이어짐

댓글과 토론

Hacker News 의견들
  • Habibi 키에서 더 흥미로운 점은 공개키 모듈러스가 Microsoft RSA 공개키와 4바이트만 다르다는 것임
    무작위 2048비트 정수는 사소하게 인수분해될 가능성이 꽤 있고, 실제 확률은 모르지만 대략 2^-32 수준이라고 추정할 수 있음
    아마 공개 모듈러스의 4바이트를 무작위로 바꾸거나 증가시키고, 1밀리초 정도 인수분해를 시도하다가 성공하면 멈추는 식의 코드를 썼을 듯함
    결과 공개 모듈러스에는 작은 인수가 많이 있을 가능성이 높고, RSA 모듈러스는 보통 정확히 두 소수의 곱이지만 e와 서로소이기만 하면 인수가 더 많아도 수학은 여전히 동작함

    • 무작위 2048비트 정수에서 시작해 하위 바이트를 바꿔 3으로 나누어떨어지게 만들면 됨. 공개키만 다루기 때문에 쉽고, 공개키가 3으로 나누어떨어지면 페르마의 소정리를 이용해 가능한 개인키 후보를 대부분 건너뛸 수 있어 필요한 계산량이 몇 자릿수 줄어듦
      운이 좋게 RSA 구현이 정확히 두 소인수만 쓰는 방식이면, 이미 한 인수가 3이라는 걸 알기 때문에 공개키를 3으로 나눠 다른 소인수를 얻으면 됨
      Wikipedia 기준으로 RSA 공개키 구조는 N이 큰 반소수이고 e가 φ(N)과 서로소여야 하며, N을 인수분해한 사람은 개인키를 얻을 수 있음. Xbox 해킹 맥락에서는 N을 소수 3으로 나누어떨어지게 만들면 다른 소수는 N/3이므로 인수분해에 성공한 셈임
      Habibi 키로 서명하는 코드는 https://github.com/XboxDev/xbedump/blob/b8cd5cd0f8b1cbc4e64f...에 있음. 마지막 4바이트를 0x89, 0x9c, 0x90, 0x6b로 바꾼 뒤 3으로 나누고, 그 값으로 적절한 개인키를 생성함
    • 내가 공동 저자로 쓴 논문이 이 문제를 다룸. 손상된 실제 공개키, 여기서도 2048비트였던 키에 대응하는 개인키를 생성할 수 있는가가 주제였음
      응용은 rowhammer로 공개키를 손상시킨 뒤, 그 인수분해를 이용해 새 대응 개인키를 만드는 방식임. SSH와 GPG 키에서 동작했고, 실용성을 위해 키가 들어 있는 페이지 내용을 안다는 등의 가정을 둠
      사용 가능한 계산 시간에 따른 경험적 성공률은 Figure 7에 있고, 해석적 처리는 3장, 실제 방법 설명은 4.4장에 있음
      https://www.usenix.org/system/files/conference/usenixsecurit...
    • 2^-32보다 확률이 훨씬, 훨씬, 훨씬 큼. 작은 소수들로 나눌 수 있는 만큼 계속 나눈 뒤 남은 값에 Miller–Rabin 같은 빠른 소수 판정을 돌리는 식이면 됨
      예를 들어 2부터 499까지의 소수로 나눠 보고, 값이 1이 되면 성공, 아니면 Miller–Rabin을 20회 돌리는 코드로 무작위 2048비트 정수를 완전히 인수분해하는 데 내 환경에서는 약 100번 정도면 됐음
    • 중국인의 나머지 정리 구현은 중복 인수가 있으면 실패함
  • 이 성과가 얼마나 말도 안 되는지 표현하기 어려울 정도임
    Xbox 360을 Tony Hawk 게임의 공원 이름으로 소프트모드하고, 24단계 ROP 체인까지 쓴다는 점이 대단함
    하이퍼바이저에 대한 짧은 애도, 간결하고 실용적인 분석, 곧바로 떠올린 x360 봇넷까지 합쳐져 역대급 Xbox 360 향수 직격탄처럼 느껴짐

  • “운이 좋으면 strcpy일 것”이라는 대목이 재밌음. 원래는 strncpy였어야 할 텐데, 안전 장비 옹호로 유명한 Tony Hawk라면 더 안전한 문자열 복사와 엮이길 원했을 듯함

    • 올바른 방법은 memcpy를 쓰고 대상 버퍼와 원본 버퍼의 크기를 모두 아는 것임
      원본이 대상에 들어가지 않으면 잘라내도 되는지, 전체 작업을 중단해야 하는지, 대상 버퍼를 다시 할당해야 하는지처럼 애플리케이션별 처리가 필요함. strncpy는 거의 항상 잘못된 일을 함
    • strncpy는 더 안전하지 않음. n에 도달하면 종료되지 않은 문자열을 만들기 때문임
      기본적으로 strncpy는 거의 쓰면 안 되고, struct dirent { unsigned short inode; char name[14]; }; 같은 고정 크기 필드용임
      그런 경우에도 패딩 바이트는 nul보다 공백이어야 할 때가 더 많고, strncpy는 표준 라이브러리에 들어가지 말았어야 함
    • Windows C/C++ 개발이라면 strsafe.h 함수들을 쓸 수 있음 (https://learn.microsoft.com/en-us/windows/win32/api/strsafe/)
      C/C++를 쓸 때 표준 C 함수보다 쓰기 쉬웠는데, 버퍼가 너무 작거나 정수 오버플로가 나는 흔한 실패 사례를 처리해 줬고, 모든 함수가 실패 코드를 반환해서 오류 확인도 쉬웠음
      이 경우에는 strcpy보다 StringCchCopyW()StringCbCopyW()가 더 나은 선택임
    • Tony Hawk가 예전에 차를 몰고 다니다가 스케이트보더를 보면 “올리 해 봐”라고 외치고, 성공하면 새 헬멧을 줬다고 읽은 적 있음
  • 이 익스플로잇이 THUG PRO에도 적용된다는 건 좀 아쉬움
    Tony Hawk 시리즈의 경쟁 장면은 THPS1+2 리메이크라는 잠깐의 예외를 빼면 거의 20년째 죽어 있었고, 이 모드는 지금도 플레이됨
    모드 자체도 이제 10년이 넘었고 원래 개발자들은 떠난 듯해서, Ryan이 보고했을 때 아무도 고치려 하지 않았던 이유가 설명됨. 하지만 이제 이 모드는 PC 전체 권한 탈취 위험 때문에 쓰기 어려워짐
    이 글이 모드를 패치할 의지가 있는 사람에게 닿았으면 좋겠음

    • 시간이 있었다면 해 보고 싶을 만큼 재밌었을 듯함. 예전에 시간이 있었을 때는 THUG1 소스 코드를 Windows에서 거의 플레이 가능하게 만든 적도 있음
      그 소스는 콘솔 버전용뿐이었고, Windows로 컴파일한다는 가정은 Xbox Windows가 아니라 도구용이라는 뜻이라서 많은 부분이 완전히 다르게 동작했음
  • “So what's the habibi key?”라는 텍스트 앞의 섹션 헤더 아이콘처럼 보이는 것은 사실 클릭해서 펼치는 HTML details 구역이므로, 관심 있으면 눌러 봐야 함
    궁금한 점은, Habibi 키가 Linux 콘솔 그룹에서 해적판 콘텐츠 사용을 막기 위해 독점적으로 쓰였다는 이야기가 맞다면 대응하는 개인키가 어디서, 언제, 어떻게 공개되거나 유출됐느냐는 것임
    글쓴이는 Microsoft 키와 Habibi 키의 4바이트 차이를 패치해 “서명되지 않은” 실행 파일, 실제로는 Habibi 개인키로 서명된 실행 파일을 실행했으니 개인키를 손에 넣은 게 분명해 보임

    • Habibi 키는 Microsoft 키를 3으로 나누어떨어지게 패치해 생성하므로 실제로 인수분해가 매우 쉬움
      개인키는 공개키에서 사소하게 복구할 수 있어서 공개되거나 유출될 것도 딱히 없었음
      기본적으로 원래 007: Agent Under Fire 저장 파일 해킹 안에 묻혀 있던 작은 암호학 CTF였고, 그 저장 파일 해킹 자체도 꽤 난독화된 CTF에 가까웠음. 해적판 이용자에게 엿을 먹이려는 의도와 다른 리버스 엔지니어들을 향한 도전이 둘 다 있었던 것 같음
  • 정말 멋짐. PSX 디컴파일을 조금 해 왔는데, 거기에도 비슷한 것들이 많음
    흥미롭게도 memmove 같은 건 SDK 라이브러리[0]로 링크되지만, strcpy는 BIOS가 제공하는 함수임
    이후 SDK 버전에서는 이를 라이브러리 버전으로 패치할 수 있었지만, 1997년까지도 그렇게 되어 있지 않았음
    0 - https://github.com/Xeeynamo/sotn-decomp/blob/master/src/main...

    • 예전 콘솔 게임들을 C+SDL2와 OpenGL 2.1로 재구현한 버전을 보고 싶음
      이제 N64 게임들이 디컴파일러를 통해 PC로 포팅되고 있으니 기대하게 됨
      “이 게임들엔 원래 PC판이 있잖아”라는 반응이 나올 수 있지만, N64 게임을 재컴파일하고 효과를 셰이더 대신 순수 텍스처나 더 단순한 효과로 바꾸면 2009년 저가 넷북 같은 느린 기기에서도 거의 어디서나 돌릴 수 있음
      Super Mario 64를 3DFX API로 포팅한 사례도 있음. N64 프레임버퍼에 복잡하게 접근하는 게임은 그 마이크로코드를 흉내 내려면 OpenGL 3.3이 필요하겠지만, 엔진이 Pentium III 이후 장비에서는 매우 빠르게 도는 상황이라면 나머지는 GL 2.1 가속으로 돌리고 일부만 소프트웨어로 흉내 내는 것도 어렵지 않음
  • 이런 종류의 익스플로잇 분석을 여러 형태로 많이 읽어 왔고, 앞으로 100개를 더 읽게 된다면 더 기쁠 것 같음

  • 콘솔 개발에서 잘못된 보안 사고방식을 보여 주는 좋은 예처럼 보임
    “저장 데이터는 우리만 쓸 수 있으니, 우리가 쓴 것만 파싱하면 된다”는 생각은 콘솔 쪽에서 흔하지만, 인위적으로 만든 저장 데이터를 사람들이 준비할 수 있다는 점에서 근본적으로 틀렸음
    이와 별개로 콘솔이 사용자를 적으로 취급해선 안 되지만, 어쨌든 그렇게 한다면 게임도 그 입장에 맞는 보안 사고방식을 가져야 함

    • 지금은 어느 정도 현실이 됐음. 현재 콘솔들은 모두 저장 파일을 암호화하고 서명해 계정에 묶고, 대부분은 Xbox는 모르겠지만 저장 파일을 콘솔과 유료 클라우드 저장소 외에는 복사하지 못하게 함
    • 일반 컴퓨터라면 “콘솔이 사용자를 적으로 취급해선 안 된다”는 말에 100% 동의하겠지만, 콘솔은 조금 다르게 느껴짐
      사용자가 할 수 있는 일을 제한하지 않으면 온라인 게임 부정행위를 어떻게 막을 수 있을지 모르겠음
  • Tony Hawk를 변호하자면, 그는 프로 스케이터이지 보안 분석가가 아님
    90년대 말과 2000년대 초에 키보드 앞에서 보낸 제한된 시간은 버퍼 오버런을 감사하는 데가 아니라, 곧 상징적 시리즈가 될 게임에서 900 McTwist가 자연스럽게 느껴지도록 만드는 데 쓰였을 것임

  • 어릴 때 들었던 전설을 확인할 기회가 생겼음. 720을 처음 성공한 사람이 Tony Hawk였나?

    • https://en.wikipedia.org/wiki/Aerial_(skateboarding)에 따르면 “720, 즉 공중에서 두 바퀴를 도는 트릭은 스케이트보딩에서 가장 드문 트릭 중 하나이며, 1985년에 Tony Hawk가 처음 성공했고 계획한 것은 아니었다”고 되어 있음
      아마 “기록된 최초”라는 뜻일 테지만, 누군가 이미 했다면 떠들고 다녔을 가능성이 높고, 그걸 해낼 만한 사람은 어차피 프로 스케이터였을 가능성이 큼