Step 280. CTF 복기 블록 A: 틀린 문제 3개 끝까지 파기 — 실력은 대회가 아니라 복기에서 늘어난다
Level 3 — CTF 실전과 공격 스킬 심화 | 난이도 ★★★☆☆ | 예상 소요 시간 2일 (문제당 2~4시간)
전제: Step 279의 첫 대회 완주 — 대회 로그(
ctf_log.csv)와 회고 메모가 있어야 합니다.
- 준비물: 대회 로그와 회고 메모(Step 279 산출물), 못 푼 문제의 원본 파일(대회 중 받아 둔 것), 공식/커뮤니티 Write-up 접근 경로, 플레이북(Step 272).
- ⚠️ 이 챕터의 실습은 내 랩·합법 플랫폼 전용입니다. 허가 없는 시스템에 적용하면 범죄입니다. CTFtime 등록 대회의 문제와 종료 후 공개된 Write-up은 학습하라고 열린 합법 재료입니다 — 대회 규정상 공개가 금지된 문제는 규정을 따릅니다.
- 주의: 다른 사람의 Write-up 화면은 화면 예시로 표기합니다. 이 챕터에서 직접 실행해 검증한 것은 XOR 재현 문제와 풀이 스크립트이며, 그 출력은 실측입니다.
대회의 성적은 숫자일 뿐이고, 실력은 복기에서 늘어납니다. 오늘은 대회에서 못 푼 문제 세 개를 골라 끝까지 파는 복기 블록 A 루틴을 확립합니다. "혼자 2시간 더 → Write-up으로 답 확인 → 손으로 재현"의 순환 — 이 루틴이 앞으로 모든 대회 뒤에 반복되는 여러분의 성장 엔진입니다.
1. 학습 목표
이 챕터를 끝내면 다음을 할 수 있습니다:
- 대회 로그에서 복기 가치가 높은 문제 3개를 선정하는 기준을 적용한다
- Write-up 공개 전/후의 다른 복기 전략을 상황에 맞게 운용한다
- 복기표(도달 지점 | 정답의 다음 한 발 | 필요했던 것)를 작성한다
- Write-up을 읽는 것에서 끝내지 않고 손으로 재현해 검증한다
- 배운 기법을 플레이북에 "다음 대회에서 바로 쓸 것"으로 반영한다
2. 배경 지식 — 오늘의 도구와 개념
오늘의 도구 한눈에 보기
| 구분 | 내용 |
|---|---|
| 언어·환경 | 대회 로그 CSV, 문제 원본 파일, Write-up(웹), 분야별 도구(오늘은 파이썬으로 Crypto 재현) |
| 오늘의 화면·도구 | ctf_log.py report(복기 후보 확인), 복기표 템플릿, xor_chal.py·xor_solve.py(재현 연습) |
| 필요한 개념 | 복기 블록 A, "거의 왔던" 문제 선정 기준, Write-up 공개 전/후 전략, 복기표, 재현의 원칙 |
| 오늘의 산출물 | 복기표 3부 + 재현 코드 1개 이상 + 플레이북 추가 항목 3개 |
2-1. 왜 못 푼 문제인가 — 푼 문제는 이미 내 것이다
대회가 끝나고 하고 싶은 것은 푼 문제의 자랑입니다. 그러나 성장의 관점에서 푼 문제는 이미 할 줄 아는 것을 한 것입니다. 반대로 못 푼 문제에는 정확히 내가 모르는 것이 들어 있습니다 — 그래서 복기 블록 A의 대상은 푼 문제가 아니라 못 푼 문제입니다.
특히 가치가 높은 것은 "거의 왔던" 문제입니다. 전혀 감도 못 잡은 문제는 배울 것이 너무 많아 한 번의 복기에 다 담기지 않습니다. 반면 한두 발짝 모자랐던 문제는 "그 한 발"이 무엇인지가 명확하고, 그 한 발이 다음 대회에서 바로 점수가 됩니다. 투자 대비 성장 효율이 가장 높은 구간입니다.
2-2. 문제 선정 기준 — 로그가 답을 알고 있다
Step 279의 report 출력을 다시 봅니다 (실측 재인용):
[못 푼 문제 — 복기 후보]
Rev license-check stuck 메모: 안티 디버깅 구간에서 진행 멈춤
Web admin-panel stuck 메모: SQLi 페이로드 전부 차단됨
Crypto xor-note stuck 메모: 키 길이 추정에서 막힘
선정 기준은 세 가지입니다.
- 도달 깊이 — stuck 메모가 구체적일수록(멈춘 지점이 선명할수록) 우선
- 분야 근접성 — 내 주력 분야이거나 인접 분야일수록 다음 대회에서 바로 점수가 됨
- 재현 가능성 — 문제 파일이 남아 있거나 로컬에서 재구성 가능한가
위 로그라면 세 문제 모두 메모가 구체적이라 전원 입후보입니다. 셋 중 하나를 고를 이유가 없으니 3개 전부가 오늘의 대상 — 원문 커리큘럼이 "틀린 문제 3개"를 정한 이유이기도 합니다. 세 개면 한 주의 복기 분량으로 적당하고, 한 개만 하면 우연이 되고 다섯 개를 넘기면 각각이 얕아집니다.
2-3. Write-up 공개 전/후 — 같은 문제, 다른 전략
대회 종료 직후부터 공식 Write-up이 공개되기까지 보통 며칠의 공백이 있습니다. 이 공백의 사용법이 복기의 절반입니다.
공개 전 — 혼자 2시간 더. 대회의 긴장이 사라진 평온한 상태에서 같은 문제를 다시 봅니다. 놀라운 일이 자주 일어납니다 — 대회 중엔 안 보이던 것이 보입니다. 긴장이 시야를 좁혔기 때문입니다. 여기서 풀리면 그것이 최고의 복기입니다: "시간만 더 있었으면 풀었다"는 사실 자체가 다음 대회의 시간 배분 전략을 바꿉니다.
공개 후 — 답 확인과 재현. 2시간을 써도 안 풀리면 Write-up을 읽습니다. 이때의 절대 규칙: 읽고 "아, 그거구나"에서 멈추지 않는다. 이해와 재현은 다른 층위입니다. Write-up을 보지 않고(또는 마지막 힌트만 보고) 내 손으로 끝까지 풀어야 비로소 내 기술이 됩니다. 재현할 환경이 없으면 문제의 핵심 장치를 로컬에서 재구성해서라도 풉니다 — 3-3에서 실제로 합니다.
2-4. 복기표 — 세 칸이 사고를 구조화한다
복기의 기록 형식은 단순합니다. 문제마다 세 칸의 표를 채웁니다.
| 칸 | 채우는 내용 | 예시 (xor-note) |
|---|---|---|
| 내가 도달한 지점 | 로그와 기억으로 복원한 최전선 | "반복 XOR임을 알았고, 키 길이를 모른다는 데서 멈춤" |
| 정답의 다음 한 발 | Write-up이 보여 준, 내 최전선의 바로 다음 | "’flag{‘로 시작한다는 보장 = 알려진 평문(crib) 공격의 열쇠" |
| 그걸 알려면 뭐가 필요했나 | 지식/도구/습관 중 무엇의 부재였나 | "crib dragging 개념 — Crypto 트랙의 고전 기법 목록에 없었다" |
세 번째 칸이 복기의 결론입니다. "지식이 없었다"면 플레이북에 추가할 항목이 되고, "습관이 없었다"(힌트를 안 읽었다 등)면 대회 운영 규칙이 되고, "도구가 없었다"면 환경 점검 체크리스트가 길어집니다. 원인의 종류가 다른데 처방이 하나일 리 없습니다.
3. 따라 하기
3-1. 복기 대상 3개 확정과 원본 확보
report의 복기 후보 목록에서 3개를 확정합니다 (2-2의 기준 적용). 그리고 오늘 문제 원본을 확보하세요 — 대회 플랫폼은 종료 후 일주일쯤 뒤에 문제 서버를 내리는 경우가 많습니다.
[복기 대상 확정 — 예시]
1. Crypto - xor-note : 힌트 문구와 암호문(hex)을 메모장에 저장 완료
2. Web - admin-panel : 서버는 내려감 → 요청/응답 캡처와 시도 페이로드 목록 확보
3. Rev - license-check : 바이너리 다운로드 완료 (대회 중 받아 둠)
서버형 문제(Web 등)는 종료 후 접속이 끊기므로, 대회 중에 요청/응답과 화면을 캡처해 두는 것이 유일한 원본입니다. Step 279의 로그 습관에 캡처 습관을 얹는 이유입니다.
3-2. 공개 전 2시간 — xor-note에 다시 붙어 보기
Write-up을 찾기 전에 타이머를 2시간 맞추고 xor-note를 다시 봅니다. 대회 중 메모는 "키 길이 추정에서 막힘"이었습니다. 차분히 다시 읽으면 문제의 힌트가 달리 보입니다.
[문제 힌트 재독 — 화면 예시]
"암호문은 반복 XOR입니다. 키 길이는 10 이하.
평문은 'flag{'로 시작한다는 것이 보장됩니다."
대회 중에는 이 두 번째 문장을 그냥 흘려 읽었습니다. 그런데 천천히 읽으면 이상합니다 — 왜 굳이 평문의 첫 다섯 글자를 알려 줄까요? 주최 측의 힌트는 장식이 아니라 열쇠입니다. 첫 5바이트를 안다는 것은 알려진 평문(crib) 공격의 출발점입니다. 이것이 "혼자 2시간"이 발견하는 것의 예입니다.
3-3. 로컬 재현 — 내 손으로 다시 만들어 풀기 (실측)
문제 서버가 내려갔거나, 원본을 못 받았어도 괜찮습니다. 핵심 장치(반복 XOR + crib 보장)를 로컬에서 똑같이 만들어 풀면 됩니다. 아래는 실제로 작성해 실행한 재현본입니다. 먼저 문제 생성기입니다.
# xor_chal.py — 대회에서 못 푼 'xor-note' 유형을 내 손으로 재현
import sys
FLAG = "flag{x0r_k3y_l3ngth_1s_th3_gat3}"
KEY = b"K7m" # 반복 XOR 키 (생성기만 알고 있음)
HINT = (
"암호문은 반복 XOR입니다. 키 길이는 10 이하.\n"
"평문은 'flag{'로 시작한다는 것이 보장됩니다.\n"
)
def gen():
data = FLAG.encode()
cipher = bytes(b ^ KEY[i % len(KEY)] for i, b in enumerate(data))
with open("challenge.txt", "w", encoding="utf-8") as f:
f.write("=== xor-note (로컬 재현본) ===\n")
f.write(HINT)
f.write("ciphertext(hex): " + cipher.hex() + "\n")
print("challenge.txt 생성 완료 — 암호문", len(cipher), "바이트")
if __name__ == "__main__":
if len(sys.argv) > 1 and sys.argv[1] == "gen":
gen()
else:
print(__doc__)
실행 결과 (실측):
$ python xor_chal.py gen
challenge.txt 생성 완료 — 암호문 32 바이트
$ cat challenge.txt
=== xor-note (로컬 재현본) ===
암호문은 반복 XOR입니다. 키 길이는 10 이하.
평문은 'flag{'로 시작한다는 것이 보장됩니다.
ciphertext(hex): 2d5b0c2c4c157b4532200414145b5e25501923685c3868192304322c5619784a
이제 풀이입니다. crib flag{와 암호문 앞 5바이트를 XOR하면 키 조각이 나오고, 그 조각이 반복되는 최소 길이가 키 길이입니다.
# xor_solve.py — '알려진 평문(crib)'으로 반복 XOR을 푸는 재현 풀이
import re
text = open("challenge.txt", encoding="utf-8").read()
cipher = bytes.fromhex(re.search(r"ciphertext\(hex\): ([0-9a-f]+)", text).group(1))
crib = b"flag{"
# ① crib과 앞 5바이트를 XOR → 키 조각 후보
frag = bytes(c ^ k for c, k in zip(cipher[:len(crib)], crib))
key_len = None
for n in range(1, 11):
if all(frag[i] == frag[i % n] for i in range(len(frag))):
key_len = n
break
print(f"crib '{crib.decode()}'에서 얻은 키 조각: {frag!r}")
print(f"조각이 반복되는 최소 길이 = 키 길이 {key_len}")
# ② 조각이 반복돼 키 전체가 확정됐으므로 그대로 복호
key = bytearray(frag[:key_len])
plain = bytes(c ^ key[i % key_len] for i, c in enumerate(cipher))
print("복호 결과:", plain.decode())
실행 결과 (실측):
$ python xor_solve.py
crib 'flag{'에서 얻은 키 조각: b'K7mK7'
조각이 반복되는 최소 길이 = 키 길이 3
복호 결과: flag{x0r_k3y_l3ngth_1s_th3_gat3}
읽는 법: 앞 5바이트에서 나온 조각이 K7mK7 — K7m이 반복되고 있으므로 키 길이는 3, 키 전체가 조각 안에 들어 있습니다. 대회 중 "키 길이 추정에서 막힘"이라고 멈췄던 문제가, crib 한 줄의 의미를 아는 순간 10줄의 코드로 무너집니다. 이것이 복기의 보상입니다 — 그리고 풀이 과정에서 실수하고 고치는 동안(첫 판에선 조각 길이 계산을 잘못해 키가 어긋났습니다) 기법이 진짜로 몸에 붙습니다.
3-4. 복기표 작성 — xor-note 예시
재현을 끝낸 문제는 그 자리에서 복기표를 채웁니다. 작성 예시입니다.
[복기표 1/3] Crypto - xor-note (150점)
┌─────────────────────────┬───────────────────────────────────────────────┐
│ 내가 도달한 지점 │ 반복 XOR임을 식별. 키 길이를 몰라서 전진 불가 │
│ 정답의 다음 한 발 │ "평문은 'flag{'로 시작" = crib. │
│ │ 앞 5바이트 XOR → 키 조각 → 반복 주기 = 키 길이 │
│ 그걸 알려면 뭐가 필요했나 │ 지식: crib dragging(알려진 평문 공격) 개념. │
│ │ 습관: 힌트 문장을 "장식"으로 흘려 읽은 것도 원인 │
└─────────────────────────┴───────────────────────────────────────────────┘
배운 기법: crib으로 키 조각 복원 → 반복 주기 찾기 → 전체 복호
재현 여부: ✅ 로컬 재현본으로 끝까지 풂 (xor_chal.py / xor_solve.py)
같은 절차로 admin-panel(SQLi 차단 우회)과 license-check(안티 디버깅 우회)의 복기표를 채웁니다. 서버가 내려간 문제는 Write-up의 페이로드를 로컬 테스트 환경에 옮겨 적어 검증하고, 바이너리가 있는 문제는 그대로 디버거에 올리면 됩니다.
3-5. 플레이북 반영 — "다음 대회에서 바로 쓸 것"
복기의 마지막 동작은 플레이북(Step 272)에 새 항목을 추가하는 것입니다. 형식은 한 장이면 충분합니다.
[플레이북 추가 — Crypto/XOR]
■ crib 공격: 평문 일부를 알면 반복 XOR의 키 조각이 복원된다
- 절차: crib ⊕ 암호문 → 키 조각 → 반복 주기 = 키 길이 → 전체 복호
- 신호: 문제가 평문의 시작 형식을 "보장"해 줄 때 (flag{, CTF{ 등)
- 코드: tmp/xor_solve.py (재사용 가능)
★ 다음 대회에서 바로 쓸 것 — Crypto 문제에서 힌트 문장부터 다시 읽기
★ 다음 대회에서 바로 쓸 것 표시가 이 항목의 성격을 정합니다 — 참고 지식이 아니라 체크리스트 항목입니다. 다음 대회의 전체 훑기(Step 279의 시작 30분)에서 이 표시가 붙은 항목들을 먼저 훑는 것, 그것이 복기와 대회를 잇는 순환의 완성입니다.
4. 미션과 연습문제
미션 — 복기 블록 A 완주
- 대회 로그의 복기 후보에서 "거의 왔던" 문제 3개를 2-2의 기준으로 선정하고, 선정 근거를 한 줄씩 적습니다.
- 각 문제에 Write-up 공개 전 "혼자 2시간"을 투입하고, 새로 알게 된 것을 한 줄씩 메모합니다 (못 풀어도 됩니다 — 메모가 산출물입니다).
- 공식/커뮤니티 Write-up을 수집해 3-4 형식의 복기표를 3부 작성합니다.
- 최소 1개 문제는 손으로 끝까지 재현합니다 (로컬 재구성도 인정).
- 배운 기법 3개를 플레이북에 추가하고 전부
★ 다음 대회에서 바로 쓸 것으로 표시합니다.
연습문제
문제 1. 복기 대상으로 "전혀 감도 못 잡은 문제"보다 "거의 왔던 문제"를 우선하는 이유를 설명해 보세요.
문제 2. Write-up 공개 "전"에 혼자 2시간을 더 쓰는 것의 효과 두 가지를 말해 보세요.
문제 3. 복기표의 세 번째 칸("그걸 알려면 뭐가 필요했나")의 답이 지식/습관/도구 중 무엇이냐에 따라 처방이 어떻게 달라지는지 설명해 보세요.
문제 4. 3-3의 재현 풀이에서 키 조각 b'K7mK7'이 나왔을 때 키 길이를 3으로 확정할 수 있는 근거를 말해 보세요.
5. 모범 답안과 완료 기준
미션 모범 답안
검증하는 법: ① 선정 근거가 2-2의 기준(도달 깊이·분야 근접성·재현 가능성) 어휘로 쓰여 있는가. ② "혼자 2시간"의 메모가 문제마다 존재하는가 — 이 메모가 없으면 Write-up 요약과 다를 바가 없습니다. ③ 복기표 3부의 세 칸이 전부 채워져 있고, 특히 "정답의 다음 한 발"이 한 문장으로 말해질 정도로 구체적인가 ("XOR을 열심히 했어야 함" 같은 답은 미완성). ④ 재현 1개의 코드와 출력이 남아 있는가 — 출력 없는 "풀었습니다"는 재현이 아닙니다. ⑤ 플레이북에 신규 항목 3개와 ★ 표시가 있는가.
연습문제 해답
문제 1 해답. 거의 왔던 문제는 부족한 조각이 "한 발"로 특정되므로 그 한 발을 배우면 다음 대회에서 바로 점수가 됩니다 — 투자 대비 성장 효율이 가장 높습니다. 감도 못 잡은 문제는 배울 것이 너무 많아 한 번의 복기로 흡수되지 않고, 그 문제가 요구하는 선행 지식이 쌓인 뒤의 복기로 미루는 것이 낫습니다.
문제 2 해답. ① 대회의 긴장이 사라진 상태에서 재시도하면 시야가 넓어져 대회 중 안 보이던 단서가 보이는 경우가 많고, 이때 풀리면 최고의 복기가 됩니다. ② 못 풀더라도 "내 최전선"이 정확해져, 이후 Write-up을 읽을 때 정답과 내 도달 지점의 차이가 한 발로 선명해집니다 — Write-up을 그냥 읽는 것과 학습 효율이 다릅니다.
문제 3 해답. "지식의 부재"였다면 처방은 플레이북에 기법을 추가하는 것이고, "습관의 부재"(힌트를 안 읽음, 캡처를 안 함)였다면 처방은 대회 운영 규칙의 추가이며, "도구의 부재"였다면 처방은 환경 점검 체크리스트의 확장입니다. 원인의 종류를 정확히 분류해야 복기가 다음 행동으로 연결됩니다.
문제 4 해답. 반복 XOR에서 암호문 ⊕ 평문 = 키의 반복이므로, crib 다섯 글자로 얻은 조각은 키의 처음 다섯 글자(또는 그 반복)입니다. 조각 K7mK7에서 1~3번째(K7m)와 4~5번째(K7)가 앞부분과 일치 — 즉 길이 3 주기로 반복이 성립합니다. 더 짧은 길이(1, 2)로는 조각이 설명되지 않으므로, 반복이 성립하는 최소 길이 3이 키 길이입니다.
완료 기준 체크리스트
- [ ] 복기 대상 3개의 선정 근거를 기준 어휘로 설명할 수 있다
- [ ] Write-up 공개 전 "혼자 2시간"을 문제마다 실행하고 메모를 남겼다
- [ ] 복기표 3부(도달 지점/다음 한 발/필요했던 것)를 작성했다
- [ ] 최소 1개 문제를 손으로 끝까지 재현했다
- [ ] "읽고 아 그거구나"에서 멈추지 않는 이유를 설명할 수 있다
- [ ] 배운 기법 3개가 플레이북에 ★ 표시와 함께 추가됐다
6. 흔한 실수와 해결
벽 1. Write-up을 읽으니 다 이해가 되는데, 막상 혼자 풀면 못 풀어요
원인: 이해와 재현은 다른 층위입니다. 읽어서 아는 것은 인식(recognition) 이고, 대회에서 필요한 것은 회수(recall) 입니다.
해결: Write-up을 읽은 뒤 반드시 덮고, 처음부터 끝까지 내 손으로 재현하세요. 막히는 지점이 정확히 내가 모르는 지점입니다. 재현이 어려우면 마지막 한 단계의 힌트만 보고 나머지는 혼자 채우는 식으로 난이도를 조절하세요.
벽 2. 문제 서버가 내려가서 재현이 불가능해요
원인: 서버형 문제는 대회 종료와 함께 사라지는 경우가 많습니다.
해결: 두 갈래입니다. ① 핵심 장치만 로컬에서 재구성 — 3-3에서 한 것처럼, 취약점의 본질(반복 XOR, 취약한 업로드 필터 등)을 내 환경에 다시 만드는 것 자체가 깊은 학습입니다. ② 다음 대회부터는 대회 중에 요청/응답을 캡처하는 습관으로 원본을 확보합니다.
벽 3. 복기를 미루다가 한 달이 지났어요
원인: 복기는 대회의 쾌감이 식은 뒤의 일이라 동기가 안 생깁니다.
해결: 기억의 반감기를 규칙으로 막으세요 — 대회 종료 후 1주일 안에 블록 A를 끝내는 것을 개인 규정으로 정합니다. 일주일이 지나면 stuck 메모의 의미조차 흐려집니다. 바쁘면 3개 중 1개만이라도 끝내세요 — 얕은 복기 3개보다 깊은 복기 1개가 낫습니다.
벽 4. 풀이 스크립트가 문법 오류로 안 돌아가요
증상 (실측 — 3-3의 풀이 코드 초안에서 실제로 발생):
File ".../xor_solve_draft.py", line 4
print("암호문 길이:" + f"{len(cipher)}":>8)
^
SyntaxError: invalid syntax
원인: f-string의 형식 지정자(:>8)를 f-string 밖에 붙인 오타입니다. 복기용 재현 코드를 급하게 쓰다 보면 흔합니다.
해결: 형식 지정은 f-string 중괄호 안에 넣으세요 — f"{값:>8}". 재현 코드는 작게 쪼개서 단계마다 출력을 찍어 가며 작성하면, 어느 줄에서 어긋났는지 바로 보입니다.
벽 5. Write-up마다 풀이가 달라서 뭘 따라야 할지 모르겠어요
원인: CTF 문제는 정답이 하나가 아닌 경우가 많고, 고수들의 Write-up은 생략이 많습니다.
해결: 입문 단계에서는 가장 길게, 실패 경로까지 적은 Write-up을 고르세요 — 성공만 적힌 고수의 풀이보다 "나도 이걸로 헤맸다"가 적힌 같은 눈높이의 풀이가 재현에 유리합니다. 그리고 기준은 하나입니다: 내가 재현할 수 있는가.
7. 정리
오늘의 개념
| 개념 | 한 줄 설명 |
|---|---|
| 복기 블록 A | 못 푼 문제를 끝까지 파는 복기 — 성장의 본체 |
| "거의 왔던" 문제 | 도달 지점이 선명해 한 발만 배우면 되는 최우선 복기 대상 |
| 혼자 2시간 | Write-up 공개 전의 재시도 — 긴장 해소 후 시야 회복 + 최전선 확정 |
| crib(알려진 평문) | 평문의 일부를 아는 것 — 반복 XOR 키 조각 복원의 열쇠 |
| 복기표 | 도달 지점 | 정답의 다음 한 발 | 필요했던 것 — 사고의 구조화 |
| 재현의 원칙 | 읽어서 아는 것(인식)이 아니라 손으로 다시 푸는 것(회수) |
| ★ 다음 대회에서 바로 쓸 것 | 복기를 다음 대회 행동으로 잇는 플레이북 표시 |
오늘의 명령어·도구
| 명령·도구 | 하는 일 |
|---|---|
python ctf_log.py report |
대회 로그에서 복기 후보 목록 확인 |
python xor_chal.py gen |
못 푼 문제의 핵심 장치를 로컬에 재구성 |
python xor_solve.py |
crib 공격으로 반복 XOR 복호 (재현 풀이) |
| 복기표 템플릿 | 문제당 3칸 + 배운 기법 + 재현 여부 |
| 플레이북 ★ 항목 | 다음 대회 전체 훑기 때 먼저 볼 체크리스트 |
핵심 감각
대회 하루가 10이라면 복기 이틀이 90입니다 — 과장이 아니라, 대회는 내가 아는 것의 총량을 보여 줄 뿐 새로운 것을 가르쳐 주지 않기 때문입니다. 가르쳐 주는 것은 벽이고, 벽을 해체하는 시간이 복기입니다. 이 루틴 — 대회 → 로그 → 복기 3개 → 플레이북 ★ — 이 돌기 시작하면, 대회는 더 이상 시험이 아니라 커리큘럼을 스스로 만들어 주는 장치가 됩니다.
전부 체크되면 Step 280 완료입니다. 사이드바의 체크박스를 눌러 진도를 저장하세요.