2026 SPACE WAR - 01.ARIES CTF 문제 풀이
0. 개요
- 문제 이름 : tinynn
- 문제 유형 : AI
- 환경 :
- 입력 : 8x8 grayscale PNG
- 모델: model.onnx
- 서버: 이미지 → 정규화 → logit 계산
- 목표 :
- 서버 기준값(threshold=0.98)을 넘는 logit을 생성하는 이미지를 만들어 제출
1. 전체 구조 분석
1-1. 서버 동작
서버 코드를 보면 이미지 처리 과정은 다음과 같다.
이미지 (PNG)
→ grayscale(L)
→ float32 변환
→ 255.0으로 나눔 → [0,1]
→ ONNX 모델 입력
→ logit 계산
조건 : logit > 0.98
1-2. 입력 제약
입력은 8x8 grayscale PNG 이므로:
- 픽셀 수 : 64개
- 각 픽셀 : 0 ~ 255 정수
- 실제 입력값 : p / 255
즉, 다음 문제는 64개의 정수 변수로 logit을 최대화 하는 문제라고 볼수있다.
2. 모델 분석
2-1. 모델 구조
ONNX 모델을 분석하면 구조는 매우 단순하다.
input (1x1x8x8)
→ Conv(3x3, padding=1)
→ ReLU
→ Flatten(64)
→ Linear(64→1)
→ logit
매우 작은 CNN + 선형층 구조
2-2. 파라미터
모델 내부 텐서는 다음과 같다.
conv.weight: (1,1,3,3)
conv.bias: (1,)
fc.weight: (1,64)
fc.bias: (1,)
입력 64개 → 출력 1개
2-3. 수식 형태
출력은 다음과 같이 표현할 수 있다.
z[r,c] = conv(p/255)[r,c] + bias
h[r,c] = max(z[r,c], 0)
logit = Σ(fc_weight * h) + fc_bias
Conv + ReLU + Linear
3. 문제
3-1. 중요한 점
이 문제에서 중요한점은
- 입력은 연속값이 아니라 정수 (0~255)
- 모델이 매우 작다
- ReLU만 있는 단순 구조
즉, 딥러닝 문제가 아니라 작은 최적화 문제 이다.
3-2. 접근 방법
가능한 방법:
- Gradient-based → 가능
- Brute force → 불가능
- Heuristic search → 가능
가장 간단한 접근: 0/255 binary 패턴 탐색
4. 공격 시나리오
4-1. 초기 상태
전체 흰색 이미지:
logit ≈ 0.2774
threshold(0.98)에 한참 부족하다.
4-2. 최적화 방법
사용한 방법 - Hill Climbing
- 픽셀 하나씩 바꾸면서 logit 증가 확인
- 0 ↔ 255 토글
- greedy하게 개선
4-3. 결과 패턴
최종적으로 얻은 8x8 이미지:
1
2
3
4
5
6
7
8
255 255 0 255 255 255 0 255
0 0 255 255 255 0 255 255
0 255 0 255 0 255 255 0
255 255 255 0 255 255 0 255
255 0 255 255 255 255 0 255
0 0 255 0 255 255 255 255
0 0 0 255 255 255 255 0
255 255 255 255 255 255 0 255
4-4. 결과 logit
logit ≈ 0.9962435852
threshold(0.98) 초과
5. 익스플로잇
5-1. 이미지 생성
위 값을 grayscale PNG로 변환 - /home/cyh/answer.png
5-2. 서버 제출
이미지를 제출하면:
1
2
3
4
{
"flag": "hspace{tiny_neural_tiny_gradient}",
"result": "correct"
}
6. 전체 공격 흐름 정리
전체 과정은 다음과 같다.
- ONNX 모델 구조 분석
- 입력 제약 (8x8, 0~255) 확인
- logit 계산식 도출
- 최적화 문제로 변환
- binary(0/255) 기반 탐색
- hill climbing으로 logit 증가
- threshold 초과 이미지 생성
- PNG 제출 → FLAG 획득
7. 포인트
이 문제의 포인트는 다음과 같다.
- 딥러닝 모델이지만 매우 단순한 구조
- 입력이 정수라서 최적화 공간이 제한된다.
- gradient 없이도 heuristic으로 해결 가능
- 결국 “모델을 깨는 문제”가 아니라 “값을 맞추는 문제”
8. 정리
ONNX 모델 구조를 분석한 뒤, 8x8 픽셀 값을 최적화하여 logit을 threshold 이상으로 만들어 FLAG를 획득하는 문제
9. 최종 플래그
1
hspace{tiny_neural_tiny_gradient}