Step 285. ★ CTF #4: 약점 분야 공략 대회 — 잘하는 것을 잠깐 내려놓는 용기
Level 3 — CTF 대회 사이클 | 난이도 ★★★★☆ | 예상 소요 시간 2일 (대회 참가 주말 + 사전 준비)
전제: Step 284의 팀 회의 — 약점 분야 합의, 담당자 지정, 집중 학습 계획이 회의록으로 남아 있어야 합니다.
- 준비물: CTFtime(
ctftime.org)에서 고른 주말 대회, Step 284의 회의록, 약점 분야 담당자의 치트시트, 팀 상태표. 대회 화면과 결과 장면은 화면 예시입니다 — 여러분이 참가하는 대회의 문제와 점수는 당연히 다릅니다. - ⚠️ 이 챕터의 실습은 내 랩·합법 플랫폼 전용입니다. 허가 없는 시스템에 적용하면 범죄입니다. CTF 대회는 주최 측이 문제 서버를 공격하라고 여는 합법 무대이며, 대회 인프라(스코어보드 서버 등)와 타 팀 환경은 공격 대상이 아닙니다.
- 이 챕터는 대회 챕터입니다 — 새 도구는 없고, "약점을 정면으로 공략하는 대회 운영"이라는 하나의 실험이 전부입니다.
지난 회의에서 팀은 약점을 숫자로 확인했고, 담당자는 2주간 그 분야를 집중 학습했습니다. 이제 남은 질문은 하나입니다 — 학습이 실전에서 통하는가. 이 대회는 그 답을 재는 시험지입니다.
여기에 전략적 긴장이 하나 있습니다. 잘하는 분야로 점수를 챙기면 순위는 오르지만 약점은 그대로이고, 약점에만 매달리면 점수가 무너집니다. 오늘의 해법은 미리 합의해 두는 시간 배분 룰입니다 — 그리고 이 대회의 진짜 목표는 순위가 아니라 "약점 분야에서의 도달 깊이 진전"입니다. 목표가 바뀌면 대회를 운영하는 손이 바뀝니다.
1. 학습 목표
이 챕터를 끝내면 다음을 할 수 있습니다:
- 의도적 불편 훈련(deliberate discomfort)의 원리를 설명하고 대회에 적용한다
- 약점 분야 공략과 기본 점수 확보를 나누는 시간 배분 룰을 설계한다
- 치트시트 사전 공유로 담당자 1인의 학습을 팀의 자산으로 바꾼다
- 해결 여부와 무관하게 "도달 깊이"를 측정해 성장을 계량한다
- 대회 후 "첫 플래그" 또는 "다음에 필요한 한 발"을 회고로 정리한다
2. 배경 지식 — 오늘의 도구와 개념
오늘의 도구 한눈에 보기
| 구분 | 내용 |
|---|---|
| 언어·환경 | CTFtime 주말 대회 (Jeopardy), 팀 상태표, 채팅/화면 공유 |
| 오늘의 명령 | 없음 — 대회 자체가 실습. 사전 준비물은 치트시트와 배분 룰 |
| 필요한 개념 | 의도적 불편 훈련, 시간 배분 룰(약점 30%), 도달 깊이, 페어 착수 |
| 오늘의 산출물 | 대회 로그 + 도달 깊이 기록 + 회고 (첫 플래그 또는 다음 한 발) |
2-1. 의도적 불편 훈련 — 편한 연습은 실력을 안 올린다
운동 생리학에 의도적 연습(deliberate practice) 이라는 원리가 있습니다 — 실력이 오르는 연습은 현재 능력의 바깥, 불편한 지점에서만 일어난다는 것입니다. 이미 풀 수 있는 문제를 다시 푸는 것은 유지이지 성장이 아닙니다.
CTF 팀에게 이 원리를 적용하면 이렇게 됩니다 — 잘하는 분야로 대회를 치르면 점수는 나오지만 팀의 체급은 그대로입니다. 약점 분야를 정면으로 공략하는 대회는 점수 효율이 나쁘지만, 첫 플래그 하나가 팀 전체의 지도를 바꿉니다. 그 분야가 "아예 손도 못 대는 땅"에서 "시간을 쓸 가치가 있는 땅"으로 바뀌는 순간입니다.
단, 이 훈련에는 순서가 있습니다. Step 284 회의 → 담당자 집중 학습(2주) → 오늘의 실전 검증. 학습 없이 불편함만 택하는 것은 훈련이 아니라 그냥 지는 대회입니다.
2-2. 시간 배분 룰 — 약점 30% 원칙
약점 공략 대회의 가장 흔한 실패는 "약점에 빠져 기본 점수를 놓치는 것"입니다. 그래서 시작 전에 팀 전체 시간의 배분을 숫자로 합의합니다.
| 용도 | 비율 | 내용 |
|---|---|---|
| 기본 점수 | 60% | 주력 분야 Easy~Medium — 순위 방어선 |
| 약점 공략 | 30% | 담당자+1명 페어가 약점 분야 문제에 고정 착수 |
| 유동 예비 | 10% | 막힌 문제의 스왑, 끝물 화력 집중 |
왜 하필 30%인가 하면 — 50%를 넘기면 기본 점수가 무너져 팀 사기가 흔들리고, 10%대면 한 문제의 정찰도 끝나기 전에 시간이 닳습니다. 30%는 "쉬운 약점 문제 2~3개에 페어가 진지하게 붙을 수 있는" 최소 시간입니다. 비율은 팀마다 조정해도 되지만, 숫자로 합의한다는 형식만은 바꾸지 마세요 — "적당히"는 대회 중에 항상 0으로 수렴합니다.
비율의 뜻을 정확히 이해하세요 — "30%만 쓰라"가 아니라 "30%는 반드시 약점에 쓴다" 입니다. 점수가 안 나와도 그 시간을 회수하지 않습니다. 이 약속이 없으면 대회 중반의 조급함이 약점 공략 시간을 잡아먹고, 팀은 또다시 "잘하는 것만 하는 대회"를 치릅니다.
2-3. 도달 깊이 — 못 풀어도 측정된다
약점 분야 문제는 못 풀 가능성이 높습니다. 그래서 성공/실패 이분법 대신 도달 깊이를 기록합니다 — 문제의 어느 층위까지 뚫고 들어갔는가.
| 층위 | 기준 (Web 분야의 예) |
|---|---|
| L0 미착수 | 문제를 열지 않음 |
| L1 이해 | 문제가 요구하는 기술이 무엇인지 식별함 |
| L2 재현 | 관련 기법의 공격을 로컬/도구로 시도함 |
| L3 근접 | 플래그의 위치/조건까지 특정함 — 마지막 한 단계 실패 |
| L4 해결 | 플래그 제출 |
이 표의 힘은 전회 대비 비교에 있습니다. "이번에도 0점"과 "전회 L1에서 이번엔 L3"는 같은 0점이지만 완전히 다른 결과입니다. 소재의 지시 — 해결 여부와 무관하게 도달 깊이를 측정한다 — 는 이 표로 구현합니다.
2-4. 치트시트 공유 — 1인 학습의 팀 자산화
담당자가 2주간 학습한 것은 대회 전날, 한 장짜리 치트시트로 팀에 공유되어야 합니다. 이유는 두 가지입니다.
첫째, 대회 중 담당자가 잠들거나 막히면 다른 팀원이 치트시트로 이어받을 수 있습니다. 둘째, 치트시트를 쓰는 행위 자체가 학습의 완성입니다 — 남이 읽을 한 장으로 압축하지 못하는 지식은 아직 흐린 지식입니다(Step 278의 설명 가능성과 같은 원리).
치트시트의 네 칸은 이렇게 잡습니다 — 개념 한 줄 / 신호(이 문제가 그 유형이라는 징후) / 도구와 명령 / 함정. 신호 칸이 핵심입니다. 대회에서 필요한 것은 지식이 아니라 "이 문제가 내 치트시트의 문제라는 것을 알아보는 눈"이기 때문입니다.
3. 따라 하기
3-1. 대회 전날 — 치트시트 공유와 배분 룰 확정
담당자가 치트시트를 팀 채널에 올리고, 15분짜리 미니 브리핑을 합니다. 읽는 시간 5분, 질의 10분이면 충분합니다.
화면 예시 (약점 분야 = Forensics로 정한 팀의 치트시트 일부):
[Forensics 치트시트 — pcap 편] 담당: A
- 개념: pcap은 패킷의 통짜 기록. 플래그는 평문 프로토콜(HTTP/FTP)에 있다
- 신호: .pcap/.pcapng 첨부 + "네트워크를 덤프했다"는 문제 설명
- 도구: Wireshark → Statistics > Conversations, Follow > TCP Stream
명령행: tshark -r dump.pcap -Y "http" -T fields -e http.file_data
- 함정: 스트림이 수백 개면 필터 먼저. 전부 읽으면 시간 끝남
그다음 배분 룰을 합의합니다. 3-3의 상태표 양식에 배분 칸을 미리 적어 두세요 — 합의는 문서에 새겨야 대회 중에도 살아남습니다.
3-2. 대회 시작 — 첫 30분은 정찰이다
시작과 동시에 문제 목록을 전원이 훑습니다. 목적은 두 가지 — 약점 분야 문제의 목록 확정, 그리고 기본 점수용 Easy 문제의 배정.
화면 예시 (첫 정찰 결과 메모):
대회 문제판 (출제 22):
- Web 5 / Pwn 4 / Crypto 4 / Reversing 4 / Forensics 5
- 약점 분야(Forensics) 5문제: pcap-2(100), mem-artifact(200), disk-1(300), stego-mix(300), timeline(400)
- 기본 점수 후보: Web Easy 2, Crypto Easy 2 → C와 D에게 배정
- 약점 착수: A(담당)+B(페어) → pcap-2부터
읽는 법: 약점 분야 문제가 생각보다 많게(5문제) 나왔습니다 — 이때 조급해지지 마세요. 목표는 전부 푸는 것이 아니라 가장 쉬운 것에서 도달 깊이를 새기는 것입니다. 점수가 아니라 난이도 순으로 착수합니다.
3-3. 대회 중반 — 페어 착수와 깊이 기록
약점 페어의 운영 규칙은 세 가지입니다.
- 한 화면, 두 사람 — 담당자가 운전하고 페어가 기록합니다. 조사와 코딩을 나눠도 되지만, 판단은 함께 내립니다.
- 30분마다 깊이 갱신 — 상태표에 "pcap-2: L2 진입 (tshark 필터 완성, 스트림 300개에서 HTTP 3개 추출)"처럼 현재 층위를 적습니다.
- 치트시트 대조 — 막힐 때마다 치트시트의 "신호" 칸으로 돌아가 이 문제가 정말 그 유형인지 확인합니다. 유형 오독은 약점 분야에서 가장 흔한 시간 낭비입니다.
화면 예시 (상태표의 깊이 기록):
14:00 pcap-2: L1 — 평문 HTTP 확인. 치트시트 2번 유형과 일치
15:00 pcap-2: L2 — TCP 스트림 추출, 로그인 POST 발견. 쿠키 인코딩 분석 중
16:00 pcap-2: L3 — 플래그 조건 특정 (관리자 세션 재사용). 쿠키 복호화 실패
16:30 mem-artifact로 이동 — pcap-2는 L3으로 마감
3-4. 끝물 2시간 — 배분 룰의 재점검
종료 2시간 전, 팀 전체를 멈추고 묻습니다 — "배분 룰을 지켰는가?" 기본 점수 60%가 확보됐다면 유동 예비 10%를 약점 분야의 L3 문제에 쏟습니다. 확보가 안 됐다면 — 그것이 이 대회의 뼈아픈 발견입니다 — 예비를 기본 점수로 돌립니다.
약점 공략의 시간을 끝물에 회수하고 싶은 유혹이 반드시 옵니다. 이때 회의록 문장을 다시 읽으세요 — "이 대회의 목표는 순위가 아니라 도달 깊이 진전이다." 목표를 대회 중에 바꾸는 것은 실험을 오염시키는 일입니다.
3-5. 종료 직후 — 30분 회고
대회가 끝나면 식기 전에 회고합니다. 질문은 두 개뿐입니다.
Q1. 첫 플래그가 나왔는가?
→ 나왔다면: 무엇이 통했나 — 치트시트의 어느 칸이 결정적이었나
→ 안 나왔다면: 최고 도달 깊이는 몇 층인가, 다음 한 발은 무엇인가
Q2. 배분 룰은 지켜졌는가?
→ 60/30/10이 실제로 몇 대 몇이었나
화면 예시 (회고 메모):
- Forensics 첫 플래그 없음. 최고 깊이: pcap-2 L3 (전회 L1 → 이번 L3)
- 다음 한 발: 세션 쿠키 복호화 — "암호화 쿠키" 유형이 벽. Step 288 특훈 후보
- 배분 실측: 55 / 25 / 20 — 끝물에 유동이 기본 점수로 샜다. 다음엔 2시간 전 점검을 1시간 더 앞당긴다
- 결론: 목표 달성 (도달 깊이 진전 확인). pcap-2는 복기 블록 A에서 끝까지 판다
4. 미션과 연습문제
미션 — 약점 분야 공략 대회 완주
- Step 284 회의록의 약점 분야를 확인하고, 담당자의 치트시트(4칸)를 대회 전날 공유합니다.
- 대회 시작 전 60/30/10 배분 룰을 상태표에 새깁니다.
- 약점 분야 문제에 담당자+1명 페어로 착수하고, 30분마다 도달 깊이(L0~L4)를 상태표에 기록합니다.
- 종료 2시간 전에 배분 룰 준수 여부를 점검하고 유동 예비의 행방을 결정합니다.
- 종료 직후 30분 회고로 "첫 플래그 또는 다음 한 발"을 문장으로 남깁니다.
연습문제
문제 1. 의도적 불편 훈련이 "그냥 어려운 문제를 붙잡고 있는 것"과 다른 점은 무엇인가요? 전제 조건 관점에서 답해 보세요.
문제 2. 약점 공략에 30%를 배정하는 룰에서, "최대 30%"가 아니라 "반드시 30%"로 정해야 하는 이유는 무엇인가요?
문제 3. 도달 깊이(L0~L4)를 기록하는 것이 성공/실패 이분법보다 나은 점을 두 가지 드세요.
문제 4. 치트시트의 "신호" 칸이 다른 칸(개념/도구/함정)보다 대회 중에 더 자주 쓰이는 이유는 무엇인가요?
5. 모범 답안과 완료 기준
미션 모범 답안
검증 기준으로 확인하세요.
- 치트시트의 존재: 4칸(개념/신호/도구/함정)이 채워진 한 장이 대회 전에 공유됐는가 — 대회 후에 만든 치트시트는 이번 대회의 도구가 아닙니다.
- 배분 룰의 사전 합의: 대회 시작 전 상태표에 60/30/10이 적혀 있는가 — 종료 후에 추정한 비율은 룰이 아니라 변명입니다.
- 깊이 기록의 연속성: 상태표에 30분 단위의 층위 갱신이 남아 있는가 — 종료 후에 한꺼번에 쓴 기록은 기억의 재구성이라 오차가 큽니다.
- 끝물 점검의 흔적: 2시간 전 점검에서 내린 결정(예비의 행방)이 기록되어 있는가.
- 회고의 문장화: "첫 플래그" 또는 "다음 한 발"이 한 문장 이상으로 남았는가 — "아쉬웠다"는 회고가 아니라 감상입니다.
연습문제 해답
문제 1 해답. 전제 조건 — 사전 학습이 있느냐입니다. 의도적 불편 훈련은 "집중 학습으로 준비한 뒤 실전에서 검증하는" 구조입니다. 학습 없이 어려운 문제를 붙잡는 것은 준비 없는 고통일 뿐, 실력의 재료가 쌓이지 않습니다. 불편함이 훈련이 되려면 그 전에 학습이, 그 후에 복기가 붙어야 합니다 — 불편함은 재료가 아니라 시험입니다.
문제 2 해답. 대회 중반의 조급함이 약점 시간을 반드시 잡아먹기 때문입니다. "최대 30%"는 점수 압박이 오는 순간 0%가 됩니다 — 인간은 익숙한 문제로 도망치도록 설계되어 있습니다. "반드시 30%"는 그 도망을 제도로 막습니다. 훈련 대회의 가치는 점수가 아니라 지도의 확장이므로, 그 확장 시간을 보장하는 것이 룰의 존재 이유입니다.
문제 3 해답. 첫째, 전회 대비 진전이 측정됩니다 — "전회 L1, 이번 L3"는 0점이지만 성장의 증거이고, 이분법에서는 둘이 구분되지 않습니다. 둘째, 다음 훈련의 좌표가 생깁니다 — L3에서 멈췄다는 기록은 "마지막 한 단계의 기술"을 특정해 주므로 복기와 특훈(Step 288)의 대상이 정확해집니다. 이분법의 0점은 어디를 고쳐야 할지 말해 주지 않습니다.
문제 4 해답. 대회에서의 첫 번째 의사결정이 "이 문제가 어떤 유형인가"이기 때문입니다. 개념·도구·함정은 유형이 확정된 다음에야 쓰이는 내용이고, 유형을 오독하면 나머지 세 칸은 전부 엉뚱한 문제에 소비됩니다. 신호 칸은 치트시트의 목차이자 잠금장치입니다 — 문제를 보고 치트시트를 펼지 말아야 할지를 판정하는 칸이기에 가장 자주, 가장 먼저 쓰입니다.
완료 기준 체크리스트
- [ ] 담당자의 치트시트(4칸)를 대회 전날 팀에 공유했다
- [ ] 60/30/10 배분 룰을 시작 전 상태표에 적었다
- [ ] 약점 분야 문제에 담당자+1명 페어로 착수했다
- [ ] 30분 단위로 도달 깊이(L0~L4)를 상태표에 기록했다
- [ ] 종료 2시간 전 배분 룰 준수를 점검했다
- [ ] 회고에서 "첫 플래그" 또는 "다음 한 발"을 문장으로 남겼다
- [ ] 최고 도달 깊이가 전회 대비 진전했음을 확인(또는 정체 원인을 기록)했다
- [ ] 못 푼 약점 문제를 복기 블록 A(Step 280 절차)로 넘겼다
6. 흔한 실수와 해결
벽 1. 대회 중반에 약점 공략을 포기하고 싶어져요
증상: 주력 분야 점수가 잘 나오는데 약점 페어는 L2에서 정체. "저 시간을 주력에 쓰면…"이라는 생각이 들기 시작합니다.
원인: 도달 깊이라는 지표가 없으면 약점 공략 시간은 "점수 0의 시간"으로만 보입니다 — 정상적인 조급함입니다.
해결: 상태표의 깊이 기록을 다시 읽으세요 — "L1 → L2 진입"은 점수판에는 없지만 실제로 일어난 전진입니다. 그리고 시작 전 합의 문장을 확인하세요 — 이 대회의 목표는 순위가 아니라 진전입니다. 목표를 기억하는 것이 룰을 지키는 힘입니다.
벽 2. 페어 착수가 그냥 담당자 혼자 하는 걸 지켜보는 형태가 됐어요
증상: 페어가 멍하니 화면만 봅니다. 도움이 안 되는 것 같습니다.
원인: 역할 분담 없이 "같이 보기"만 했습니다. 한 화면 두 사람도 역할이 있어야 작동합니다.
해결: 역할을 명시적으로 나누세요 — 담당자는 운전(도구 조작), 페어는 기록과 질문("지금 무슨 가설?", "치트시트의 어느 칸?"). 페어의 질문은 방해가 아니라 담당자의 사고를 소리 내게 만드는 장치입니다. 그리고 그 질문의 답이 곧 상태표의 깊이 기록이 됩니다.
벽 3. 치트시트를 만들었는데 대회에서 안 쓰이게 돼요
증상: 막상 문제를 여니 치트시트에 없는 유형이라 손을 못 댔습니다.
원인: 둘 중 하나입니다 — 학습한 유형과 출제 유형이 어긋났거나(운), 치트시트의 "신호" 칸이 비어 있어 유형 인식이 안 됐거나(실력).
해결: 후자라면 치트시트를 다시 쓰세요 — 문제의 어떤 단서가 이 유형을 알리는지, 학습 때 푼 문제들에서 공통 단서를 뽑아 신호 칸을 채웁니다. 전자라면 회고에 "출제 편차"로 기록하고 다음 대회를 기다리면 됩니다 — 한 대회의 출제로 학습 방향을 뒤집지 마세요.
벽 4. 약점 분야에서 첫 플래그가 나왔는데 팀 분위기가 이상해요
증상: 담당자만 신났고 나머지는 "우리가 한 게 없다"는 표정입니다.
원인: 약점 공략이 담당자 개인의 성과로만 프레임됐습니다. 실제로는 회의(284)가 방향을 정했고, 페어가 기록했고, 주력 팀이 60%를 지켜 줬기에 가능한 결과입니다.
해결: 회고에서 기여를 명시적으로 나누세요 — "이 플래그의 출발은 지난 회의의 약점 판정이다." 팀 스포츠에서 골은 넣은 사람의 것이지만 승리는 팀의 것입니다. 이 문화를 잡아 두지 않으면 다음 약점 담당자는 아무도 자청하지 않습니다.
벽 5. 배분 룰을 지켰는데 순위가 크게 떨어졌어요
증상: 전회보다 순위가 내려갔고, 팀원 중 누군가 불만을 표합니다.
원인: 훈련 대회와 성적 대회를 구분하지 않았습니다. 약점 공략 대회는 설계상 점수 효율이 낮습니다 — 그것이 이 대회의 비용이자 대가입니다.
해결: Step 283의 목표 설정을 떠올리세요 — 이번 대회의 행동 목표는 "약점 분야 도달 깊이 진전"이었고, 순위는 목표가 아니었습니다. 순위 목표는 Step 289의 중간 평가 대회처럼 성적 대회로 정한 판에서 추구합니다. 모든 대회를 성적 대회로 치르는 팀은 성장이 멈춥니다 — 대회마다 "이번은 무엇을 위한 판인가"를 정하는 것이 팀 운영의 핵심입니다.
7. 정리
오늘의 개념
| 개념 | 한 줄 설명 |
|---|---|
| 의도적 불편 훈련 | 학습으로 준비한 약점을 실전에서 검증하는 구조 — 준비 없는 고통과 다르다 |
| 시간 배분 룰 | 기본 60 / 약점 30 / 예비 10 — 조급함으로부터 훈련 시간을 지키는 제도 |
| 도달 깊이 (L0~L4) | 미착수부터 해결까지의 층위 — 0점 안의 전진을 측정하는 자 |
| 페어 착수 | 담당자+1명, 운전/기록 분담 — 1인 학습을 팀 자산으로 바꾸는 단위 |
| 치트시트 4칸 | 개념/신호/도구/함정 — 신호 칸이 유형 인식의 잠금장치 |
| 훈련 대회 vs 성적 대회 | 판의 목적을 미리 정한다 — 모든 대회를 성적으로 치면 성장이 멈춘다 |
오늘의 도구·서식
| 도구·서식 | 하는 일 |
|---|---|
| 치트시트 (한 장) | 담당자의 2주 학습을 팀이 쓰는 도구로 |
| 배분 룰 표 | 대회 중 판단이 흔들릴 때 돌아갈 약속 |
| 깊이 기록 상태표 | 30분 단위의 층위 갱신 — 0점의 시간을 전진으로 |
| 회고 2문 | 첫 플래그 or 다음 한 발 + 배분 룰 준수 여부 |
명령어보다 중요한 감각
오늘의 대회에서 여러분은 불편함을 선택했습니다. 잘하는 것으로 점수를 챙기는 편한 길을 두고, 지도의 빈칸으로 걸어 들어갔습니다. 그 불편함의 끝에 첫 플래그가 있었을 수도, L3의 벽이 있었을 수도 있습니다 — 둘 다 수확입니다. 벽의 위치가 정확히 기록됐다면, 다음 특훈(Step 288)은 그 좌표로 향하면 됩니다.
그리고 한 가지 더 — 약점을 공략하는 대회를 운영해 본 팀과 안 해 본 팀의 차이는 실력 이전에 태도에 있습니다. "우리는 못하는 것을 시험할 수 있는 팀이다"라는 자기 인식. 이것이 중간 평가 대회(Step 289)로 가는 길의 진짜 자산입니다.
전부 체크되면 Step 285 완료입니다. 사이드바의 체크박스를 눌러 진도를 저장하세요.