1편 https://gall.dcinside.com/board/view/?id=pokemon&no=3094527
2편 https://gall.dcinside.com/board/view/?id=pokemon&no=3094529
3편 https://gall.dcinside.com/board/view/?id=pokemon&no=3094530
4편 https://gall.dcinside.com/board/view/?id=pokemon&no=3094532
이번에는 포켓몬스터 XY/오루알사의 선물서버를 한번 재현해보고 싶었습니다.
의외로 해외 포럼 어디에서도 선물에 관련된 연구나 개발은 전혀 정보가 없던것도 신기했습니다.
GBATemp나 프로젝트 포켓몬에서도 그냥 암호화된 연결에서 더이상 정보를 캐내지 못하더군요.
그래서 제가 직접 해보기로 했습니다.
우선 리눅스 노트북을 이용해서 무선 AP를 만든 후 패킷캡쳐부터 시작했습니다.
가장 먼저 들어온건 3ds1-fushigi.pokemon-gl.com 서버였습니다.
ORAS는 3ds2, X/Y는 3ds1 서버를 이용합니다. 둘의 차이는 딱히 없고 그냥 이름만 다른듯 보입니다.
하지만 패킷 캡쳐 화면에서 보이다시피 TLS로 보호되어 있어 내용은 알 수 없습니다.
닌텐도 클래스 2 인증서로 서버 인증을 하고 있는것을 확인했습니다.
그래서 MITM 공격을 시도해보기로 했습니다.
우선 인증서가 닌텐도 자체서명 체인을 사용한 것으로 보아 아마도 게임파일 안에 루트인증서를 내장한 것으로 간주하고 열심히 게임파일 분해에 들어갔습니다.
파일을 죄다 압축해제하고 복호화시킨 다음 grep 를 사용하여 인증서나 여타 접속에 관계된 키워드를 검색해 보았으나
아무것도 검색되지 않았습니다. 이것때문에 거의 하루 삽질했네요
그리고 3DS의 펌웨어에 대해 알아보니 시스템 구성 요소들이 모듈화되어있다는 것을 알아냈습니다.
암호화 SSL 모듈을 공략해보기로 했습니다.
0004013000002F02 가 SSL 모듈이므로 업데이트 서버에서 해당 cia 파일을 추출했습니다.
하지만 업데이트 파일 자체는 3DS 공통키로 암호화가 되어 있으므로 3DS에서 직접 복호화를 해줘야 합니다.
Decrypt9를 이용해서 3DS상에서 복호화를 하였습니다.
이제 ctrtool을 사용하여 cia 껍데기를 벗겨내고 내부의 데이터를 손대봅니다.
시스템 모듈 CIA 파일은 다시 NCCH라는 이미지 형식을 가지고 있고
NCCH는 다시 CXI와 CFA형식으로 나뉘는데 시스템 모듈은 실행파일을 포함하는 CXI입니다.
CXI 파일을 추출했습니다.
이제 CXI파일을 다시 분해해서 실행파일 영역과 헤더영역, 기타영역을 나눠줘야 합니다.
실행파일 영역의 롬파일을 추출하고
그걸 다시 헤더영역과 실제 파일로 나눴습니다.
그리고 대망의 실행파일을 여니
또 암호화가 되어있는 짜증나는 상황이 발생했습니다.
다행히 변조된 LZ77을 사용했다는 것을 찾을 수 있었고 복호화/암호화가 가능했습니다.
복호화를 하니 드디어 3ds-fushigi 서버를 인증하던 루트 인증서 Nintendo Class 2 CA가 나왔습니다.
대충 생긴거보고 DER 형식이라고 여기고 해당 바이트들을 추출해 보았습니다.
다행히 인증서가 딱 튀어나왔습니다.
이제 저것과 똑같은 인증서를 만든 다음 저의 개인키로 직접 인증하고 다시 모듈로 집어 넣을겁니다.
그러면 게임에서 마치 진짜 3ds-fushigi 서버를 접속하는듯 한 행세를 할 수 있습니다.
리눅스에서 OpenSSL을 이용하여 2048 비트의 키를 생성합니다.
그리고 추출한 인증서와 똑같은 정보로 인증서를 생성하고 루트 인증서로 자기 서명을 합니다.
서명된 인증서는 다시 DER형식으로 변환합니다.
--------2편에서 계속-------
댓글 영역
획득법
① NFT 발행
작성한 게시물을 NFT로 발행하면 일주일 동안 사용할 수 있습니다. (최초 1회)
② NFT 구매
다른 이용자의 NFT를 구매하면 한 달 동안 사용할 수 있습니다. (구매 시마다 갱신)
사용법
디시콘에서지갑연결시 바로 사용 가능합니다.