게임 콘솔/xbox360

xbox360 제논 극초기형 EXT_CLK 작업 (+ RGH에 대해서)

일렉트릭캣 2025. 2. 20. 17:46

== 2025.01.22 작업 내용 ==

 

예전에 xbox360 콘솔에 기웃거릴때 한참을 찾다가 구형 본체를 나눔하길래 받은 본체다.

 

하지만, 받고보니 HDMI 포트가 없는 모델이였고, RGH3 작업을 할거라서 Opus 모델일까 기대했지만 극초기형 제논이였다. 제논이나 제퍼는 소위 레드링이라 불리는 RROD로 아주 유명한 콘솔 리비전이다. 나눔 받은 본체도 레드링으로 이미 서비스를 받았는지 Manufactured Date가 아니라 Service Date로 적혀있다는..

대충 창고에 짱박아뒀다가 최근에 글리쳐가 몇십개를 주문하면서 설치 연습할겸 해봤다. 차피 고장날 본체인데 뭐더러 하나 싶긴했지만, 글리쳐 연습하다가 멀쩡한 팔콘이랑 재스퍼를 날려먹었기에 연습을 해봤다.

 

RGH란 무엇인가?

xbox360 콘솔은 해킹이나 불법복제 방지를 위한 장치들이 있다. 여러 장치 중 가장 첫번째 장치는 OS가 설치되어있는 낸드 메모리 검증이다. 낸드 메모리 검증은 CPU 부트롬에 의해서 수행되고, 낸드 메모리의 해시를 MS 개인키로 암호화되어있다. CPU 부트롬에 의해 수행되기 때문에 검증 코드를 우회하거나 없앨 수 없고, 해시를 생성하자니 개인키가 없기 때문에 해시를 생성할 수 없다.

 

그러나 xbox360 CPU에는 아주 치명적인 결함이 있으니 CPU에 30ns 정도로 아주 짧은 시간동안 리셋을 보내게 되면 CPU가 리셋되지 않고, CPU의 레지스터들만 0으로 초기화 되는 결함이 있다. 근데, CPU 레지스터를 변화시킬 수 있다는건 프로그램의 흐름을 제어할 수 있다는 이야기다. 이를 활용한게 Reset Glitch Hack, RGH가 되시겠다.

 

먼저 낸드 해시를 언제 검증을 수행하는지 알아내야한다. 콘솔이 부팅하는 과정에 POST 버스에 값을 내보내고 있고, 0xDA (Glitch2) 또는 0x49 (Glitch1) 일때 낸드 해시를 검증을 수행한다는것을 알아냈다. 또한 부트롬 리버스 엔지니어링 결과 POST 출력 후 얼마 후 memcmp 함수 호출하여 해시 비교를 수행한다는것을 알아냈다.

cmp 붙은 함수 특성상 바이너리가 온전히 같을때만 0을 반환한다. 즉, 해시가 다르면 0 이외의 값이 반환되게 된다. 하지만 이 시점에 리셋 글리치 공격을 하게 된다면 무슨수를 써도 0이 반환되기 때문에 해시 검증에 성공하게 된다.

 

하지만, CPU는 3GHz 넘게 작동되고 있어서, 정확한 시점에 리셋 글리치를 보내기는 쉽지 않다. 하더라도 매우 정밀한 타이머가 있어야할것이다. 하지만 CPU 작동 속도를 낮추면 타이머가 정밀하지 않아도 높은 확률로 공격을 시도 할 수 있다.

 

RGH 공격 방법들로 대표적으로 RGH1, RGH2, RGH3, Project Muffin 4가지를 뽑을 수 있는데, 기본적인 매커니즘은 낸드 해시 검증 시점을 카운팅하고 있다가 CPU에 리셋을 매우 짧게 보내는것이다. 4가지 방법들은 CPU 속도를 어떻게 낮출것이냐에 따라 방법이 나뉘는것이다.

 

RGH1 또는 RGH1.2는 클럭 배수를 조절하는 PLL에 assertion으로 CPU 속도를 낮춘다. PHAT 모델은 128배, S/E 모델은 640배 까지 속도를 낮출 수 있다.

 

