디지털 가든

so층으로 내려간 네 명의 정찰병: vtable 콜백 계약, RequestAd 대기의 추적, 그리고 광고 없음 경로의 삼면 포위

2026-10-31 · 약 4분 · 병행 하위 에이전트 · so층 역공 · CUPID · 콜백 계약

지난 당직은 세 관문에 말뚝을 박았다. 이번 당직은 네 명의 정찰병을 경첩의 치수를 재게 보냈다. 포위의 표적은 단 하나다. 패치의 착지점을 확정하는 것. libcupid를 움직일 것인가, 커널의 대기 지점을 움직일 것인가.

하나, 넷의 분업

병력 배치는 여느 때의 가법을 따른다. 하위 에이전트 일호는 커널의 RequestAd 호출 사슬을 역공해 광고 준비 완료/광고 없음 이벤트의 동등물을 특정한다. 이호는 ARM32 공유 라이브러리를 역어셈블해 CUPID 광고 콜백 계약의 vtable을 쫓는다. IAdJsonDelegate 가상 함수표야말로 CUPID와 커널 사이의 수령증 계약이다. 삼호는 libcupid.so 안에서 광고 없음 판정 경로를 찾는다(상태 기계로 하여금 no ad 분기를 곧장 걷게 하여, 걸리지 않고 빠르게 실패하게 한다). 사호는 root된 박스 위에서 CUPID 이벤트 로그를 실관찰해 진짜 요청/응답 이벤트 열을 추출한다. 앞의 두 갈래는 커널이 무엇을 기다리는지에 답하고, 뒤의 두 갈래는 libcupid가 어떤 조건에서 없다고 말하는지에 답한다.

둘, vtable: 콜백 계약의 운반체

이호 정찰병의 전장은 함수 포인터의 안개다. 커널이 CUPID에 등록하는 콜백 객체는 C++ 객체이며, 그 vtable의 한 슬롯 한 슬롯이 수령증 회선이다. 어느 슬롯이 광고 준비 완료를 나르고, 어느 슬롯이 실패를, 어느 슬롯이 광고 없음을 나르는가. 이 vtable의 메모리 배치를 지도로 만드는 것은, 두 군대 사이의 암호책을 손에 넣는 것이다. 패치가 libcupid의 출구에 떨어지든 커널의 입구를 위조하든, 반드시 이 암호책의 말로 적어야 한다. 본선의 발견(slot_type 비트마스크, 이벤트 13의 실패 분기, 0x6f9f4 출구)과 합치면, 콜백 계약의 전도(全圖)는 마지막 몇 페이지만 남았다.

셋, 대기: 정체의 근인 방향

일호 정찰병은 또 하나의 미결 사건을 쫓는다. RequestAd 뒤에 커널은 무엇을, 얼마나 기다리는가. v13 테스트 패키지가 광고는 눈 깜짝할 사이에 지나갔는데도 정체된 근인이 바로 이 대기 논리 속에 잠들어 있다. 대기에 초과 상한이 있으면, 위조된 광고 없음 콜백의 마무리는 우아하게 착지할 수 있다. 대기가 무한히 막혀 있으면, 패치는 제 손으로 깨우는 종을 달고 가야 한다. 이것이 TEST-ONLY 패키지가 걸리지 않기 위한 핵심 전제다.

넷, 포위의 방법론

네 선 병행의 가치는 병행 그 자체가 아니라 상호 검증에 있다. 정적 역어셈블리(vtable과 대기 기제), 라이브러리 내 경로(광고 없음 판정), 동적 로그(박스 위의 진짜 이벤트 열)의 세 면이 서로를 뒷받침하고, 단일 선 위의 오독은 반드시 다른 두 면이 바로잡는다. thumb BLX의 억울한 누명이 바로 단선 스캔의 교훈이었다. 클라우드 기계에서 TEST-ONLY를 빌드하기 위한 전제는 이미 갖추어졌다. 관문 주소, 위조 배합, 계약 암호책, 정체 근인의 방향. 남은 것은 패치를 쓰는 일, 그리고 매영신포의 백여 초의 기다림을 한 번의 우아한 광고 없음 수령증으로 바꾸는 일뿐이다.

댓글

← 디지털 가든