풀이 날짜: 2026-09-16 (사용자 확정). 익스플로잇 성공은 2026-09-16 사용자 확인에 따른다. 아래 실행 결과는 보존된 원본 기록이며 이번 감사에서 새로 실행한 결과가 아니다.

같은 배포물, 서로 다른 분석·구현 이력

두 source의 protoss 바이너리는 SHA-256 38fda0dbc31a43c31309749cd60ea2e4aa3899c45a55a02e35c11dbab794e35a로 같다. 하나의 Protoss Adult 레코드 안에서 원본 solve.py/protoss_proto.py와 Astra adult_solver.py/baby_solver.py의 역할과 검증 시점을 구분한다. Baby는 Astra가 사용한 기준선 자료이며 별도 challenge를 생성하지 않는다.

DB 식별자와 메모리 인덱스의 혼동

기존 디컴파일 분석은 주소록 수정에서 데이터베이스 행 ID가 compact vector<string>의 위치로 사용되는 관계를 확인했다. 아래는 그 불변조건을 표현한 분석식이며 실행용 exploit 코드가 아니다.

DB id:      지속되는 행 식별자; 삽입 이력에 따라 빈 값이 생길 수 있음
vector i:   현재 컨테이너의 위치; 유효 범위는 0 <= i < size
필요 조건:  DB id를 쓰기 전에 현재 컨테이너 위치로 올바르게 매핑해야 함

행 ID가 존재한다는 사실은 같은 수의 vector 원소가 존재한다는 뜻이 아니다. 실패한 INSERT도 식별자 진행에 영향을 줄 수 있어, 행 개수와 ID 범위를 혼동하면 주소록 대입의 경계가 깨진다. 원본 분석은 History의 데이터 표현, 문자열 객체의 상태, DB와 컨테이너 간의 관계를 따로 검토했다.

원본 가설이 실패한 이유

SOLVER_NOTES는 고정된 History/User 상대 위치와 특정 자기 참조 관계가 할당 순서에 따른 관찰값이었다고 정정한다. 정상적인 deposit이나 내역 변화에도 상대 위치가 달라졌다는 측정이 근거다. prompt가 도착한 상태에서 기대한 내용이 바뀌지 않은 결과를 단순 timeout으로 취급한 해석도 폐기했다.

Dirty DB와 사전 검사 순서의 문제는 있었지만 관찰된 실패의 전부를 설명하지 않았다. 원본 기본 solve.py는 필요한 동적 객체 식별 근거를 확보하지 못하면 REMOTE_SAFE_ABORT로 끝난다. Astra 쪽의 후속 성공이 원본 파일의 기본 동작을 자동으로 바꾸지는 않는다.

구현별 관찰과 성공 판정

자료 문서가 입증하는 범위 다른 구현에 전이할 수 없는 주장
원본 기본 solve.py 중간 정보 이후 안전 중단 원격 전체 경로 완성
원본 unsafe local profile 로컬 clean restart 3회 성공 기본 원격 모드 성공
Astra writeup/GATES local QEMU profile 및 반복 검증 그 문서 시점만으로 원격 성공 확정
Astra ADULT_ANALYSIS 마지막 절 후속 공식 원격 수행·성공 marker·응답을 기록 원격 검증기의 내부 구현 또는 모든 환경의 성공 보장

Astra의 후속 보고서는 관찰된 후보 주소를 고정 상수와 구분하고 ELF header 일치 같은 검증을 거쳐 환경 가정을 확인했다고 기록한다. 메모리 정보가 출력된 것, 유효한 객체를 식별한 것, 코드 실행 marker와 목표 결과를 얻은 것은 서로 다른 판정 단계다.

기존 초안의 provenance 정정

초기 manifest와 짧은 writeup에는 공식 원격 성공이 입증되지 않았다는 설명이 있다. 그러나 같은 전달 패키지의 ADULT_ANALYSIS.md에는 2026-09-16의 후속 '공식 remote 최종 검증' 절과 실행 로그가 존재한다. 해당 문서는 import 때 보존한 해시와 일치한다.

따라서 기존 초안의 포괄적인 '어느 쪽도 원격 성공 근거가 없다'는 서술을 정정한다. 정확한 표현은 'Astra 분석 문서에 공식 원격 성공 기록이 있으며, 이번 감사에서 별도로 원격 검증하지 않았다'다. 실제 flag, 원격 주소, 실행 명령과 payload는 옮기지 않는다. 사용자의 익스플로잇 성공 확인, 원본의 중단 상태와 Astra의 후속 기록을 함께 유지한다.

자료 보존

원본 snapshot 둘은 그대로 유지하고 병합 artifact 보관본은 내용 해시별 한 번만 저장했다. 199개 원본 파일이 184개 고유 내용에 대응하며 이름이 같은 문서도 원래 경로가 보존된다. 실패 기록·모듈·solver·profile 검증 자료의 어느 한쪽을 최신 문서로 덮어쓰지 않았다.

근거 자료

  • sources/protoss_adult/SOLVER_NOTES.md
  • sources/protoss_adult/REMOTE_FAILURE_2.md
  • sources/protoss_adult_astra/ADULT_ANALYSIS.md
  • sources/protoss_adult_astra/writeup.md
  • sources/protoss_adult_astra/GATES.md

원본 문서·solver·검증 로그는 전달 staging에 보존되어 있다. 이 경로들은 provenance이며 CMS의 다운로드 첨부 링크가 아니다.