Step 299. 예선 속도 훈련: 10문제 타임어택 — 쉬운 문제부터 쓸어 담는 페이스의 기술

Step 299. 예선 속도 훈련: 10문제 타임어택 — 쉬운 문제부터 쓸어 담는 페이스의 기술

Level 3 — CTF 실전과 공격 스킬 심화 | 난이도 ★★★★☆ | 예상 소요 시간 2일 (10문제 타임어택 8시간 + 결과 분석)

전제: Step 298의 국내 대회 기출 풀이와 경향 분석표를 마쳤습니다. 이 챕터는 예선 당일의 "페이스"를 만드는 시뮬레이션입니다.

  • 준비물: 분야 혼합 문제 10개(기출·유사 문제, 난이도 쉬움~중간), 타이머, 문제별 기록 양식, 집계용 파이썬 스크립트. 외부 플랫폼의 문제 풀이 장면은 출력 예시로 표기합니다.
  • 주의: 오늘은 "정확히 푸는 날"이 아니라 "빠르고 정확하게 쓸어 담는 날"입니다. 한 문제의 완벽한 풀이보다 10문제의 배분이 평가 대상입니다.
  • ⚠️ 이 챕터의 실습은 내 랩·합법 플랫폼 전용입니다. 허가 없는 시스템에 적용하면 범죄입니다. 기출·유사 문제는 운영자가 공개한 자료만 사용합니다.

예선은 제한 시간 안에 최대한 많은 문제를 푸는 게임입니다. 그리고 이 게임의 커트라인을 가르는 것은 어려운 문제 한 개가 아니라, 쉬운 문제를 얼마나 빠르고 정확하게 쓸어 담았는가입니다. 상위 팀과 중위 팀의 차이는 대부분 "풀 수 있는 문제를 놓치지 않았는가"에서 갈립니다.

그런데 이 능력은 알고 있다고 생기지 않습니다. 시간 압박 속에서 문제 선택 순서를 정하고, 막히면 버리고, 오답을 줄이는 것 — 전부 몸에 밴 루틴이어야 합니다. 오늘은 실제 예선처럼 시계를 걸고 10문제 연속 풀이를 시뮬레이션해 그 루틴을 만듭니다.


1. 학습 목표

이 챕터를 끝내면 다음을 할 수 있습니다:

  • 분야 혼합 10문제 세트를 예선 형식에 맞게 설계한다
  • "쉬운 문제부터 전수 스캔" 순서 전략과 시간 예산표를 세워 실행한다
  • 문제별 착수/완료/오답을 실시간으로 기록하는 로그 습관을 유지한다
  • 중간 재평가 시점(3시간 경과)에 남은 문제를 다시 평가해 순서를 조정한다
  • 집계 스크립트로 득점률·시간 효율을 계산하고 "순서를 바꿨다면" 시뮬레이션으로 전략을 복기한다

2. 배경 지식 — 오늘의 도구와 개념

오늘의 도구 한눈에 보기

구분 내용
언어·환경 기출·유사 문제 플랫폼(합법 공개분), 타이머, 메모 또는 스프레드시트, 파이썬 3
오늘의 명령어 새 명령어 없음 — 문제 풀이 명령은 전부 복습, 집계는 로컬 파이썬 스크립트
필요한 개념 전수 스캔 전략, 시간 예산, 기회비용(막힌 문제의 비용), 오답의 비용, 중간 재평가
오늘의 산출물 타임어택 로그 + 집계 결과 + "순서를 바꿨다면" 시뮬레이션 메모

2-1. 예선의 게임 구조 — 커트라인은 총점이 정한다

국내 대회 예선은 보통 8시간 안팎에 수십 문제가 열립니다. 배점은 문제마다 다르고, 많은 대회가 다이내믹 스코어링(푼 팀이 많을수록 배점이 내려가는 방식)을 씁니다. 그래서 전략의 축은 단순합니다 — 남들이 푸는 문제는 반드시 풀고 (놓치면 배점 방어에서 밀립니다), 남들이 못 푸는 문제 하나를 추가한다.

"남들이 푸는 문제"란 곧 쉬운~중간 문제들입니다. 즉 예선의 1차 승부는 쉬운 문제의 전수 확보이고, 속도 훈련의 목적은 바로 그 전수 확보를 시간 안에 끝내는 페이스를 만드는 것입니다.

