풀이 날짜: 2026-09-16 (사용자 확정). 익스플로잇 성공은 2026-09-16 사용자 확인에 따른다. 아래 실행 결과는 보존된 원본 기록이며 이번 감사에서 새로 실행한 결과가 아니다.
무엇을 복원하는 문제인가
Quite Simple의 공개값은 동일한 곡선에서 얻은 세 쌍 (x(P_i), x(2P_i))다. 숨긴 것은 체의 소수 p와 공통 곡선 계수 a,b이며, 배점의 스칼라 2는 이미 알려져 있다. 따라서 미지의 스칼라를 찾는 이산로그 문제나 flag 암호문을 복호화하는 문제로 소개하면 틀리다.
원본 코드와 수학적 관계
chal.sage는 같은 E에서 다음 관계를 세 번 출력한다. 출력문은 생략했다.
P = E.random_element()
Q = 2 * P
E: y²=x³+ax+b이고 u=x(2P)라 두면, 유한한 점에서 y≠0인 경우 다음 배점식이 성립한다.
λ = (3x²+a)/(2y)
u = λ² − 2x
4(u+2x)(x³+ax+b) − (3x²+a)² ≡ 0 (mod p)
마지막 식은 y를 없앤 관계다. 서로 다른 세 쌍이 같은 a,b,p를 공유한다는 것이 핵심 정보이며, 각각 독립적인 곡선으로 모델링하면 이 관계를 놓친다. 기존 정적 분석은 공개 좌표로 p의 배수에 관한 정수 관계를 얻을 수 있다고 설명한다. p의 배수 관계를 얻었다는 사실과 p 자체를 유일하게 복원했다는 사실은 다르다.
Sage 의미론과 특수한 소수 형태
소스의 ^는 Sage 전처리에서는 거듭제곱이다. CPython 원문처럼 XOR로 해석한 작은 후보를 실제 배포 정답이라고 할 수 없다.
p = 3(s²+s)+1
p−1 = 3s(s+1)
4p−1 = 3(2s+1)²
ASTRA_ANALYSIS는 이 특수 형태와 좌표 관계를 연결하는 방향을 다룬다. 소수 후보는 512~514비트 범위에 걸치며 '항상 512비트'라고 단정하지 않는다. p−1이 곱 형태로 표현된다고 해서 smoothness나 일반 인수분해의 빠른 성공이 보장되는 것도 아니다.
시간 조건과 문서 시점
원본 타이머는 소수·곡선 생성 이전에 시작한다. 따라서 계산만이 아니라 생성·출력·입력 대기까지 10초에 포함되고, 정확히 10초는 통과하지 않는다.
ASTRA_ANALYSIS의 'solver를 아직 작성하지 않았다'는 서술은 당시 정적 조사 상태다. 전달 패키지에는 이후 solve.py가 있고 gmpy2 의존성을 명시한다. 구현이 있다는 사실은 반영하되, 실제 출력 인스턴스와 실행 로그가 없으므로 제한시간 내 성공을 수치로 입증할 수는 없다.
결과와 남은 근거
사용자는 익스플로잇 성공을 확인했다. 이 확인과 별개로 전달 자료에는 실제 좌표 인스턴스의 성공 로그, 10초 충족 기록, 공식 flag 응답이 없다. flag.txt 자체도 제공되지 않았다. 날짜 메타데이터는 사용자가 확정한 값을 유지하며, 날짜가 있다고 실행 로그의 공백이 채워지는 것은 아니다. 이번 감사는 소스와 식을 대조했으며 Sage·gmpy2 설치나 solver 실행은 하지 않았다.
근거 자료
sources/quite_simple/chal.sagesources/quite_simple/ASTRA_ANALYSIS.mdsources/quite_simple/solve.py
원본 문서·solver·검증 로그는 전달 staging에 보존되어 있다. 이 경로들은 provenance이며 CMS의 다운로드 첨부 링크가 아니다.