- 초기형 PS2의 보안 칩 SPC970 메카콘에서 펌웨어가 추출돼 22개 이미지가 깃허브에 공개됐다.
- 코드가 마스크 ROM에 고정된 칩이어서, 설정 저장용 EEPROM의 쓰기 절차를 악용해 256바이트씩 약 1,000번 복사하는 방식이 쓰였다.
- 초기형을 칩 수준에서 해제하는 도구는 나오지 않았고, 덤프 도구 실행은 EEPROM 수명을 깎는 위험을 동반한다.
256바이트씩, 약 1,000번. 초기형 플레이스테이션 2의 보안 칩에서 256KB 분량의 펌웨어를 통째로 꺼내는 데 들어간 반복 횟수예요. 그 전에는 칩 포장을 벗겨서 내용을 직접 읽어 보려는 시도가 약 4년 동안 이어졌는데, 남은 건 거친 덤프뿐이었거든요. 돌파구는 엉뚱하게도 칩이 설정값을 저장하는 절차의 허점에서 나왔습니다.
이 글은 누가 언제 무엇을 올렸는지보다 그 밑에 깔린 구조를 따라갑니다. 메카콘이 무슨 일을 하는 칩인지, 코드가 왜 밖에서 보이지 않았는지, 펌웨어가 공개됐는데도 초기형 PS2가 곧바로 풀리지 않는 이유가 뭔지. 이 세 가지를 차례로 봅니다.
디스크 인증을 맡은 메카콘, 코드는 마스크 ROM에 굳어 있다
메카콘(MechaCon)은 PS2 본체에서 디스크를 인증하고 보안 기능의 대부분을 처리하는 칩입니다. 두꺼운 본체, 흔히 팻(fat) PS2라고 부르는 초기 기종에는 SPC970이라는 칩이 이 역할로 들어갔어요. 남코의 아케이드 기판인 시스템 246과 256에도 같은 칩이 쓰였고요.
SPC970의 저장 구조는 두 층으로 나뉩니다. 실행 코드는 마스크 ROM에 들어 있어요. 마스크 ROM은 제조 단계에서 내용이 확정되는 메모리라서, 나중에 다시 쓰거나 패치하는 길이 아예 없습니다. 보정값과 설정 데이터만 따로 떨어진 1KB EEPROM에 저장되고요.
여기까지가 사실이고, 지금부터는 해석인데요. 코드와 설정을 이렇게 갈라 놓은 구조가 칩을 오래 버티게 한 요인으로 보입니다. 바꿀 수 있는 영역에는 코드가 없고, 코드가 있는 영역은 바꿀 방법도 읽을 통로도 없었으니까요. 칩 포장을 물리적으로 벗겨서 내용을 읽는 우회로가 있긴 했는데, 속도가 느렸고 결과물도 거칠었습니다. 앞에서 말한 약 4년이 바로 그 우회로에서 흘러간 시간이에요.
블록 수 0으로 연 쓰기 세션이 ROM을 EEPROM으로 옮겼다
추출에 쓰인 방법은 카운터 언더플로와 버퍼 오버플로를 엮은 겁니다. 언더플로는 부호 없는 카운터가 0에서 값을 더 빼려 할 때 음수로 내려가지 않고 아주 큰 값으로 넘어가 버리는 현상을 가리켜요. 취약점을 찾아낸 사람은 Libby라는 협력자. 펌웨어를 실제로 끌어낸 개발자 DiscoStarslayer가 블루스카이 게시물에서 그 공을 밝혔습니다. 작업 주체는 ‘spc970-dumper-union’이라는 애호가 그룹이고요. 덤프 도구 문서를 근거로 엔가젯이 전한 절차를 단계별로 풀어 쓰면 이렇습니다.
- 설정 쓰기 세션을 열면서 블록 수를 0으로 지정한다. 칩 내부 카운터가 언더플로를 일으킨다.
- 7블록 크기의 버퍼가 담을 수 있는 양보다 많은 데이터를 밀어 넣는다. 넘친 데이터가 EEPROM 쓰기 작업 정보를 담은 RAM 영역을 덮는다.
- 그 쓰기 작업의 원본 주소를 칩의 ROM 쪽으로 바꿔 놓는다. 메카콘은 자기 펌웨어 256바이트를 EEPROM에 복사한다.
- PS2가 표준 명령으로 EEPROM 내용을 읽어 온다.
- 이 과정을 약 1,000번 되풀이하면 256KB 전체 이미지가 USB 메모리에 쌓인다.
눈여겨볼 대목은 ROM을 직접 읽은 게 아니라는 점이에요. 읽기가 허용된 창구인 EEPROM을 중계 지점으로 삼아서, 칩이 자기 코드를 스스로 그쪽에 옮겨 적게 만든 겁니다. 비어 있는 설정 데이터가 올 거라고 알려 놓고 실제로는 공간보다 많은 데이터를 보낸다. 출발점이 된 발상은 이 한 줄이에요.
드래곤 칩은 한 달 만에 풀렸고 SPC970은 더디게 갈 수밖에 없다
PS2의 메카콘은 한 종류가 아닙니다. 2003년에 등장한 ‘드래곤(Dragon)’ 메카콘은 2021년에 펌웨어가 공개됐고, 한 달 뒤에 MechaPwn이라는 익스플로잇이 나왔어요. MechaPwn은 후기형 PS2의 지역 제한을 풀고 백업 디스크를 읽게 해 주는 도구입니다. 연구자들이 드래곤의 코드를 읽고 찾아낸 약점은 소니가 그 칩에 마련해 둔 자체 업데이트 방식에 있었고요.
| 항목 | SPC970 메카콘 | 드래곤 메카콘 |
|---|---|---|
| 탑재 기기 | 일본 전용 SCPH-15000(2000년)부터 39000 시리즈(2002년)까지의 팻 PS2, 남코 시스템 246·256 | 2003년 등장, 후기형 PS2 |
| 코드 수정 | 불가능(마스크 ROM) | 패치를 받아들이도록 설계 |
| 펌웨어 공개 | 22개 이미지가 깃허브에 공개 | 2021년 공개 |
| 칩 수준 해제 도구 | 없음(개발 목표로만 언급) | MechaPwn(펌웨어 공개 한 달 뒤 등장) |
| MechaPwn 지원 | 미지원, 지원 계획 없음(README 기준) | 지원 |
표에서 갈리는 줄은 ‘코드 수정’입니다. 드래곤은 패치를 받아들이도록 만들어졌고, 바로 그 통로가 공격 지점이 됐어요. SPC970에는 그런 통로가 없습니다. 2000년에 칩에 구워진 코드가 한 번도 바뀌지 않았거든요.
기여자 uyjulian은 SPC970에도 MechaPwn이나 TonyHax 방식의 해제를 내놓는 게 목표 가운데 하나라고 밝혔는데, 드래곤 때만큼 빠르게 나오지는 않을 거라는 말도 같이 붙였습니다. 이번 덤프가 연 건 해제 자체가 아니라 약점을 찾아볼 기회예요. 그 전에는 코드를 볼 길이 없어서 탐색조차 불가능했으니까요. 패치 통로가 없는 칩이라는 점을 떠올리면, 더딜 거라는 전망은 몸을 사리는 말이 아니라 구조에서 나오는 얘기로 읽힙니다.
PCSX2는 칩 코드를 실행하지 않는다, 펌웨어가 에뮬레이션에 주는 재료
공개된 펌웨어가 게임 실행 범위를 넓혀 주는 건 아닙니다. PS2 게임은 암호화돼 있지 않았기 때문에 새로 열리는 타이틀이 없어요. 드러난 건 소니의 ‘매직게이트(MagicGate)’ 암호화를 구현한 코드입니다. 매직게이트는 메모리 카드, 그리고 본체가 디스크와 메모리 카드에서 부팅하는 KELF 실행 파일에 쓰이고요.
이 코드가 어디에 쓰일지는 에뮬레이터 쪽 사정을 보면 드러납니다. PCSX2를 비롯한 에뮬레이터는 메카콘의 코드를 실행하지 않아요. PCSX2는 메카콘 명령을 C++로 다시 구현해 두었고, 1KB짜리 NVRAM 파일과 4바이트 버전 번호를 디스크에서 읽어서 실제 부품의 자리를 메웁니다. 칩을 재현하는 게 아니라 칩의 응답을 흉내 내는 방식. uyjulian은 이 펌웨어가 결국 ‘전체 시스템 저수준 에뮬레이션’의 밑거름이 될 거라고 말했습니다.
DiscoStarslayer가 관리하는 PCSX2 포크 Reliquary는 PS2의 인증 경로를 겨냥합니다. 이 포크의 README는 한계를 숨기지 않는데요. 보안 검사가 본체 고유 정보를 들여다보는 경우에는 생성된 대체 데이터가 하드웨어의 실제 값을 대신하지 못한다고 인정합니다. 하드웨어 쪽 한계도 분명해요. 펌웨어 이미지만으로는 광학 드라이브 에뮬레이터를 만들 정보가 부족합니다. 메카콘을 대체하되 드라이브의 DSP는 남겨서 디스크를 읽게 하는 모드칩이 가능한 방향으로 거론되는 정도예요.
초기형 PS2를 가진 국내 사용자, 쓸 도구는 그대로다
국내에서 팻 PS2를 보관 중인 분에게 곧바로 바뀌는 건 없습니다. 전망이 아니라 지금 상태가 그래요. MechaPwn의 README는 드래곤 기반이 아닌 구형 본체를 지원하지 않으며 지원 계획도 없다고 적고 있고, SPC970용 해제 도구는 나오지 않았거든요. 해당 범위는 PS2 발매 첫 3년, 그러니까 2000년부터 2003년 사이의 모델 번호 약 20종입니다.
먼저 할 일은 본체 라벨에서 SCPH로 시작하는 모델 번호를 확인하는 겁니다. 펌웨어가 공개된 범위는 SCPH-15000부터 39000 시리즈까지. 국내에 유통된 본체가 이 범위에 얼마나 드는지는 원문에서 확인되지 않아서, 기기마다 번호를 직접 봐야 해요. 이 범위의 본체에는 메모리 카드나 하드디스크를 이용한 익스플로잇으로 백업을 구동하는 길이 예전부터 열려 있습니다. 칩 수준 해제가 없다는 게 아무것도 못 한다는 뜻은 아닌 셈이죠.
법적 측면은 따로 따져야 합니다. 지역 제한 해제나 백업 디스크 구동은 국내 저작권법의 기술적 보호조치 관련 규정과 맞닿는 영역이에요. 기술적으로 가능한지와 허용되는지는 다른 문제이고, 이 글은 뒤쪽을 판단하지 않습니다.
추측을 하나 덧붙이면요. 22개 이미지가 이미 공개돼 있으니, 연구 목적이 아닌 일반 보유자가 자기 본체에서 덤프를 다시 뜰 실익은 크지 않아 보입니다. 다만 공개된 이미지가 모든 개정판을 포괄하는지는 확인되지 않았다는 단서가 붙어요.
확인된 것과 아직 불확실한 것
확인된 사실
- SPC970 메카콘의 펌웨어가 추출됐고, 22개 이미지가 깃허브에 올라와 있다.
- 대상 범위는 SCPH-15000부터 39000 시리즈까지의 팻 PS2와 남코 시스템 246·256 기판이다.
- 추출은 블록 수 0의 설정 쓰기 세션으로 카운터 언더플로를 일으키고, 7블록 버퍼를 넘쳐 EEPROM 쓰기 작업의 원본 주소를 ROM으로 돌리는 방식으로 이뤄졌다.
- PS2 게임은 암호화돼 있지 않아 이 덤프로 새로 실행 가능해지는 게임은 없다.
- 펌웨어에는 매직게이트 암호화와 KELF 실행 파일 처리에 관한 코드가 들어 있다.
미확정 사항
- SPC970에서 실제로 쓸 만한 취약점이 발견될지, 발견된다면 얼마나 걸릴지.
- MechaPwn이나 TonyHax 방식의 해제 도구가 초기형용으로 나올지. 목표로만 언급된 단계다.
- 메카콘을 대체하는 모드칩이 실물 제품으로 이어질지.
- 전체 시스템 저수준 에뮬레이션이 PCSX2 본류나 Reliquary에 어떤 형태로 반영될지.
- 공개된 22개 이미지가 초기형의 모든 개정판을 포괄하는지.
덤프 도구를 돌리기 전에 따져야 할 EEPROM 수명
이 추출 방식의 값은 EEPROM이 치릅니다. 약 1,000번의 반복은 매번 EEPROM을 다시 쓰는 작업이에요. 이 EEPROM에는 쓰기를 여러 영역에 고르게 분산하는 웨어 레벨링이 없고, 허용되는 쓰기 횟수도 플래시 메모리보다 적습니다. 덤프를 한 번 뜰 때마다 수명이 줄어든다는 건 추정이 아니라 구조에서 바로 나오는 결과고요.
도구에 안전장치는 들어 있습니다. 시작 전에 EEPROM을 백업하고, 작업이 끝나면 워드 단위로 복원한 뒤, 칩이 전원을 켤 때 수행하는 체크섬 루틴에 결과를 대조해요. 보정값과 설정 데이터가 원래대로 돌아왔는지를 칩 자신의 검증 절차로 확인하는 구조입니다.
안전장치가 있다고 위험이 사라지지는 않아요. Libby의 원본 덤퍼에는 경고가 붙어 있습니다. 이 도구가 PS2를 정상 작동이 불가능한 상태로 만들거나 하드웨어 수준의 수리가 필요한 상태로 만들 위험이 있고, 사용 책임은 전적으로 본인에게 있다는 내용이에요.
돌릴지 말지는 목적에 따라 갈립니다. 펌웨어 분석에 참여할 생각이 있고 본체를 잃어도 감당이 된다면 실행을 검토해 볼 만해요. 소장용 본체를 온전히 유지하는 게 목적이라면 실행하지 않는 쪽이 합리적입니다. 초기형용 해제 도구가 실제로 나온 뒤에 그 도구의 문서와 위험 고지를 읽고 결정해도 늦지 않고요.
출처: Engadget

