0ctf perspective write up [rev/misc]
2025. 12. 31. 17:00ㆍreview 및 write up
An artist's perspective is always unique
파일은 exe파일이 주어져서 한번 실행해보니

우주같은공간에 wasd로 화면을 움직일수 있는 3d화면이 나왔다

objdump -p perspective.exe | sed -n '1,120p' 을 해보면 OPENGL을 기반으로 만든 3d렌더링이라는걸 알 수있다
원래 openGL문제의 경우 renderdoc이라는 도구를 이용해 프레임캡처를하여 drawcall을 보면 풀 수있다고 하는데
나는 대 AI시대에 살고있어 GPT에게 정적 분석을 맡긴 결과 점을찍는 vertex는 다음과 같이 구성되어있었다
- 점 개수 n = 628
- positions (x,y,z) 시작 오프셋: 0x5D3C0 (float 3개씩 n개)
- colors (r,g,b) 시작 오프셋: 0x5F130 (float 3개씩 n개)
- scalar (0/1) 시작 오프셋: 0x60EA0 (float 1개씩 n개)
문제설명과 같이 관점의 차이가 핵심이였는데, 3D좌표를 하나씩 버리는 방식인 투영으로 (x,y),(y,z),(x,z)평면을 하나씩 투영해본 결과 x,y평면에서 scalar가 1인 값만 모았을 때 플래그가 나타났다.
exploit code
import numpy as np
import matplotlib.pyplot as plt
path = "perspective.exe"
n = 628
pos_off = 0x5D3C0
col_off = 0x5F130
sca_off = 0x60EA0
with open(path, "rb") as f:
data = f.read()
pos = np.frombuffer(data, dtype="<f4", count=n*3, offset=pos_off).reshape(n, 3)
sca = np.frombuffer(data, dtype="<f4", count=n, offset=sca_off)
# sca==1만 필터
mask = sca > 0.5
pts = pos[mask][:, [0, 1]] # XY 투영
plt.figure(figsize=(12, 3))
plt.scatter(pts[:, 0], pts[:, 1], s=25)
plt.gca().set_aspect("equal", "box")
plt.axis("off")
plt.tight_layout(pad=0)
plt.savefig("flag_xy.png", dpi=300)

사실 난이도자체로만 보면 꽤나 어려운 문제인 것 같은데 전체적으로 gpt사용 비중이 높아 스스로에게 좀 아쉬웠다. 리버싱 실력을 키워봐야 할 것같다.
'review 및 write up' 카테고리의 다른 글
| 0xFUN CTF 2026 write up (0) | 2026.02.23 |
|---|---|
| HeroCTF v7 [forensics] Operation Pensieve Breach - 1 write up (0) | 2025.12.11 |
| Platypwn 2025 write up (0) | 2025.12.04 |
| ACDC2025 write up (0) | 2025.11.07 |
| osu!CTF2025 [Forensics]map-dealer write up (0) | 2025.10.29 |