2-2. 쉬운 것부터 전수 스캔 — 순서가 점수다

타임어택의 기본 전략은 세 단계입니다.

  1. 전수 스캔(15~20분): 열린 문제 전부를 훑고 제목·분야·배점을 봅니다. "즉시 풀림이 보이는가"만 판단합니다 — 풀기 시작하지 않습니다.
  2. 쉬운 것부터 쓸어 담기: 즉시 풀림이 보이는 문제부터 낮은 배점 순으로 처리합니다. 이 구간의 목표는 속도가 아니라 무실책입니다.
  3. 배점 순 공략: 남은 문제를 배점이 큰 순서대로, 단 각 문제에 시간 상한(아래 예산표)을 둡니다.

이 순서를 거꾸로 하면 — 처음부터 고배점 문제에 붙으면 — 3시간을 쓰고 0점인 최악의 그림이 나옵니다. 순서는 취향이 아니라 점수 구조에서 결정되는 전략입니다.

2-3. 시간 예산 — 막힘의 상한을 미리 정한다

8시간(480분) 타임어택의 시간 예산 예시입니다.

구간 시각 할 일 비고
전수 스캔 0:00~0:20 문제 전부 열람, 순서 확정 풀이 금지, 판단만
저배점 전수 0:20~2:00 100~200점 문제 전부 목표: 무실책
중간 재평가 3:00~3:10 남은 문제 재평가, 순서 조정 시계 기준, 문제 수 기준 아님
고배점 공략 2:00~6:30 배점 큰 순, 문제당 상한 90분 상한 초과 시 표시하고 전환
마감 6:30~8:00 풀린 것 정리, 플래그 형식 재확인, 미제출분 마무리 새 문제 착수 금지

핵심은 문제당 시간 상한입니다. 상한 없이 붙으면 한 문제가 대회 전체를 삼킵니다. 상한에 걸려 전환한 문제는 "사망"이 아니라 "보류"입니다 — 고배점을 다 돌고 시간이 남으면 돌아옵니다.

2-4. 오답의 비용 — 플래그 형식 확인 루틴

소재 원문의 지적입니다 — 플래그 오타·형식 실수가 은근히 점수를 깎습니다. 오답 제출의 비용은 셋입니다.

  • 시간: 재확인과 재제출에 빠지는 분
  • 페널티: 오답 제출 횟수당 감점을 두는 대회가 있습니다 — 규칙을 시작 전에 반드시 읽습니다
  • 리듬: "맞는 줄 알았던" 문제로 되돌아가는 정신적 비용

그래서 제출 전 10초 루틴을 몸에 붙입니다: ① 대회의 플래그 접두사 확인(대회마다 flag{}, CTF{}, CODEGATE{} 등으로 다릅니다), ② 앞뒤 공백·개행 제거, ③ 복사가 아니라 화면과 한 글자씩 대조. 이 10초가 오늘 훈련에서 가장 저렴한 득점 장비입니다.


3. 따라 하기

3-1. 문제 세트 설계 — 예선의 축소판

Step 298에서 정리한 출제 경향 분석표를 꺼내세요. 그 비중대로 10문제를 고릅니다 — 예선에서 Web이 30%였다면 세트에도 Web 3문제가 들어갑니다. 구성 예시(화면 예시):

분야 혼합 10문제 세트 (배점 총 2200점)
Crypto    100 warmup-caesar    / 200 xor-repeating   / 300 rsa-smalle
Web       100 robots-txt       / 200 cookie-role     / 400 ssti-note
Forensics 100 exif-hidden      / 300 pcap-login
Pwn       200 ret2win-basic
Rev       300 crackme-serial

읽는 법: 난이도는 쉬움~중간으로 제한합니다. 이 훈련의 목적은 고난도 돌파가 아니라 커트라인 근처의 점수를 전부 회수하는 페이스이므로, 예선에서 실제로 만날 "아는 유형" 위주로 구성하는 것이 정답입니다. 모르는 유형의 연습은 특훈 시간의 몫입니다.

선정 기준을 한 줄로 적어 두세요 — "예선 경향 분석표의 비중 + 내가 90분 안에 풀 수 있는 것". 이 기준이 없으면 세트가 그냥 좋아하는 문제 모음이 됩니다.

