0ctf perspective write up [rev/misc]

2025. 12. 31. 17:00review 및 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