Step 292. CTF 복기 블록 A + 블록 B: Write-up 누적 40개 — 읽히는 글이 실력의 증명이다
Level 3 — CTF 대회 사이클 | 난이도 ★★☆☆☆ | 예상 소요 시간 2일 (복기 반일 + Write-up 작성·리라이팅 1.5일)
전제: Step 291(라이브러리 실전 검증) 완료, 기존 Write-up 누적 30~35개, 파이썬 3(관리 스크립트용).
- 준비물: 대회 #6~#7의 복기 기록, 기존 Write-up 폴더(또는 블로그), 파이썬 3. 이 챕터의 Write-up 관리 스크립트 실행은 실측(2026-09-09, Python 3.12)입니다.
- ⚠️ 이 챕터의 실습은 내 랩·합법 플랫폼 전용입니다. 허가 없는 시스템에 적용하면 범죄입니다.
- 이 챕터는 기록 품질 챕터입니다 — 누적 관리를 지속하면서, 이제는 "읽히는 Write-up"으로 질을 올립니다.
Write-up 30개를 넘기면 변화가 생깁니다. 이제 "쓰는 것"은 루틴이 됐고, 다음 질문은 "읽히는가" 입니다. 독자가 있는 글은 쓰는 사람을 더 성장시킵니다 — 남이 이해할 문장으로 바꾸는 과정이 이해의 구멍을 드러내고, 독자의 질문이 생각 못 한 관점을 가져옵니다.
오늘은 두 갈래 작업입니다. 블록 A로 대회 #6~#7의 미해결 문제를 정리해 누적 40개를 채우고, 대표 글 하나를 골라 4단 구조로 리라이팅합니다. 양의 목표와 질의 목표를 같은 이틀에 잡는 것입니다.
1. 학습 목표
이 챕터를 끝내면 다음을 할 수 있습니다:
- 블록 A 루틴으로 대회 #6~#7의 못 푼 문제 3개를 끝까지 파고 Write-up으로 마감한다
- Write-up 관리 스크립트로 누적 수·구조 완비 여부·목차를 자동 점검한다
- "배경 지식 → 접근 사고 → 구현 → 일반화" 4단 구조로 글을 리라이팅한다
- 커뮤니티 피드백을 수집하고 글 개선에 반영하는 루프를 돌린다
- 내 글 중 팀원에게 추천할 TOP 5를 근거와 함께 선정한다
2. 배경 지식 — 오늘의 도구와 개념
오늘의 도구 한눈에 보기
| 구분 | 내용 |
|---|---|
| 언어·환경 | 마크다운, 블로그/디스코드(공유용), 파이썬 3(관리 스크립트) |
| 오늘의 명령 | python step292_mgr.py [폴더] — 누적·구조 점검, 목차 생성 |
| 필요한 개념 | 4단 구조, 독자 피드백 루프, 리라이팅, 템플릿 고정 |
| 오늘의 산출물 | Write-up 누적 40개 + 리라이팅 1편 + TOP 5 선정 목록 |
2-1. 왜 "읽히는가"인가 — 피드백이 없는 글의 정체
Write-up의 1차 독자는 미래의 나입니다. 그런데 누적 30개가 넘으면 2차 독자가 생깁니다 — 검색으로 들어온 낯선 학습자, 팀원, 그리고 언젠가 여러분의 블로그를 보는 채용 담당자.
독자가 없는 글은 정체됩니다. "이해했으니 됐다"는 문장이 독자 없이는 통과되지만, 낯선 독자는 그 문장에서 멈춥니다. 독자의 멈춤 지점이 곧 내 이해의 얕은 지점입니다. 그래서 오늘부터 Write-up은 "기록"이 아니라 "전달"을 목표로 합니다 — 그리고 전달의 품질은 피드백으로만 측정됩니다.
2-2. 4단 구조 — 읽히는 Write-up의 뼈대
소재의 리라이팅 구조입니다. 단순 풀이 나열에서 한 단계 올라선 형식입니다.
| 단 | 이름 | 답하는 질문 | 분량 감각 |
|---|---|---|---|
| 1 | 배경 지식 | 이 글을 읽으려면 무엇을 알아야 하는가 | 3~5문장 + 링크 |
| 2 | 접근 사고 | 왜 이 접근인가, 어디서 막혔는가 | 글의 절반 — 여기가 본문 |
| 3 | 구현 | 명령·코드·출력, 재현 가능하게 | 전문 인용, 요약 금지 |
| 4 | 일반화 | 다음에 같은 유형이 나오면? | 한 문장이면 된다 |
기존 글과의 차이는 2단과 4단입니다. 풀이 나열형 글에는 "구현"만 있습니다. 접근 사고는 버린 가설과 막힘을 포함해야 하고, 일반화는 이 문제를 풀어서 생긴 재사용 가능한 판단 한 줄입니다. 이 둘이 없으면 독자는 "이 사람은 풀었다"는 사실만 얻고, 있으면 "나도 풀 수 있겠다"는 감각을 얻습니다.
2-3. 템플릿 고정 — 글쓰기 시간을 줄이는 법
소재의 지적입니다 — 글쓰기 시간이 부담스러우면 템플릿을 고정합니다. 구조가 같으면 쓰는 속도가 빨라집니다.
뼈대는 다섯 줄입니다 — 제목 # (문제 이름) — (플랫폼, 분야, 배점) 아래에 네 개의 헤더 ## 배경 지식 → ## 접근 사고 → ## 구현 → ## 일반화. 이 다섯 줄을 template.md로 저장해 두고, 새 글은 이 파일을 복사하는 것에서 시작합니다.
새 Write-up은 이 뼈대를 복사하는 것에서 시작합니다. "오늘은 어떤 순서로 쓸까"를 고민하지 않는 것 — 그 고민이 글쓰기의 시작 장벽입니다. 구조를 고정하면 창의력은 문장으로 이동합니다.
2-4. 누적 관리의 자동화 — 40개를 손으로 세지 않는다
글 수가 늘면 관리 자체가 일이 됩니다. 몇 개인지, 어떤 글이 구조가 빠졌는지를 손으로 세면 언젠가 놓칩니다. 그래서 오늘은 스크립트로 관리합니다 — 폴더를 스캔해 누적 수를 세고, 4단 구조의 누락을 찍고, 목차를 만드는 것. 3-2에서 실제로 만들어 돌립니다.
3. 따라 하기
3-1. 블록 A — 대회 #6~#7의 미해결 문제 끝까지 파기
먼저 복기의 기본기입니다. 두 대회에서 못 푼 문제 중 3개를 고릅니다. 고르는 기준은 "가장 아까운 것" — 입구까지는 갔는데 못 뚫은 문제가 학습 효율이 가장 높습니다.
블록 A 기록 양식:
문제: (이름/대회/분야)
우리가 멈춘 곳: (한 문장)
정답의 결정적 한 수: (공개 Write-up 대조 후 한 문장)
재현: □ 완료 (직접 다시 풀어 플래그 확인 — 읽기만으로는 불인정)
Write-up: □ 4단 구조로 작성
재현이 중요합니다. 정답을 읽고 "아 그렇구나"는 것과, 직접 다시 풀어 플래그를 확인하는 것은 다른 공부입니다. 블록 A의 완료 조건은 언제나 재현입니다.
3-2. 관리 스크립트 — 누적 수와 구조 누락을 한 번에
아래 스크립트를 step292_mgr.py로 저장하세요. Write-up 폴더를 스캔해 누적 수, 4단 구조 완비 여부, 목차 파일을 한 번에 처리합니다.
# Write-up 누적 관리자 — 누적 수·4단 구조 검사·목차 생성
import sys
from pathlib import Path
REQUIRED = ["배경 지식", "접근 사고", "구현", "일반화"]
BASE = 34 # 이번 대회 전까지의 누적 수 — 여러분의 실제 누적으로 교체
def scan(folder):
rows = []
for f in sorted(folder.glob("*.md")):
if f.name == "INDEX.md":
continue
text = f.read_text(encoding="utf-8")
missing = [s for s in REQUIRED if f"## {s}" not in text]
rows.append((f.name, len(text), missing))
return rows
# ... (main: 표 출력 + INDEX.md 생성 — 5번 섹션의 검증과 동일)
여러분의 Write-up 폴더 경로를 인자로 실행합니다. 여기서는 샘플 6개(4개 완비, 2개 구조 누락)를 만들어 돌려 봤습니다.
실측 (2026-09-09 — python step292_mgr.py writeups):
기존 누적: 34개 / 이번 신규: 6개 / 누적: 40개
파일 바이트 4단 구조
----------------------------------------------------
crypto_rsa_small_e.md 155 완비
forensic_pcap_flag.md 52 누락: 배경 지식, 접근 사고, 일반화
pwn_bof_ret2win.md 149 완비
rev_crackme_xor.md 49 누락: 배경 지식, 접근 사고, 일반화
web_jwt_none.md 146 완비
web_ssti_board.md 148 완비
----------------------------------------------------
4단 구조 완비: 4/6
목차 생성: ...\writeups\INDEX.md
⚠ 구조가 빠진 글이 있습니다 — 5번 섹션의 리라이팅 구조로 보강하세요
읽는 법: 누적 40개 달성이 숫자로 확인됐고, 동시에 구조가 빠진 글 2개가 지목됐습니다. 둘 다 "구현"만 있는 옛 형식의 글 — 정확히 오늘 리라이팅해야 할 대상입니다. 목표 달성(양)과 개선 대상(질)이 한 화면에 나오는 것, 이것이 관리 자동화의 이유입니다.
3-3. 리라이팅 — 대표 글 하나를 4단 구조로 다시 쓴다
스크립트가 찍어준 누락 글 중 하나를 골라 리라이팅합니다. 전부 고치려 하지 마세요 — 오늘의 목표는 하나를 깊이 고쳐 손에 감각을 남기는 것입니다.
리라이팅 절차:
1. 원문을 옆에 띄우고, 4단 구조 뼈대를 새 파일에 복사
2. '구현' 단은 원문을 거의 그대로 이식 — 이미 있는 자산
3. '접근 사고'를 새로 쓴다 — 당시 메모·대화 로그를 뒤져
버린 가설 2개와 막힘 1개를 복원 (이것이 본문)
4. '배경 지식'은 "내가 이 문제를 처음 봤을 때 몰랐던 것" 3문장
5. '일반화'는 한 문장 — "다음에 X가 보이면 Y부터 확인한다"
3번이 어렵습니다 — 막힘의 기억은 빨리 사라집니다. 그래서 다음 대회부터는 문제를 풀며 버린 가설을 한 줄씩 메모하는 습관이 필요합니다. 리라이팅의 고통이 다음 기록 습관을 만듭니다.
3-4. 피드백 루프 —보내고, 코멘트를 수집한다
리라이팅한 글을 밖에 냅니다. 블로그에 게재하거나, CTF 커뮤니티 디스코드의 Write-up 채널에 공유합니다.
피드백 수집 양식:
| 코멘트 | 종류 | 반영 |
|--------|------|------|
| "2단에서 왜 그 가설을 버렸는지 모르겠다" | 이해 장벽 | 2단에 폐기 근거 1문장 추가 |
| "이 유형은 Y 방법도 있다" | 새 지식 | 일반화 단에 링크 추가 |
| 오타·깨진 링크 | 표면 | 즉시 수정 |
왜: 코멘트의 종류를 나누는 것이 포인트입니다. "이해 장벽"류가 오면 그 자리가 독자가 멈춘 곳 — 곧 2-1에서 말한 내 이해의 얕은 지점입니다. 표면 수정은 바로 하고, 이해 장벽은 다시 공부해서 고칩니다. 피드백이 0건이면? 그것도 데이터입니다 — 제목과 첫 문단이 검색독자를 못 잡았다는 뜻일 수 있습니다.
3-5. TOP 5 선정 — 팀의 공동 교과서
마지막으로, 내 Write-up 40개 중 팀원에게 추천할 5개를 고릅니다. 기준은 "잘 쓴 글"이 아니라 "팀원의 약점을 메우는 글"입니다.
TOP 5 선정표 (서식):
| 순위 | 글 | 추천 대상 | 이유 |
|------|-----|-----------|------|
| 1 | crypto_rsa_small_e | pwn 담당 | 암호 입구 문제의 사고법이 그대로 재사용됨 |
| 2 | web_ssti_board | 전원 | SSTI 탐지→확인 절차의 표준 |
| ... | | | |
이 표를 팀 채널에 공유하면, 여러분의 Write-up 폴더가 개인 기록에서 팀의 교과서로 바뀝니다. 다음 스텝(293)의 역할 로테이션에서 팀원이 비주력 분야를 맡을 때, 첫 교재가 바로 이 목록입니다.
4. 미션과 연습문제
미션 — 누적 40개 + 리라이팅 1편
- 대회 #6~#7의 못 푼 문제 3개를 블록 A 루틴(재현 포함)으로 정리합니다.
- 신규 Write-up을 4단 구조 템플릿으로 작성해 누적 40개를 달성합니다.
- 관리 스크립트를 여러분의 폴더에 맞게 돌려 구조 누락 목록을 뽑습니다.
- 누락 글 중 1편을 3-3 절차로 리라이팅합니다 — 버린 가설 2개 복원 필수.
- 리라이팅한 글을 공개하고 피드백 수집 양식을 채웁니다 (0건이면 그 사실을 기록).
- TOP 5 선정표를 만들어 팀에 공유합니다.
연습문제
문제 1. "독자의 멈춤 지점이 곧 내 이해의 얕은 지점"이라고 했습니다. 낯선 독자에게 글을 읽히는 것이 왜 자기 검증이 되나요?
문제 2. 4단 구조에서 "접근 사고" 단에 반드시 들어가야 하는 두 가지는 무엇이며, 이것이 없는 글은 독자에게 어떤 착각을 주나요?
문제 3. Write-up 템플릿을 고정하는 것이 글쓰기 속도를 높이는 이유를 "시작 장벽" 관점에서 설명해 보세요.
문제 4. TOP 5 선정 기준을 "잘 쓴 글"이 아니라 "팀원의 약점을 메우는 글"로 정한 이유는 무엇인가요?
5. 모범 답안과 완료 기준
미션 모범 답안
검증 기준으로 확인하세요.
- 재현의 증거: 블록 A 3개 문제 모두 "직접 다시 풀어 플래그 확인"이 있는가 — 정답 읽기만으로 마감한 것은 불인정입니다.
- 누적 수의 정확성: 스크립트 출력(또는 수동 집계)으로 40개가 확인되는가 — "대충 40개쯤"은 기록이 아닙니다.
- 리라이팅의 깊이: 버린 가설 2개와 막힘 1개가 접근 사고 단에 복원됐는가. 원문과 비교해 2단이 실제로 두꺼워졌는가.
- 피드백 루프: 공개 후 일주일 안에 수집 양식이 채워졌는가 — 0건이면 "제목/첫 문단 점검"이 다음 행동으로 기록됐는가.
- TOP 5의 근거: 각 글에 추천 대상과 이유가 있는가 — "제일 잘 썼다"는 선정이 아니어야 합니다.
연습문제 해답
문제 1 해답. 나는 이미 답을 아는 상태로 글을 쓰므로, 글의 비약을 스스로 발견할 수 없기 때문입니다. 낯선 독자는 그 비약에서 정직하게 멈춥니다 — 배경 지식이 없거나, 가설의 폐기 근거가 안 쓰였거나, 명령의 이유가 없는 자리입니다. 독자가 멈춘 곳은 대개 저자가 "이해한 척"하고 넘어간 곳과 일치합니다. 그래서 피드백은 서비스가 아니라 무료의 이해 검사입니다.
문제 2 해답. 버린 가설(과 그 폐기 근거)과 막힌 지점입니다. 이것이 없는 글은 "저자는 처음부터 정답을 알았다"는 착각을 줍니다 — 독자는 자기가 막혔을 때 어떻게 판단해야 하는지를 배우지 못하고, 재현하다 같은 함정에 빠집니다. 성공 경로만의 글은 결과의 보고이고, 폐기 근거가 있는 글은 판단의 전수입니다.
문제 3 해답. 글쓰기의 가장 큰 시간 소비는 문장이 아니라 "어떤 순서로 쓸까"라는 구조 결정이기 때문입니다. 템플릿이 고정되면 이 결정이 0초가 되고, 뼈대의 각 칸이 "무엇을 채울지"만 묻는 질문 목록으로 변합니다. 빈 칸은 채우고 싶은 충동을 만들므로 시작 장벽이 낮아집니다. 구조의 창의성을 포기하는 대신 문장의 품질에 시간을 쓰는 배분입니다.
문제 4 해답. TOP 5의 용도가 개인 포트폴리오가 아니라 팀 공동 교과서이기 때문입니다. 잘 쓴 글 목록은 저자의 자랑이 되지만, 약점을 메우는 글 목록은 팀원의 성장 경로가 됩니다. 특히 역할 로테이션(Step 293)처럼 비주력 분야를 맡는 상황에서는 "내 분야 입문서"가 절실하고, 팀원이 쓴 Write-up이 그 가장 가까운 교재입니다.
완료 기준 체크리스트
- [ ] 대회 #6~#7의 못 푼 문제 3개를 재현까지 완료했다
- [ ] 신규 Write-up을 4단 구조로 작성해 누적 40개를 달성했다
- [ ] 관리 스크립트로 구조 누락 목록을 뽑았다
- [ ] 누락 글 1편을 리라이팅했다 (버린 가설 2개 복원 포함)
- [ ] 리라이팅 글을 공개하고 피드백 수집 양식을 시작했다
- [ ] TOP 5 선정표(대상+이유 포함)를 팀에 공유했다
6. 흔한 실수와 해결
벽 1. 리라이팅할 때 당시 막힘이 기억나지 않아요
증상: 접근 사고 단을 쓰려는데 "그냥 풀었다"밖에 안 나옵니다.
원인: 막힘의 기억은 수일 안에 사라집니다. 정상입니다 — 그래서 대회 중 메모가 필요한 것입니다.
해결: 지금 할 수 있는 최선은 Write-up·대화 로그·터미널 히스토리를 뒤져 단서를 복원하는 것입니다. 그리고 다음 대회부터 규칙 하나를 추가하세요 — 버린 가설 한 줄 메모. 풀이 중에는 한 줄이면 충분하고, 그 한 줄이 리라이팅 때 금이 됩니다.
벽 2. 스크립트가 글을 못 찾아요
증상: 폴더를 줬는데 "이번 신규: 0개"가 나옵니다.
원인: 대부분 경로 문제입니다 — 한글 경로의 인용부호 누락, 또는 인자 없이 실행해 기본 경로(writeups)를 본 경우.
해결: 경로에 공백·한글이 있으면 따옴표로 감싸세요 — python step292_mgr.py "C:\내 문서\writeups". 그래도 0이면 그 폴더에 .md 파일이 실제 있는지 dir로 확인합니다. 스크립트는 하위 폴더까지는 안 들어갑니다 — 폴더 트리를 쓰고 있다면 스크립트의 glob("*.md")를 rglob("*.md")으로 바꾸면 됩니다.
벽 3. 피드백이 하나도 안 달려요
증상: 공개한 지 일주일, 코멘트 0건.
원인: 셋 중 하나입니다 — ① 노출 부족(혼자 보는 블로그), ② 제목이 검색어와 안 맞음, ③ 첫 문단이 독자를 못 잡음.
해결: ①은 채널을 옮기는 것이 답입니다 — CTF 디스코드의 Write-up 채널처럼 읽는 사람이 모인 곳으로. ②③은 검색 독자의 입장이 되어 확인하세요 — 문제 이름·플랫폼명이 제목에 있는가, 첫 문단에 "이 글을 읽으면 얻는 것"이 있는가. 피드백 0건도 양식에 기록하면 다음 개선의 출발점이 됩니다.
벽 4. 4단 구조가 모든 문제에 안 맞는 것 같아요
증상: 단순한 문제(예: 인코딩 한 겹)는 "배경 지식"에 쓸 말이 없습니다.
원인: 구조를 형식으로 오해했습니다. 4단은 질문지이지 요구 분량이 아닙니다.
해결: 쉬운 문제는 각 단이 한두 문장이면 됩니다 — "배경 지식: Base64 디코딩 (링크 하나)"도 완전한 1단입니다. 구조의 목적은 빼먹지 않는 것이지 늘리는 것이 아닙니다. 반대로 어려운 문제는 2단이 글의 절반이 되는 것이 정상입니다.
벽 5. Write-up 쓰는 시간이 푸는 시간만큼 걸려요
증상: 이틀 계획이 글쓰기에 다 갑니다.
원인: 모든 글을 리라이팅 수준으로 쓰려는 과욕입니다.
해결: 분담 규칙을 정하세요 — 신규 글은 템플릿 그대로 빠르게, 리라이팅은 주 1편만 깊게. 40개 전부가 대표작일 필요는 없습니다. 양의 루틴과 질의 루틴은 다른 속도로 도는 것이 정상이며, 관리 스크립트가 "질을 올릴 후보"를 계속 찍어주므로 리라이팅 재료는 마르지 않습니다.
7. 정리
오늘의 개념
| 개념 | 한 줄 설명 |
|---|---|
| 4단 구조 | 배경 지식 → 접근 사고 → 구현 → 일반화 — 읽히는 글의 뼈대 |
| 접근 사고 단 | 버린 가설 + 막힘의 복원 — 판단의 전수가 일어나는 곳 |
| 일반화 단 | "다음에 X가 보이면 Y부터" — 재사용 가능한 판단 한 문장 |
| 피드백 루프 | 독자의 멈춤 = 내 이해의 얕은 지점 — 무료의 이해 검사 |
| 템플릿 고정 | 구조 결정 시간을 0초로 — 시작 장벽 제거 |
| TOP 5 선정 | 잘 쓴 글이 아니라 팀원의 약점을 메우는 글 — 팀 교과서화 |
오늘의 도구·명령
| 도구·명령 | 하는 일 |
|---|---|
step292_mgr.py |
누적 수 집계 + 4단 구조 누락 탐지 + INDEX.md 생성 |
| 4단 구조 템플릿 | 신규 Write-up의 시작 뼈대 |
| 블록 A 양식(재현 항목) | "읽고 안다"와 "다시 풀어 안다"의 구분 |
| 피드백 수집 양식 | 코멘트를 이해 장벽/새 지식/표면으로 분류 |
| TOP 5 선정표 | 개인 기록을 팀 공동 교과서로 바꾸는 문서 |
명령어보다 중요한 감각
40개라는 숫자보다 중요한 것이 하나 있습니다 — 오늘 리라이팅한 그 1편입니다. 나머지 39편은 양의 자산이지만, 리라이팅 1편은 여러분이 "쓰는 실력"을 올린 증거입니다. 양은 쌓이는 것이고, 질은 올리는 것입니다. 둘은 다른 근육이고, 오늘 둘 다 썼습니다.
그리고 이제 여러분의 폴더는 단순한 기록 보관소가 아닙니다. 관리 스크립트가 구조를 검사하고, 피드백이 이해를 검사하고, TOP 5가 팀의 길잡이가 됩니다. 기록이 시스템이 되는 순간입니다.
전부 체크되면 Step 292 완료입니다. 사이드바의 체크박스를 눌러 진도를 저장하세요.