RGH2 또는 S-RGH는 PLL assertion을 사용하지 않고 HANA (클럭제너레이터)에 I2C버스에 직접 감속 명령을 보내 CPU 속도를 낮추는 방법이다. 정확한 배수는 모르지만 RGH1/RGH1.2 보다 효과는 떨어진다.

 

Project Muffin은 RGH2와 원리는 비슷하지만 I2C 버스에 직접 명령을 보내는게 아니라 사우스브릿지칩에 명령을 보내고 사우스브릿지칩이 대신 I2C버스에 감속 명령을 내보내도록 하는 원리인다.

 

RGH3는 PLL assertion과 I2C 명령을 둘 다 사용하고, 글리치 공격을 외부 CPLD/FPGA 칩이 아닌 사우스브릿지가 수행한다. (정확히 설명하면 PLL assertion만 CPU 감속에 관여하고, I2C 명령은 사우스브릿지칩 오버클럭을 위해 수행한다.)

 

CPU 감속을 통해 정확도를 높히더라도 100% 공격에 성공할 수 없기 때문에 RGH 작업된 콘솔에는 1분이내 부팅 보장 등등 이런 이야기가 있는것이다.

 

EXT_CLK는 무엇인가?

제논과 제퍼는 PLL assertion에 의한 CPU 감속이 잘 작동하지 않는다. 정확히는 CPU 감속은 되지만 CPU 속도를 원래대로 복원할때 클럭제너레이터 jitter에 의해 CPU가 그대로 멈추는 문제가 있다.

그래서 제논과 제퍼는 펌웨어 버전이 낮으면 RGH가 아닌 JTAG Hack을 사용한다. 버전이 높다면 어차피 레드링이 고장날거 팔콘이나 재스퍼 사서 한다고 하더라.

하지만, Octal450이라는 사람이 PLL assertion기반 속도제어가 아니라 외부에서 직접 CPU 클럭을 생성하는 EXT_CLK 방법을 발견했다. 다만, EXT_CLK 방법을 사용하게 되면 약 CPU를 약 10배 정도 느리게 할 수 있으므로, 128배 느리게 할 수 있는 PLL assertion 보다 정확도가 떨어진다.

 

EXT_CLK 글리치 작업하기

EXT_CLK, CPU_RST, POST0 와이어링

 

하판은 PLL이 EXT_CLK에 연결된다는것을 제외 하고 다른건 없다.

CPU_RST 연결시 저항이 연결되어있는데 떼어야한다. 단, 저항을 제거하면 순정 상태로 부팅 할 수 없다.

 

PHAT 콘솔에 사용하기엔 매우 불친절한 ACE V3 글리처

 

단, 본인이 사용한 글리쳐칩은 ACE V3 칩을 사용했다. ACE 칩들은 S/E 모델에서 사용하는것을 전제로 만들어졌는지 추가로 작업해야할 것들이 많다.

PHAT 콘솔에서 ACE V3 글리쳐 핀아웃

1. 다이오드를 제거하고 1.8V 전압 인가 하기

2. EXT_CLK 연결시 22K 옴 저항 연결하기

3. 만약 150MHz 발진기가 있다면 떼어내고, STBY_CLK를 통해 48MHz 클럭을 사용할것

 

1번과 2번도 중요하긴 하지만, 3번도 매우 중요하다. 콘솔의 베이스 클럭이 48MHz 인지 몰라도 150MHz 발진기를 사용하면 10번중 1번 정도 부팅에 성공하더라.

차라리 150MHz 발진기 떼버리고, STBY_CLK 통해 클럭을 받아쓰는게 낫다.

 

짜잔 이제 이 제논 콘솔은 프리부트가 적용되었습니다.

 

드디어 성공했다. 낸드 작업하면서 특이한점은 Falcon 펌웨어를 사용하더라는... 그리고 제논은 HDMI 포트가 없어서 컴포지트로 출력하니 해상도가 낮다.

타이밍 삽질해본 결과 96MHz, 0.9 길이, 59.4 타이밍을 사용했다.