3-2. 로그 양식 — 기록이 없으면 훈련이 아니라 게임이다

타이머를 시작하기 전에 기록 양식을 엽니다. 문제당 한 줄, 다섯 칸입니다.

문제 | 분야 | 배점 | 착수 시각 | 완료 시각 | 오답 횟수

실시간 기록의 규칙은 두 가지입니다. 착수할 때와 완료할 때만 적습니다 (기록 자체가 시간을 먹으면 안 됩니다). 오답은 제출 직후 바로 +1 합니다 (나중에 기억으로 세면 반드시 누락됩니다).

이 양식이 Step 299 전체의 핵심 산출물입니다. 8시간의 풀이는 하루가 지나면 흐려지지만, 이 표는 집계 스크립트의 입력이 되어 영구히 분석 가능합니다.

3-3. 타임어택 실행 — 3시간 재평가가 승부를 가른다

타이머를 8시간으로 걸고 시작합니다. 0:00~0:20의 전수 스캔에서 순서를 확정하고, 저배점부터 쓸어 담습니다. 풀이 자체는 여러분이 12개 대회 사이클에서 다져 온 것 그대로입니다 — 오늘 새로 연습하는 것은 배분입니다.

3:00이 되면 진행 중이던 문제를 멈추고 10분간 재평가합니다. 화면 예시:

[3:00 중간 재평가] (화면 예시)
해결: 100×3 + 200×2 = 700점 (저배점 전수 완료)
진행 중: pcap-login (300점, 42분째) — Wireshark 필터는 잡았으나 자격증명 추출이 안 됨
남은 것: crackme-serial(300), rsa-smalle(300), ssti-note(400)
판단: pcap-login은 보류 표시 → crackme-serial로 전환 (자신 있는 유형)
      rsa-smalle는 마지막 순번으로 (시간 대비 불확실)

읽는 법: 재평가의 질문은 하나입니다 — "지금 진행 중인 문제의 다음 30분이, 다른 문제의 30분보다 점수 기대값이 높은가?" pcap-login에 42분을 썼다는 사실은 판단 근거가 아닙니다. 이미 쓴 시간은 돌아오지 않고(매몰 비용), 앞으로의 30분만이 자원입니다.

3-4. 집계 — 스크립트로 감이 아닌 수를 본다

종료 후, 로그를 집계 스크립트에 넣습니다. 아래는 집계기의 핵심 로직입니다 (step299_tally.py — 로그는 스크립트 안의 표를 자기 것으로 교체).

입력 (step299_tally.py 일부)

@dataclass
class Attempt:
    name: str        # 문제 이름
    cat: str         # 분야
    pts: int         # 배점
    start_min: int   # 착수 시각(대회 시작 기준 분)
    end_min: int | None  # 완료 시각. None이면 미해결
    wrong: int       # 틀린 플래그 제출 횟수
python step299_tally.py
=== 10문제 타임어택 집계 (제한 480분) ===
[O] warmup-caesar   Crypto    100점   18분  오답 0  (5.6점/분)
[O] robots-txt      Web       100점   23분  오답 1  (4.3점/분)
[O] exif-hidden     Forensics 100점   25분  오답 0  (4.0점/분)
[O] xor-repeating   Crypto    200점   39분  오답 0  (5.1점/분)
[O] cookie-role     Web       200점   47분  오답 2  (4.3점/분)
[O] ret2win-basic   Pwn       200점   76분  오답 0  (2.6점/분)
[X] pcap-login      Forensics 300점   ---  오답 1
[O] crackme-serial  Rev       300점   86분  오답 0  (3.5점/분)
[X] rsa-smalle      Crypto    300점   ---  오답 0
[O] ssti-note       Web       400점  138분  오답 1  (2.9점/분)
----------------------------------------------------
해결 8/10  득점 1600/2200 (73%)
틀린 제출 합계 5회  사용 시간 452분 (잔여 28분)
분야별: Crypto 300/600  Web 700/700  Forensics 100/400  Pwn 200/200  Rev 300/300
미해결: pcap-login(300점), rsa-smalle(300점)

(2026-09-09 실측 — 로컬 스크립트 실행 결과. 문제 로그는 가공 샘플입니다.)

