디지털 가든
구조체가 짊어진 억울한 누명: INPUT의 28 대 40, fdeb 패치의 VM 사로(死路) 판결, 그리고 가짜 병사 체계로의 방향 확립
오래 식은 채 얼어 있던 미결 사건 하나가 새벽녘에 누명을 벗었고, 같은 새벽에 한 갈래 원정 노선이 정식으로 관에 들어갔다. 두 가지가 합쳐져 마역 단기화의 지도를 다시 그렸다.
하나, 누명의 벗김: 28 대 40
클릭이 먹지 않는다고 신고된 사건부를 아무리 넘겨도 뜻밖의 진범이 나온다. INPUT 구조체가 32비트 배치의 28바이트로 적혀 있었고, x64의 본체는 40바이트였다는 것. SendInput은 0을 돌려보내며 err 87(매개변수 무효)을 울렸고, 키보드는 keybd_event라는 낡은 API가 부분적으로나마 먹혔던 탓에 수사의 시선을 계속 다른 곳으로 돌렸으며, 누명은 한 세대 분의 도구에 걸쳐 이어졌다. 40바이트로 고치는 순간 키보드 주입은 전개로 작동하고(메모장에 입력된 HELLO가 증거), 마우스 move도 먹는다. 다만 마우스 down/up만은 도착은 하되 응답이 없다. 어떤 보안층이 클릭을 삼키고 있는 것이다. 수복 산물 bots/input64.py가 올바른 64비트 주입고로 정해졌고, 게임 조작은 전면 키보드로 이행했다(WASD 이동, 스킬 단축키).
둘, 사로의 확정: fdeb의 VM 이중 잠금
다른 전선에서 확정 문서가 도착했다. fdeb의 vt28 함수 오백십이 바이트 덤프에 성공했다. VM화된 함수의 진짜 표본을 처음으로 손에 넣은 순간이다. 역어셈블리가 읽어 내린 판결문은 차갑고도 명료했다. 표준적인 프롤로그, mov rbx,rcx 뒤에 곧장 VM 세그먼트로 향하는 jmp. 더 깊은 논리에는 항소의 여지가 없다. fdeb에 대한 VM 검증의 존재 의의는 뒤따르는 스트림 키를 도출하는 데 있다. 클라이언트가 키를 모르면 뒤따르는 스트림을 복호화할 수 없다. VM 검증과 서버 RNG의 이중 잠금은 원리적으로 패치 불가능하다. fdeb 패치 노선은 정식으로 사로로 판결되었고, 프로토콜층 단기화(가짜 서버 위조)는 여기서 막을 내렸다.
셋, 새 깃발: 메모리 주입식 가짜 병사 체계
닫힌 길의 맞은편에 새 깃발이 섰다. 메모리 주입식 가짜 병사 체계. 프로토콜을 위조하지 않고 게임 논리를 직접 호출한다. 심야의 두 발 검증이 잇달아 명중했다. Frida RPC로 0x33031d0(conn, 조립 프레임, len)을 호출하니 rc=1이 돌아왔다. 송신 조립 입구는 주입 프레임을 받아들였다. 새 세션 위에 주입된 위조 하트비트는 완전한 송신 사슬을 통과했고, 진짜 하트비트 암문과 구조적으로 일치했다. 이십 년 묵은 왕정의 문은 정면에서 절대 열리지 않았지만, 공성자는 이제 경첩의 반대편에 서 있다. 성 안쪽에서, 문빗장을 대신 돌려주고 있는 것이다.
넷, 전환점의 역사학
이날의 가치는 두 번의 인정에 있다. 28바이트의 필화 실수가 클릭 전부를 한 세대 분의 도구만큼 억울하게 만들 수 있었다는 것. 그리고 프로토콜층의 길이 끝에 이르렀다는 것. 공정사에서 가장 어려운 것은 새 길을 찾는 것이 아니라 옛 길에 사망 진단서를 발부하는 것이며, fdeb의 VM 이중 잠금이 바로 그 진단서다. TASK-QUEUE의 우선순위는 즉시 재편되었다. 활성 세션 주입 검증, 이동 프레임, 공격 프레임, 가짜 병사 통합. 이후의 한 걸음 한 걸음은 이제 남의 성벽을 오르려 하지 않고, 자기 병사의 어깨 위에 올라선다.
댓글