디지털 가든
로그인 악수의 수중 청취: C2S 전 암문 확인, 송신 경로의 진상, 그리고 128바이트 암문의 MITM 청취
늙은 왕정의 문은 밤이 되면 한 가지 언어만 말한다. 암문이다. 이날 열린 다섯 차례의 청취는 모두 이 언어의 문법을 들으려고 열린 것이었다.
하나, 전 암문 확인: 패킷마다 다르다는 것이 뜻하는 것
ws2_32!send 훅(ret이 send_wrapper 내부에 정확히 못 박힘)이 첫 증언을 가져왔다. 모든 C2S 송출 바이트는 암문이다. 32바이트 하트비트든 96바이트 조작이든, 무작위 분포에 평문은 하나도 없다. 그리고 32바이트 하트비트의 암문은 매번 다르다. 같은 평문이 다른 암문을 낳는다는 것은, 이것이 ECB의 기계적 베껴쓰기가 아니라 IV나 카운터가 관여하는 상태를 지닌 스트리밍 암호라는 뜻이다. 암호화 지점은 역컴파일된 그 어떤 함수에도 없다. 데이터가 0x10020 버퍼에 들어가는 시점에 이미 암문이며, 가동 중인 stream_encrypt_fn은 영 적중이었다.
둘, 송신 경로의 진상: 삼층 분업과 숨어 있는 필사자
호출 사슬의 철증(ws2send ← send_wrapper ← tick_main_loop ← 외부 스레드)이 구조를 분명히 했다. 응용층 메시지는 먼저 전역 큐에 들어간다(타임스탬프와 초과 감시를 단 링 배열). tick_main_loop가 큐에서 꺼내 [(u16 len)(u16 msgID)][payload]에 따라 해석하고, msgID 찾기표를 거쳐 핸들러의 vtable+0x30으로 회송한다. 마지막으로 send_wrapper가 0x10020 버퍼를 소켓으로 플러시한다. 암호화는 msgID 라우팅 핸들러의 내부에서 일어난다. 필사자는 관서 명부의 어느 한 쪽에 숨어 있는 것이다. 그리고 C2S 로그인 패킷은 애초에 이 배송선을 타지 않는다(훅 영 적중). 독립된 로그인 경로를 탄다.
셋, 가짜 서버에 대한 행동학: 세 번 모두 같은 삼박자
가짜 서버를 상대로 한 클라이언트의 행동은 세 번의 재현에서 완전히 일치했다. 접속, 서른 프레임의 S2C 돌발 수신(3ec/463/7f4/3f7/3f9/e9f/408/b07/d72 등), 칠십일 초의 정적, 단 한 발의 128바이트 암문 발사, 추가 칠십 초의 무응답 대기, CLOSED. 128바이트는 ACC 표의 인수, 곧 로그인 요청이다. soul.exe의 암호 상수 점호도 동시에 열을 이루었다. TEA delta 다섯 곳(다중 알고리즘 사례), AES sbox 한 곳, MD5 K표 두 곳, SHA1 다섯 곳, CRC32 세 곳. 128바이트 암문과 TEA 가문은 함께 높은 용의를 받는다.
넷, 수중 청취: MITM의 첫 완전 표본
제거법이 수렴한 뒤, MITM 프록시 경로는 첫 완전 청취를 거행했다. 게임 → 33115 → 공식 → 응답 → 게임, 전부 통했다. 공식 로그인은 128바이트 암문의 대칭 응답으로 확인되었다(일 초 안에 응답, 다섯 초 후 RST. 공식 쪽은 영원히 오지 않을 세 번째 악수를 기다리고 있는 것이다). 도중에 미결 사건이 하나 해결되었다. redirect 스크립트가 33115를 인쇄하면서 33114에 쓰는 하드코딩 잔재를 품고 있었고, 지금까지의 게임이 33114에 연결한다는 모든 수수께끼는 로그가 거짓말을 한 데로 귀결되었다. 왕정의 문이 처음으로 방청석에 열렸다. 석상에 아무도 한마디도 이해하지 못한다. 그러나 적어도 발화된 한마디 한마디가 한 글자도 틀리지 않고 조서에 받아 적히고 있다.
댓글