Step 293. ★ CTF #8: 팀 전술 실험 — 역할 로테이션, 점수를 버리고 팀의 지도를 얻는다
Level 3 — CTF 대회 사이클 | 난이도 ★★★☆☆ | 예상 소요 시간 2일 (대회 참가 + 전술 비교·회고 반일)
전제: Step 289~291의 대회 운영 경험, 팀 합의가 가능한 소규모 팀(2~5명), 파이썬 3(전술 비교 계산기용).
- 준비물: 팀이 참가할 CTF 대회 1개, 팀원 전원의 사전 합의, 지난 대회의 분야별 득점 기록, 파이썬 3. 이 챕터의 대회 장면은 화면 예시, 전술 비교 계산기 실행은 실측(2026-09-09, Python 3.12)으로 표시했습니다.
- ⚠️ 이 챕터의 실습은 내 랩·합법 플랫폼 전용입니다. 허가 없는 시스템에 적용하면 범죄입니다.
- 이 챕터는 실험 챕터입니다 — 이번 대회는 점수판이 아니라 데이터 수집 장치입니다.
여덟 번째 대회에서 일부러 점수를 버립니다. 평소의 분업 — 웹 담당은 웹만, 포너블 담당은 포너블만 — 은 점수 효율이 최고지만, 한 가지를 영원히 모르게 합니다. 팀의 취약 고리가 어디인지를. 웹 담당이 쓰러지면(졸업·취업·단순 결석) 그 분야는 그날로 전멸입니까? 아무도 답하지 못한다면, 그것이 답입니다.
오늘의 실험은 단순합니다. 전원이 비주력 분야를 맡아 한 대회를 치르고, 결과를 평소 분업의 데이터와 비교합니다. 단기 점수 하락은 예정된 비용입니다 — 그 비용으로 사는 것은 세 가지, ① 서브 분야 감각 ② 팀원 간 이해 ③ 취약 고리의 좌표입니다.
1. 학습 목표
이 챕터를 끝내면 다음을 할 수 있습니다:
- 역할 로테이션 실험의 사전 합의 사항(목적·배정·규칙)을 문서로 정한다
- 비주력 분야에서 "혼자서 어느 유형까지 되는가"를 측정한다
- 주력 담당자에게의 "컨설팅 요청" 절차와 지식 전수 시간을 기록한다
- 고정 분업 대비 득점·학습 효과를 표와 계산기로 비교한다
- 실험 데이터로 팀의 최종 전술(고정 + 유연 비율)을 확정한다
2. 배경 지식 — 오늘의 도구와 개념
오늘의 도구 한눈에 보기
| 구분 | 내용 |
|---|---|
| 언어·환경 | CTF 대회 플랫폼, 팀 공유 문서, 파이썬 3(전술 비교 계산기) |
| 오늘의 명령 | python step293_tactics.py — 고정 vs 로테이션 비교 계산 |
| 필요한 개념 | 역할 로테이션, 취약 고리(단독 대응 분야), 컨설팅 비용, 전술 비율 |
| 오늘의 산출물 | 전술 비교 데이터 + 취약 고리 지도 + 최종 전술 문서 |
2-1. 왜 실험인가 — 분업의 그림자
고정 분업은 정당합니다. 깊이는 반복에서 나오고, 대회 점수는 깊이에서 나옵니다. 그런데 분업이 반년 굳으면 그림자가 생깁니다.
| 그림자 | 증상 | 위험 |
|---|---|---|
| 단독 대응 | 분야별 담당이 1명 | 담당 부재 시 그 분야 전멸 |
| 블랙박스화 | "웹은 민수가 하니까" | 다른 팀원이 문제조차 못 읽음 |
| 강점의 고정 | 늘 같은 분야만 | 서브 재능의 발견 기회 상실 |
로테이션 실험은 이 그림자를 드러내는 대회입니다. 고치는 것은 다음 단계이고, 오늘은 좌표를 찍는 것이 목표입니다. 점수가 떨어지는 것은 결함이 아니라 측정의 정상 범위입니다.
2-2. 사전 합의 — "이번은 학습용"을 문서로
소재의 경고가 핵심입니다 — 실험 대회는 점수 하락이 정상이므로, 팀원 전원이 "이번은 학습용"에 합의하고 시작해야 불만이 없습니다. 구두 합의는 대회 중반에 흔들립니다. 문서로 남깁니다.
역할 로테이션 실험 합의서 (서식):
1. 목적: 점수가 아니라 팀 전술 데이터 수집. 점수 하락은 예정된 비용.
2. 배정: (예) 민수→rev, 지연→web, 현우→pwn, 수진→crypto
— 각자 주력이 아닌 분야. 관심 분야 우선 배정.
3. 규칙:
- 치트시트·라이브러리·팀 Write-up TOP 5 사용 자유 (혼자 풀기의 조건 그대로)
- 막히면 주력 담당자에게 '컨설팅' 요청 — 10분 타임박스, 화면 공유 금지(설명만)
- 컨설팅 받은 시간·내용을 기록
4. 금지: 대회 중 "그냥 내가 할까" — 컨설팅은 설명이지 대신 풀기가 아님
4번이 무너지면 실험이 무너집니다. 답답한 주력 담당자가 손을 대는 순간, "혼자서 어느 유형까지 되는가"의 데이터가 오염됩니다.
2-3. 컨설팅 — 지식 전수 비용의 측정
로테이션 중 막힌 문제는 주력 담당자에게 묻습니다. 이때의 요청이 평소의 "도와줘"와 다른 점은 양식입니다.
컨설팅 요청 양식:
문제: (이름/분야)
현재 상태: 어디까지 갔고, 무엇이 안 되는가 (2문장)
시도한 것: 버린 가설 목록 (빈 칸이면 요청 불가 — 아직 혼자 안 해 본 것)
질문: 다음에 무엇을 확인해야 하는가? (풀이를 달라는 말이 아니라 방향을 묻는다)
컨설팅 시간은 양쪽 모두의 비용입니다 — 받는 사람의 10분과 가르치는 사람의 10분. 종료 후 이 시간을 합산하면 지식 전수 비용이 나오고, 이것이 "분야 공백의 가격표"입니다. 담당 1명이 빠진 대회에서 팀이 치를 비용의 예상치이기도 합니다.
2-4. 전술 비율 — 실험의 목적지
실험의 끝은 "고정이 낫다/로테이션이 낫다"의 이분법이 아닙니다. 비율의 결정입니다. 평소에는 고정 분업으로 점수를 극대화하되, 대회 몇 회마다 로테이션을 끼워 넣을지, 각자 서브 분야를 하나씩 키워 "제2의 담당"을 둘지 — 데이터로 정하는 것입니다.
이 판단에 필요한 것이 두 표입니다 — 득점 비교표(비용)와 취약 고리 지도(수확). 3-4에서 계산기로 만듭니다.
3. 따라 하기
3-1. 사전 — 합의서 작성과 배정
대회 3일 전, 2-2의 합의서를 팀 문서에 쓰고 전원 확인을 받습니다. 배정의 원칙은 둘입니다.
- 주력이 아닌 것 중 관심 있는 것 — 의욕 없는 배정은 실험이 아니라 고문입니다.
- 대비가 큰 조합 우선 — 웹↔리버싱처럼 도구가 다른 조합일수록 학습이 큽니다.
배정이 정해지면 각자 준비물을 챙깁니다 — 해당 분야의 치트시트(Step 288), 라이브러리 템플릿(Step 290), 팀 Write-up TOP 5(Step 292). 로테이션은 맨손 격투가 아닙니다. 평소의 팀 자산을 쓴 상태에서 혼자 어느 유형까지 되는가를 재는 것이 정확한 측정입니다.
3-2. 대회 중 — 기록이 곧 실험 장비
대회 운영 자체는 평소와 같습니다. 다른 것은 기록입니다.
화면 예시 (개인별 기록 카드):
[민수 — rev 배정 (주력: web)]
14:00 crackme1 오픈. TOP 5의 'rev_crackme_xor' Write-up 먼저 정독 (15분)
14:30 XOR 키 추출까지 독립 진행 — "문자열 비교 구간 찾기" 유형까지는 혼자 됨
15:10 난독화 구간에서 정체. 컨설팅 요청 → 수진에게 10분 (방향: 동적 분석으로 전환)
15:40 해결. 기록: 독립 도달 = 정적 분석 단계까지 / 컨설팅 10분
측정 메모: "혼자서 되는 것: 단순 패치·문자열 추출 / 안 되는 것: 난독화 우회"
읽는 법: 마지막 줄이 이 실험의 통화입니다. "못 풀었다"가 아니라 "어디까지 혼자 되는가"의 경계선을 찍는 것. 이 경계선이 모이면 팀의 분야별 깊이 지도가 완성됩니다.
3-3. 종료 직후 — 컨설팅 로그 합산
종료되면 팀이 모여 컨설팅 로그를 합칩니다. 누가 누구에게, 몇 분을, 무엇을 물었는가.
화면 예시 (컨설팅 로그):
=== 컨설팅 로그 (대회 #8) ===
민수(rev) → 수진: 10분 — 동적 분석 전환 방향
지연(web) → 민수: 12분 — 인증 우회 가설 2개 검증
현우(pwn) → 지연: 20분×2회 — 힙 레이아웃 개념 자체 설명
수진(crypto) → 현우: 8분 — 문제 오독 정정
합산: 70분 (요청자 측) + 70분 (답변자 측) = 총 140분 소요
읽는 법: 현우의 "힙 레이아웃 개념 자체 설명" 40분이 가장 비싼 로그입니다 — 이것은 방향 지시로 해결되지 않고 개념 교육이 필요했다는 뜻, 즉 pwn 분야의 지식 전수 비용이 가장 크다는 신호입니다. 취약 고리 후보 1순위입니다.
3-4. 전술 비교 계산기 — 비용과 수확의 대치
고정 분업(이전 대회)과 로테이션(이번 대회)의 데이터를 계산기에 넣습니다. 아래가 실제로 작성해 실행한 step293_tactics.py의 출력입니다 — 데이터는 예시이며, 여러분의 대회 기록으로 교체해서 씁니다.
실측 (2026-09-09 — python step293_tactics.py, 예시 데이터):
=== 전술 비교 (예시 데이터) ===
[고정 분업] 해결 11문제 / 득점 2600점
민수(web) 해결 4 득점 900
지연(pwn) 해결 3 득점 700
현우(crypto) 해결 2 득점 550
수진(rev) 해결 2 득점 450
[역할 로테이션] 해결 5문제 / 득점 1100점
민수(rev) 해결 1 득점 200
지연(web) 해결 2 득점 400
현우(pwn) 해결 0 득점 0
수진(crypto) 해결 2 득점 500
득점 변화: 2600 → 1100 (-1500점, 42%)
로테이션 중 컨설팅 소요: 총 115분 — 지식 전수 비용
[취약 고리 — 단독 대응 분야]
web : 민수 ⚠ 담당 1명
pwn : 지연 ⚠ 담당 1명
crypto : 현우 ⚠ 담당 1명
rev : 수진 ⚠ 담당 1명
판정 예시: 점수는 하락(정상) — 대신 서브 분야 감각과 취약 고리 좌표를 얻음
읽는 법: 득점 42%로 하락 — 예정된 비용입니다. 주목할 것은 하락이 아니라 분포입니다. 수진(crypto)은 비주력에서도 500점을 냈고, 현우(pwn)는 0점 — 같은 로테이션인데 결과가 다릅니다. 이 차이가 말하는 것은 "수진은 crypto에 서브 재능이 있고, pwn은 팀 전체가 지연 1명에게 절대 의존한다"입니다. 1500점으로 산 것이 바로 이 문장입니다.
3-5. 최종 전술 문서 — 비율의 확정
실험 데이터로 팀 전술을 문서화합니다.
=== 팀 전술 v2 (서식 + 예시) ===
1. 기본 전술: 고정 분업 유지 (득점 효율 2.4배 우위 확인)
2. 로테이션 주기: 대회 4회당 1회 (실험 비용 1500점 → 분기 1회가 감당선)
3. 제2 담당 지정 (취약 고리 대응):
- pwn: 지연(주) + 현우(부) — 현우의 힙 개념 특훈이 최우선 과제
- crypto: 현우(주) + 수진(부) — 수진의 서브 재능 확인됨, 격려 차원
4. 컨설팅 규칙의 상설화: 평소 대회에도 요청 양식·10분 타임박스 적용
5. 다음 실험일: (날짜) — 그때 pwn 컨설팅 비용이 줄었는지 재측정
5번이 이 문서를 살아 있게 합니다. 실험은 한 번으로 끝나지 않고, 다음 실험에서 같은 지표를 다시 재야 "개선됐다"를 말할 수 있습니다.
4. 미션과 연습문제
미션 — 역할 로테이션 실험 완주와 전술 확정
- 대회 3일 전, 2-2의 합의서를 팀 문서로 작성하고 전원 확인을 받습니다.
- 각자 배정받은 비주력 분야의 치트시트·Write-up TOP 5·라이브러리를 준비합니다.
- 대회 중 개인 기록 카드(3-2)를 채웁니다 — "혼자 되는 경계선" 문장 필수.
- 컨설팅은 양식대로 요청하고, 시간을 양쪽에서 기록합니다.
- 종료 후 전술 비교 계산기에 팀 데이터를 넣어 비교표와 취약 고리 지도를 뽑습니다.
- 최종 전술 문서(3-5)를 작성합니다 — 다음 실험일까지 확정해야 완료입니다.
연습문제
문제 1. 로테이션 실험에서 "관심 있는 비주력 분야"를 배정하는 이유는 무엇이며, 무작위 배정과 비교해 어떤 차이가 생기나요?
문제 2. 컨설팅 요청 양식에 "시도한 것(버린 가설 목록)"이 빈 칸이면 요청 자체가 불가하다고 했습니다. 이 규칙의 목적은 무엇인가요?
문제 3. 3-4 실측에서 수진(비주력 crypto, 500점)과 현우(비주력 pwn, 0점)의 차이가 팀에게 알려준 두 가지 사실은 무엇인가요?
문제 4. 최종 전술 문서에 "다음 실험일"을 반드시 확정하라고 한 이유는 무엇인가요?
5. 모범 답안과 완료 기준
미션 모범 답안
검증 기준으로 확인하세요.
- 합의의 문서화: 대회 시작 전 날짜의 합의서가 있고, 전원 확인 흔적(댓글·서명)이 있는가.
- 금지 규칙 준수: 대회 중 주력 담당자가 대신 푼 사례가 없는가 — 있었다면 그 문제의 데이터는 오염됐다고 표시했는가.
- 경계선 문장: 각자의 기록 카드에 "혼자 되는 것 / 안 되는 것"이 명시됐는가 — "못 풀었다"는 실험 데이터가 아닙니다.
- 비교의 정량성: 고정 분업 대비 득점 비율, 컨설팅 총시간이 숫자로 있는가.
- 전술의 실행 가능성: 최종 전술 문서에 로테이션 주기·제2 담당·다음 실험일이 있는가 — "앞으로 유연하게" 같은 모호한 문장은 불인정입니다.
연습문제 해답
문제 1 해답. 실험은 비용이 큰 만큼 수확의 질이 중요하고, 의욕은 학습 효율의 가장 큰 변수이기 때문입니다. 관심 없는 분야의 배정은 "못 했다"는 당연한 결과만 낳아 데이터가 되지 않습니다 — 관심 있는 분야에서의 성과여야 "이 팀원의 서브 재능"으로 해석할 수 있습니다. 무작위 배정은 공정해 보이지만, 실험의 목적(팀의 최적 전술 발견)에는 오히려 노이즈입니다.
문제 2 해답. 컨설팅을 "마지막 수단"으로 유지해 데이터의 순도를 지키기 위해서입니다. 버린 가설이 없다는 것은 혼자 시도한 것이 없다는 뜻이고, 그 상태의 질문은 컨설팅이 아니라 문제 양도입니다. 또한 버린 가설 목록은 답변자의 시간을 줄입니다 — 이미 닫힌 문을 다시 열 필요가 없으니까요. 요청자의 성실성이 답변자의 비용을 결정하는 구조입니다.
문제 3 해답. 첫째, 수진에게 crypto 서브 재능이 있다는 것 — 비주력인데 득점이 나왔으므로 제2 담당 후보가 발견됐습니다. 둘째, pwn은 팀 전체가 지연 1명에게 절대 의존한다는 것 — 담당자가 빠지면 그 분야 득점이 0이 되는 구조가 드러났습니다. 하나는 수확(강점 재발견), 하나는 경보(취약 고리)이며, 둘 다 고정 분업 대회에서는 영원히 보이지 않던 데이터입니다.
문제 4 해답. 실험은 반복되어야 개선을 판정할 수 있기 때문입니다. 한 번의 로테이션은 "현재 상태의 스냅샷"일 뿐이고, 다음 실험에서 같은 지표(특히 컨설팅 비용·독립 도달 경계선)를 다시 재야 "제2 담당 육성이 효과가 있었는가"를 판정할 수 있습니다. 날짜가 없는 계획은 다시 실행되지 않습니다 — 그래서 문서의 마지막 줄이 다음 실험일입니다.
완료 기준 체크리스트
- [ ] 역할 로테이션 합의서를 대회 전에 문서로 작성하고 전원 확인받았다
- [ ] 각자 비주력 분야의 치트시트·Write-up·라이브러리를 준비했다
- [ ] 개인 기록 카드에 "혼자 되는 경계선" 문장을 남겼다
- [ ] 컨설팅을 양식대로 요청하고 시간을 양쪽에서 기록했다
- [ ] 고정 분업 대비 득점 비율과 컨설팅 총시간을 계산했다
- [ ] 취약 고리 지도(단독 대응 분야 목록)를 만들었다
- [ ] 최종 전술 문서에 로테이션 주기·제2 담당·다음 실험일을 확정했다
6. 흔한 실수와 해결
벽 1. 팀원이 "이번 대회는 건너뛰겠다"고 해요
증상: 합의 단계에서 "비주력 분야는 재미없다"는 반응.
원인: 합의서가 목적을 설득하지 못했습니다 — 점수를 좋아하는 팀원에게 실험은 손해로만 보입니다.
해결: 3-4 실측의 문장을 보여주세요 — "pwn은 지연 1명이 빠지면 0점이 된다"는 문장은 전원의 문제입니다. 그리고 배정 원칙 1번(관심 분야 우선)을 강조하세요. 그래도 반대하면, 반대하는 팀원만 주력을 유지하는 부분 로테이션도 유효한 실험입니다 — 다만 그 팀원의 데이터는 없다고 기록에 명시합니다.
벽 2. 대회 중반에 "그냥 내가 할까"가 터져 나와요
증상: 답답한 주력 담당자가 화면을 넘겨받습니다.
원인: 팀 점수가 보이는 하락 중이면 인내심이 무너집니다 — 정상적인 반응입니다.
해결: 합의서 4번을 다시 읽는 것으로는 부족합니다. 장치를 두세요 — 컨설팅은 음성/문장으로만, 키보드는 절대 넘기지 않기. 그리고 답변자의 10분 타임박스를 타이머로 돌리세요. 규칙을 지키는 것은 의지가 아니라 절차입니다.
벽 3. 점수가 너무 처참해서 다들 풀이 죽어요
증상: 대회 후반, 사기 저하로 손을 놓습니다.
원인: 예상보다 하락 폭이 컸을 때 "실험"이라는 프레임이 무너집니다.
해결: 중간 점검 때 프레임을 한 번 다시 씌우세요 — "지금 수집 중인 것은 점수가 아니라 경계선 데이터다." 그리고 후반 2시간은 전원 주력 복귀를 허용하는 절충안도 실전 팁입니다 — 실험 데이터는 이미 수집됐고, 마지막에 주력으로 몇 문제 잡으면 사기가 지켜집니다. 단, 복귀 시각을 기록에 명시해 데이터를 오염시키지 않습니다.
벽 4. 취약 고리 지도를 만들었는데 전 분야가 "담당 1명"이에요
증상: 3-4 실측처럼 모든 분야에 ⚠가 찍힙니다.
원인: 4인 팀의 정상 상태입니다 — 놀랄 일이 아니라, 우선순위를 정해야 할 일입니다.
해결: 컨설팅 로그가 우선순위를 알려줍니다. "개념 자체 설명"이 필요했던 분야(예시의 pwn)가 1순위 — 전수 비용이 가장 크다는 뜻이니까요. 반면 "문제 오독 정정" 8분으로 끝난 분야는 이미 전수 가능성이 높습니다. 전부 고치려 하지 말고, 다음 실험까지 1개 분야의 제2 담당만 키우는 것이 현실적 계획입니다.
벽 5. 실험이 재미있어서 매 대회 로테이션을 하자는 의견이 나와요
증상: 점수 하락을 무시하고 실험을 반복하자는 제안.
원인: 실험의 학습 효과를 체감한 긍정적 반응이지만, 팀의 점수 성장 곡선을 꺾습니다.
해결: 최종 전술 문서의 역할이 여기 있습니다 — 로테이션 주기를 숫자(예: 4회당 1회)로 합의해 두면, 다음 제안은 문서 개정 논의가 되어 감정 논쟁을 피합니다. 기준이 문서에 있으면 결정이 빠릅니다.
7. 정리
오늘의 개념
| 개념 | 한 줄 설명 |
|---|---|
| 역할 로테이션 | 점수를 비용으로 내고 팀의 지도를 사는 실험 |
| 합의서 | "이번은 학습용"의 문서화 — 대회 중반의 흔들림 차단 |
| 컨설팅 양식 | 버린 가설 없는 요청 불가 — 데이터 순도와 답변 비용의 보호 |
| 지식 전수 비용 | 컨설팅 총시간 — 분야 공백의 가격표 |
| 취약 고리 | 단독 대응 분야 — 담당 부재 시 득점 0이 되는 구조 |
| 전술 비율 | 고정 몇 + 로테이션 몇 — 실험의 목적지는 이분법이 아니라 비율 |
오늘의 도구·서식
| 도구·서식 | 하는 일 |
|---|---|
| 로테이션 합의서 | 목적·배정·규칙·금지의 사전 고정 |
| 개인 기록 카드 | "혼자 되는 경계선"의 측정 장치 |
| 컨설팅 요청 양식 | 지식 전수의 형식과 비용 기록 |
step293_tactics.py |
고정 vs 로테이션의 득점·비용 비교 계산 |
| 최종 전술 문서 | 주기·제2 담당·다음 실험일의 확정 |
명령어보다 중요한 감각
좋은 팀의 조건은 "각자가 강한 것"이 아니라 "누가 빠져도 도는 것" 입니다. 오늘 실험이 드러낸 ⚠ 표시들은 지적이 아니라 초대장입니다 — 팀이 다음 반년에 키울 것의 목록입니다.
그리고 로테이션의 숨은 수확을 하나 더 짚고 갑니다 — 주력 담당자가 가르치는 경험입니다. 10분 컨설팅을 해본 사람은 자기 분야의 어느 개념이 남에게 어려운지를 알게 되고, 그것은 그 사람의 Write-up과 설명력을 바꿉니다. 실험의 비용은 점수로 냈지만, 이자는 팀 전체에 돌아갑니다.
전부 체크되면 Step 293 완료입니다. 사이드바의 체크박스를 눌러 진도를 저장하세요.