출력 읽는 법: 세 줄을 봅니다. ① 득점률 73% — 완료 기준 60%를 넘었습니다. ② 분야별 줄 — Web/Pwn/Rev는 만점인데 Forensics가 100/400입니다. 실력이 아니라 배분의 문제입니다 (pcap-login에 시간을 쓰다 보류). ③ 점/분 열 — ssti-note는 2.9점/분으로 가장 비쌌지만 400점을 가져왔으니 정당한 투자입니다. 숫자가 감으로는 안 보이던 그림을 보여 줍니다.

3-5. "순서를 바꿨다면" — 한 가지 가정만 바꿔 본다

마지막 분석입니다. 로그를 보며 하나의 가정을 세웁니다: "3시간 재평가에서 pcap-login을 보류하지 않고 계속 붙었다면?" 남은 시간 180분 중 pcap-login 해결에 필요했을 시간을 추정해 봅니다. 화면 예시:

[가정] pcap-login 계속 진행 시 (화면 예시)
추정: 자격증명 추출까지 +60분, 총 102분 투입 → 해결 확률 반반
기회비용: 그 60분이면 crackme-serial(86분)은 불가 → -300점
결론: 기대값 -150점 — 보류 판단이 정답이었다

읽는 법: 이 시뮬레이션의 목적은 후회가 아니라 판단 규칙의 검증입니다. "보류가 맞았다"가 확인되면 그 규칙은 예선 전략 문서에 들어가고, 틀렸다면 규칙을 고칩니다. 어떤 결과든 다음 대회의 전략이 단단해집니다 — 이것이 속도 훈련의 마지막 공정입니다.


4. 미션과 연습문제

미션 — 10문제 타임어택 완주와 집계

  1. Step 298의 경향 분석표 비중대로 분야 혼합 10문제 세트를 설계합니다 (배점 총점과 선정 기준 한 줄을 적을 것).
  2. 2-3의 시간 예산표를 자기 버전으로 조정한 뒤, 8시간 타임어택을 실행합니다 — 전수 스캔과 3시간 재평가를 반드시 거칩니다.
  3. 문제별 착수/완료/오답을 실시간으로 기록합니다.
  4. 집계 스크립트로 득점률·분야별 득점·점/분을 계산합니다.
  5. "순서를 바꿨다면" 시뮬레이션을 한 가지 가정으로 수행하고, 판단 규칙 하나를 문장으로 확정합니다.

연습문제

문제 1. "쉬운 문제부터 전수 스캔" 전략이 다이내믹 스코어링 대회에서 특히 유효한 이유를, 배점의 움직임 관점에서 설명해 보세요.

문제 2. 문제당 시간 상한을 정할 때 "이 문제의 남은 가치"와 함께 반드시 비교해야 하는 것은 무엇인가요? 3-3의 재평가 질문을 근거로 답해 보세요.

문제 3. 오답 제출의 비용 세 가지를 열거하고, 제출 전 10초 루틴이 그중 어떤 비용을 줄이는지 대응시켜 보세요.

문제 4. 3-4의 집계 결과에서 Forensics가 100/400으로 나왔습니다. 이것이 "Forensics 실력 부족"을 뜻하지 않을 수 있는 이유를, 집계표의 다른 수치를 근거로 설명해 보세요.


5. 모범 답안과 완료 기준

미션 모범 답안

검증 기준으로 확인하세요.

  1. 세트 설계의 근거: 10문제의 분야 비중이 Step 298 경향 분석표와 대응하고, "선정 기준 한 줄"이 적혀 있는가.
  2. 예산표의 존재: 전수 스캔·중간 재평가·문제당 상한이 포함된 시간 예산이 시작 전에 확정됐는가 — 타임어택 중에 만든 예산은 예산이 아니라 변명입니다.
  3. 로그의 완결성: 10문제 전부에 착수/완료/오답이 기록됐는가. 오답 0회로만 가득한 로그는 기록 누락을 의심해 보세요.
  4. 집계와 판단 규칙: 득점률 60% 이상(완료 기준), 그리고 시뮬레이션에서 확정한 판단 규칙이 "조건 → 행동"의 문장인가. 예: "상한 90분 초과 시 → 보류 표시하고 다음 배점 문제로."

연습문제 해답

