풀이 날짜: 2026-09-14 (사용자 확정). 익스플로잇 성공은 2026-09-16 사용자 확인에 따른다. 아래 실행 결과는 보존된 원본 기록이며 이번 감사에서 새로 실행한 결과가 아니다.
여러 표현이 같은 나머지를 요구하는 문제
p는 한 입력의 숫자 해석, UTF-8 bytes, 문자열 표현과 bytes 표현 등이 만드는 정수에 합동조건을 요구한다. 문자의 숫자 의미와 인코딩된 바이트 값이 같은 것은 아니다. SOLUTION은 각 표현의 한 문자 변화가 정수값에 주는 기여도를 계산해 제한된 정수 변수 문제로 모델링한다.
격자에 들어가는 수학적 문제
각 부분 문제의 형태는 다음과 같다. a_i는 표현에서 계산한 계수이며 x_i는 허용 문자 범위의 정수 매개변수다.
Σ a_i x_i ≡ target (mod p)
0 <= x_i <= U
문자열의 길이와 인코딩·escape 길이가 달라지면 자리값 계수도 달라진다. 따라서 표현식의 일부를 바꾼 뒤 예전 계수를 그대로 사용할 수는 없다. 계산된 후보는 원래의 정확한 정수식과 문자 범위 조건으로 다시 검사해야 한다.
두 식을 독립으로 풀려던 가설의 실패
SOLUTION의 S와 T는 서로 다른 repr 경로가 만든 값이다. ASCII 조정 블록의 모든 위치에 대해 변화량 비율이 같다는 관찰이 중요했다.
ΔT = α ΔS
α = 256^(9 L_n) mod p
Q = T − αS − (1−α)A mod p
이 조정 방향에서는 ΔQ=0이다. 즉 두 조건을 독립으로 조절할 수 있는 rank-two 문제가 아니라 rank-one 방향이다. 더 많은 문자 후보나 강한 격자 감축을 쓰는 것만으로 일반적인 두 목표를 동시에 맞출 수 없다.
또 Q=0이고 S=A라면 T=A라는 함의가 성립한다. 이 관계는 어떤 조건이 독립이고 무엇을 보존해야 하는지 설명한다. 입력의 코드 평가 부수효과나 파일 접근 payload 없이도, 실패한 독립성 가정과 수정된 수학적 모델을 구분할 수 있다.
감축 결과와 성공 판정
LLL/BKZ가 원하는 형태의 짧은 벡터를 드러내는지는 경험적 성질이다. 벡터가 짧다는 사실만으로 문자 범위와 모든 원래 합동조건을 만족한다고 판정하지 않는다. 후속 구현은 후보를 exact checker로 검사하고 실패 시 검증되지 않은 문자열을 성공 결과처럼 취급하지 않는다.
기존 실험 기록은 직접 전수 검색, 계수 독립성 가정, 작은 alphabet으로 여러 조건을 한꺼번에 맞추는 시도와 최종 분해를 구분한다. 특정 fixture의 약 1.48초 측정을 모든 인스턴스의 성능 보장으로 쓰지 않는다.
결과와 인터페이스
사용자는 익스플로잇 성공을 확인했다. SOLUTION에는 로컬 checker/fixture 성공이 있으며 공식 원격 성공은 미확인이다. 최종 원격 인터페이스는 HOST/PORT 외의 모드 선택을 요구한다는 점을 보존한다. 로컬 파일 배치와 테스트 값을 공식 환경의 사실로 확대하지 않는다. 이번에는 p.py·solver·checker를 실행하지 않았다.
근거 자료
sources/p/p.pysources/p/SOLUTION.mdsources/p/PHASE0.mdsources/p/GATES.md
원본 문서·solver·검증 로그는 전달 staging에 보존되어 있다. 이 경로들은 provenance이며 CMS의 다운로드 첨부 링크가 아니다.