문제 1 해답. 다이내믹 스코어링에서는 푼 팀이 늘수록 그 문제의 배점이 내려갑니다. 쉬운 문제는 대부분의 팀이 풀기 때문에, 이를 늦게 풀거나 놓치면 ① 내려간 배점을 뒤늦게 받거나 ② 아예 0점이 되어 상대적으로 큰 격차가 생깁니다. 반대로 어려운 문제는 푼 팀이 적어 배점이 유지되므로 나중에 공략해도 가치 손실이 작습니다. 그래서 쉬운 문제의 조기 전수 확보는 단순한 성격이 아니라 배점 방어 전략입니다.

문제 2 해답. 같은 30분을 다른 문제에 썼을 때의 기대 점수, 즉 기회비용입니다. 3-3의 재평가 질문 — "진행 중인 문제의 다음 30분이 다른 문제의 30분보다 기대값이 높은가" — 이 바로 그 비교입니다. 이미 쓴 시간(매몰 비용)은 비교 항목에 넣지 않습니다. 돌아오지 않는 자원은 판단의 근거가 될 수 없기 때문입니다.

문제 3 해답. 비용은 ① 시간(재확인·재제출), ② 오답 페널티 감점, ③ 리듬 붕괴(맞다고 믿었던 문제로의 회귀)입니다. 10초 루틴 — 접두사 확인, 공백 제거, 한 글자 대조 — 은 세 비용의 공통 원인인 "형식성 오답" 자체를 예방하므로 셋 모두를 줄입니다. 특히 페널티가 있는 대회에서는 감점을 직접 막는 유일한 장비입니다.

문제 4 해답. 집계표에서 Forensics의 미해결은 pcap-login 하나이고, 같은 분야의 exif-hidden은 25분 만에 오답 0으로 해결됐습니다. 또한 pcap-login은 재평가에서 "보류"로 전략적으로 버린 문제이지 끝까지 붙잡고 실패한 문제가 아닙니다. 즉 낮은 득점의 원인이 "못 풀어서"인지 "배분상 안 풀어서"인지는 착수 시간과 전환 기록이 구분해 줍니다 — 이 구분이 없으면 복기 방향을 실력 보강으로 잘못 잡습니다.

완료 기준 체크리스트

  • [ ] 경향 분석표 비중에 맞는 10문제 세트를 선정 기준과 함께 설계했다
  • [ ] 전수 스캔·문제당 상한·마감 구간이 있는 시간 예산표를 시작 전에 확정했다
  • [ ] 8시간 타임어택에서 3시간 재평가를 실행하고 순서 조정 여부를 기록했다
  • [ ] 문제별 착수/완료/오답 로그가 10줄 완결됐다
  • [ ] 집계 스크립트로 득점률·분야별·점/분을 계산했다
  • [ ] 득점률 60% 이상을 달성했다 (미달 시 재평가 기록 분석 후 1회 재시도)
  • [ ] "순서를 바꿨다면" 시뮬레이션으로 판단 규칙 하나를 문장으로 확정했다

6. 흔한 실수와 해결

벽 1. 전수 스캔 중에 첫 문제를 풀기 시작해 버려요

증상: "이건 바로 풀리겠는데?" 하며 15분 스캔이 1시간 풀이가 됩니다.

원인: 전수 스캔의 목적을 오해한 것입니다 — 스캔은 풀이가 아니라 순서 결정입니다.

해결: 스캔 중에는 손을 키보드에서 떼는 규칙을 쓰세요. 각 문제에 "즉시/고민/보류" 세 글자만 적고 닫습니다. 즉시 판정이 난 문제가 스캔 직후의 첫 먹이입니다 — 스캔이 끝나야 전체 지도가 보이고, 그때의 첫 문제가 진짜 첫 문제입니다.

벽 2. 문제당 상한을 정했는데 지키지 못해요

증상: "거의 다 풀었는데" 하며 상한을 20분, 40분 넘깁니다.

원인: 거의 다 푼 느낌은 CTF에서 가장 흔한 착각입니다 — 마지막 10%가 90%의 시간을 쓰는 문제가 존재합니다.

해결: 상한은 타이머로 강제하세요 — 착수 시각에 상한 시각의 알람을 함께 겁니다. 알람이 울리면 조건 없이 "보류" 표시 후 전환합니다. 진짜 거의 다 풀었다면 고배점 공략 후 잔여 시간에 돌아오면 됩니다 — 보류는 포기가 아니라 순서 변경입니다.

벽 3. 플래그를 맞게 구했는데 제출이 계속 틀려요

증상: 분명 맞는 내용인데 Incorrect flag가 반복됩니다.

원인: 대부분 형식입니다 — 접두사가 대회 규정과 다르거나, 복사에 앞뒤 공백·개행이 끼었거나, 플래그 안의 중괄호/밑줄을 바꿔 읽은 경우입니다.

해결: 2-4의 10초 루틴을 실행하세요. 그래도 틀리면 문제 페이지의 플래그 형식 안내를 다시 읽습니다 — 대회마다 다릅니다. 오늘 훈련에서 이 경험을 한 것은 행운입니다. 오답 로그에 형식 실수로 기록해 두면, 예선 당일 같은 함정은 10초로 걸러집니다.

벽 4. 8시간을 앉아 있으니 후반에 집중이 무너져요

증상: 5~6시간째부터 같은 출력을 멍하니 봅니다.

원인: 예선은 체력 경기이기도 합니다 — 8시간 집중은 훈련 없이는 나오지 않습니다.

해결: 휴식도 예산에 넣으세요 — 2시간마다 10분 이석(물, 스트레칭, 화면에서 눈 떼기)을 예산표에 인쇄해 둡니다. 이석도 전략의 일부로 기록하면 죄책감 없이 쉴 수 있습니다. 그리고 식사는 가볍게 — 포만감은 집중의 적입니다.

벽 5. 득점률이 60%를 못 넘겼어요

증상: 열심히 했는데 기준 미달입니다.

원인: 둘 중 하나입니다 — 세트가 내 수준보다 어렵거나(설계 문제), 배분이 무너졌거나(전략 문제).

해결: 집계표로 구분하세요. 점/분이 전반적으로 낮고 막힌 문제가 쉬운 배점대에도 있으면 설계 문제 — 난이도를 한 단계 낮춰 세트를 다시 만듭니다. 쉬운 문제는 빠른데 한두 문제가 시간을 삼켰다면 전략 문제 — 상한 강제(벽 2)를 고치고 재시도합니다. 미달은 실패가 아니라 다음 세트의 설계 데이터입니다.


7. 정리

오늘의 개념

개념 한 줄 설명
쉬운 것부터 전수 스캔 스캔으로 순서를 정하고, 저배점부터 무실책으로 회수하는 예선 기본 전략
시간 예산 전수 스캔/재평가/문제당 상한/마감의 사전 배분표 — 중간에 만들면 예산이 아니다
문제당 상한 한 문제가 대회를 삼키는 것을 막는 알람 — 초과 시 "보류" 후 전환
매몰 비용 이미 쓴 시간은 판단 근거가 아니다 — 비교는 항상 "다음 30분"끼리
중간 재평가 3시간 시점의 10분 — 남은 문제의 기대값을 다시 계산해 순서를 조정
오답의 비용 시간 + 페널티 + 리듬 — 제출 전 10초 루틴이 가장 저렴한 방어

오늘의 도구·서식

도구·서식 하는 일
문제 로그 양식 (5칸) 착수/완료/오답의 실시간 기록 — 집계의 입력
시간 예산표 8시간을 구간으로 나눈 실행 계획
step299_tally.py 로그 → 득점률·분야별·점/분 집계
"순서를 바꿨다면" 시뮬레이션 한 가지 가정으로 판단 규칙을 검증하는 복기

명령어보다 중요한 감각

속도 훈련에서 기르는 것은 손의 속도가 아니라 판단의 속도입니다. 막혔을 때 3초 안에 "계속/보류"를 정하는 것, 오답이 나왔을 때 당황 대신 10초 루틴을 돌리는 것, 시계를 보며 죄책감 없이 쉬는 것 — 이 작은 판단들의 합이 예선의 총점입니다.

그리고 기억하세요 — 오늘의 집계표는 예선 당일의 전략 문서가 됩니다. "나는 저배점을 25분에 하나씩 회수한다", "나는 90분 상한에서 전환할 때 오히려 점수가 오른다" 같은 문장들이, 감이 아니라 데이터로 쓰인 여러분의 전략입니다.


전부 체크되면 Step 299 완료입니다. 사이드바의 체크박스를 눌러 진도를 저장하세요.