Level 3 — CTF 실전과 공격 스킬 심화
-
Step 176. CTF 맛보기 1: Web 문제 5개 — 실전 경기장에 입장하다
Level 3의 시작입니다. Level 2까지가 기초 체력이라면, CTF는 실전 경기입니다. 문제마다 서버나 파일이 주어지고, 취약점을 찾아 플래그(flag)를 제출하면 점수가 됩니다. 오늘의 목표는 점수가 아니라 감각입니다 — "실전 문제는 수업과 무엇이 다…
-
Step 177. CTF 맛보기 2: Pwn 문제 도전 (pwnable.kr) — 바이너리와의 첫 대면
Pwn은 실행 파일(바이너리)의 메모리 취약점을 공격하는 CTF 종목입니다. 문제로 실행 파일과 접속할 서버가 주어지고, 파일을 분석해 허점을 찾은 뒤 서버에 공격을 성공시키면 플래그가 나옵니다. 어제의 웹이 "문서를 파고드는 종목"이라면, Pwn은 …
-
Step 178. CTF 맛보기 3: Reversing — crackme 2개 + Ghidra — 소스 없이 읽는 법
Reversing(리버싱)은 소스 코드 없이 실행 파일만 받아 "이게 뭘 하는 프로그램인지" 해부하는 종목입니다. 어제 Pwn이 "허점을 찾아 공격"이라면, 리버싱은 "동작을 이해하는 것" 자체가 목표입니다. 오늘의…
-
Step 179. CTF 맛보기 4: Crypto 입문 3개 — 수학 퍼즐로서의 암호
CTF의 Crypto(암호) 종목은 수학 퍼즐에 가깝습니다. 주어진 암호문과 힌트(키 일부, 파라미터, 소스 코드)에서 출제자의 실수나 약한 수치를 찾아 평문을 복구합니다. 침해 흔적을 찾는 다른 종목과 달리, 여기서 무기는 파이썬 한 줄과 "이…
-
Step 180. CTF 맛보기 5: Forensics/기타 3개 — 수상한 파일의 해부
CTF의 Forensics(포렌식) 종목은 "수상한 파일 하나"를 던져 줍니다. 이미지, 패킷 덤프, 메모리 덤프 — 겉은 멀쩡한데 안에 플래그가 숨어 있습니다. 출발점은 언제나 같은 의심입니다: "겉으로 보이는 것과 파일의 실체가 다르다.&…
-
Step 181. ★ 주력 분야 선정 + 보조 분야 결정 — 나는 어떤 플레이어인가
Web, Pwn, Reversing, Crypto, Forensics — 다섯 분야를 다 맛봤습니다. 이제 집중할 곳을 정합니다. CTF 대회는 팀전이고, 우승 공식은 "모두가 조금씩"이 아니라 "각자 강점 분야의 득점원"이 되는 것…
-
Step 182. 어셈블리 1: 레지스터, mov/push/pop/call/ret, 스택 프레임 — 공용 언어의 문자표
Step 64에서 우리는 어셈블리와 "첫 만남"을 가졌습니다 — if가 cmp와 점프라는 것쯤은 봤습니다. 오늘부터는 Pwn과 Reversing의 공용 언어로서 제대로 배웁니다. 좋은 소식이 있습니다: 실전에서 만나는 명령의 대부분은 열 개 남짓입니다…
-
Step 183. 어셈블리 2: gdb 기초 — 실행 중인 프로그램의 현미경
gdb는 실행 중인 프로그램을 원하는 지점에서 얼려서 내부를 들여다보는 현미경입니다. 어제까지 우리는 컴파일 결과물(.s 파일)을 정지 화면으로 읽었습니다. 오늘부터는 살아 있는 프로그램 — 명령 한 줄이 지날 때마다 바뀌는 레지스터와 스택 —…
-
Step 184. 어셈블리 3: C 프로그램을 gdb로 한 줄씩 따라가기 — 호출 규약의 실황 중계
Step 65에서 "인자는 rdi·rsi로, 결과는 rax로"라는 약속을 배웠고, Step 183에서 gdb의 기본 조작을 익혔습니다. 오늘은 그 약속이 살아 움직이는 현장을 한 줄씩 따라갑니다. call 명령 하나가 실행되는 순간 rip가 어디로 점…
-
Step 185. 스택 완전 이해 — 함수 호출 시 스택에 쌓이는 것들의 완전한 지도
Step 184에서 우리는 call이 리턴 주소를 스택에 남기는 것을 봤습니다. 그런데 스택에는 리턴 주소만 있는 게 아닙니다. 지역 변수, 이전 함수의 기준점, 그리고 그 리턴 주소까지 — 이 모든 것이 정해진 순서로…
-
Step 186. ★ 버퍼 오버플로우 재현: RET 덮어쓰기 성공 — 인생 첫 메모리 공격
Step 62에서 넘친 입력이 이웃 변수를 덮는 것을 봤고, Step 185에서 그 입력이 RET까지 닿는다는 것을 지도로 확인했습니다. 오늘은 마지막 한 걸음입니다. 덮는 값을 무작정 ‘A’가 아니라 계산된 주소로 바꾸면, 함수가 ret하는…
-
Step 187. 보호 기법: NX, ASLR, Canary, PIE — 사중 방어막의 지도
Step 186에서 우리는 방어막 세 겹을 일부러 벗기고 공격했습니다. 오늘은 그 방어막의 정체를 하나씩 만납니다. 현대의 바이너리는 기본적으로 사중 방어 — NX, Canary, ASLR, PIE — 를 두르고 나옵니다. 각각이 Step 186…
-
Step 188. pwntools 입문: 연결, p64, 페이로드 자동화 — 손공격에서 스크립트로
Step 186에서 우리는 파이썬 한 줄짜리 페이로드 생성기를 파이프로 연결해 공격했습니다. 잘 됐지만, 주소를 손으로 뒤집고(\x96\x11\x40…), 출력과 입력을 파이프로 억지로 이었습니다. pwntools는 이 과정 전부를 위한 파이썬 라이브러리입니다. 주…
-
Step 189. ★ 미니 프로젝트: 오버플로우 익스플로잇 스크립트 완성 — 손 공격을 공학으로
Step 186에서 여러분은 오프셋을 손으로 쟀습니다. 8바이트씩 늘려 가며 크래시를 보고, 계산기로 거리를 세고. 한 문제를 푸는 데 그 과정이 매번 반복된다면? 실전에서는 그 일을 프로그램이 하게 만듭니다. 겹치지 않는 패턴을 쏘고,…
-
Step 190. 팀 찾기/결성 + CTFtime 캘린더 — 혼자 하는 게임을 팀 스포츠로
여기까지 오는 동안 여러분은 혼자 풀었습니다. 그런데 CTF의 본무대 — 주말마다 열리는 국제 대회 — 는 팀 경기입니다. 한 사람이 Web, Pwn, Reversing, Crypto, Forensics를 전부 잘할 수는 없습니다. 분야별 전문가가 모여야…
-
Step 191. PortSwigger Academy: SQLi 고급 — Blind, time-based, OOB
Step 137에서 Blind의 문을 열었습니다 — 화면에 안 나와도 참/거짓으로 빼낸다. 오늘은 그 심화입니다. 참/거짓 문구마저 갈리지 않을 때는 시간을 쓰고(time-based), 응답 채널 자체가 죽어 있으면 서버가 밖으로 요청을 보내게 만듭니다(OOB, Out…
-
Step 192. 고급 XSS: CSP 우회, DOM 심화 — 방어막이 있는 환경의 공격
Step 138~139의 XSS는 "아무 방어가 없는" 세계였습니다. 현실의 잘 만든 사이트에는 CSP(Content-Security-Policy) 라는 방어막이 있습니다 — "이 페이지에서 실행될 수 있는 스크립트의 출처"를 서버가…
-
Step 193. SSTI: 템플릿 인젝션 → RCE — 입력이 서버의 코드가 될 때
인젝션 패밀리의 마지막 변종을 만납니다. SQL 인젝션은 입력이 SQL 문법이 됐고, XSS는 입력이 HTML 문법이 됐습니다. SSTI(Server-Side Template Injection) 는 입력이 템플릿 엔진의 문법이 됩니다. 웹 프레임워크가 화면을 그릴 때 …
-
Step 194. SSRF — 서버를 프록시로 부려 내부망을 읽다
웹 서비스에는 "서버가 대신 가져와 주는" 기능이 많습니다. 이미지 URL을 넣으면 서버가 내려받아 보여 주고, 재고 확인 API가 다른 서버의 주소를 받아 조회합니다. 그런데 이 "대신 가져오기"를 요청하는 쪽이 URL을 마음대로 …
-
Step 195. XXE — XML 파서에 숨은 파일 읽기 명령
XML에는 엔티티(entity) 라는 기능이 있습니다. 문서 안에서 "이 이름은 이 내용으로 바꿔 끼워라"라는 치환 규칙입니다. 그런데 이 규칙의 내용으로 "외부 파일"을 지정할 수 있습니다 — <!ENTITY xxe SYSTE…
-
Step 196. 역직렬화 취약점 — 데이터가 코드가 되는 순간
프로그램이 객체를 파일에 저장하거나 네트워크로 내려면, 메모리 속 객체를 바이트 나열로 펼쳐야 합니다. 이것이 직렬화(serialization) 입니다. 반대로 바이트에서 객체를 다시 조립하는 것이 역직렬화(deserialization) 입니다. 문제는 "다시…
-
Step 197. JWT 공격 심화 — alg 혼동과 약한 시크릿으로 관리자 되기
Step 150에서 우리는 JWT를 해부했고 alg=none과 약한 비밀키의 맛을 봤습니다. 오늘은 한 발 더 들어갑니다. 서버가 비대칭키(RS256) 로 서명하는 정상적인 구성에서도, 검증 코드가 토큰의 alg 헤더를 그대로 믿으면 뚫립니다. 공개키는 이름 그대로…
-
Step 198. GraphQL/API 보안 — 하나의 문으로 들어가 스키마를 통째로 읽다
REST API가 "주소마다 정해진 데이터"를 준다면, GraphQL은 단 하나의 엔드포인트(/graphql)에서 클라이언트가 "이 필드, 저 필드만 골라 달라"고 쿼리를 씁니다. 개발에는 편한데, 보안에는 새로운 표면이 생깁니다. …
-
Step 199. Webhacking.kr 1~15 — 국내 워게임 종합 선물 세트
지금까지 웹 기법을 하나씩 배웠다면, 이제는 종합 선물 세트를 풀 차례입니다. Webhacking.kr은 문제마다 "그래 이거지" 싶은 트릭이 숨어 있는 워게임으로 유명합니다. 1~15번 구간은 기초~중급이라 지금 실력으로 도전할 수 있지만, 상식 밖…
-
Step 200. Webhacking.kr 16~30 — 기법의 창의적 조합
16번부터는 게임의 성질이 바뀝니다. 단일 기법으로 풀리는 문제가 줄고, 인코딩 우회 + SQLi, 파일 업로드 + 세션 조작처럼 기법의 조합을 요구하는 문제가 늘어납니다. 한 개의 열쇠가 아니라 두 개의 열쇠를 순서대로 돌려야…
-
Step 201. 레이스 컨디션, HTTP 요청 스머글링 개념 — 찰나와 어긋남의 공격
지금까지의 웹 공격이 "무엇을 보낼까"의 싸움이었다면, 오늘의 두 공격은 "언제 보낼까"와 "경계를 어디로 읽을까"의 싸움입니다. 레이스 컨디션(race condition)은 확인과 사용 사이의 찰나를 동시 요청으로…
-
Step 202. ★ 중간 점검: 중급 웹 문제 독립 해결 3연속 — Write-up 금지 구간
Web 트랙의 졸업 시험입니다. 규칙은 하나 — 중급 문제를 풀이 없이 3개 연속으로 해결하는 것. 하나라도 막혀서 풀이를 보면 그 문제는 무효입니다. 다만 연속이 깨져도 처음부터가 아니라, 새 문제로 다시 3연속에 도전하면…
-
Step 203. shellcode 작성: execve 쉘코드 손으로 만들기 — 쉘을 띄우는 29바이트
쉘코드(shellcode)는 메모리에 심어 실행시키는 날것의 기계어입니다. C 소스도, 실행 파일 껍데기도 없이 — CPU가 바로 뜯어먹는 바이트 열입니다. 그 목표는 관례적으로 하나입니다. execve("/bin/sh", …) — 쉘을 띄우는 시…
-
Step 204. ret2win: 원하는 함수 호출 — 인자까지 쥐여주는 RET 덮어쓰기
Step 186에서 우리는 RET를 덮어 아무도 부르지 않는 함수를 실행했습니다. 그런데 실전의 목표 함수는 대개 인자를 요구합니다. 함수를 부른다는 것은 주소로 점프하는 것만이 아니라, 약속된 레지스터에 인자를 채워 넣는 것까지입니다. 오늘은 그…
-
Step 205. ROP 1: 가젯 개념, ROPgadget/ropper — 코드 조각의 조립술
Step 204에서 우리는 pop rdi; ret 조각 하나를 빌려 함수에 인자를 쥐여줬습니다. 그런데 그 조각은 어디서 왔을까요? 찾아보니 바이너리 곳곳에 이런 조각이 수십, 수백 개 숨어 있었고, libc 같은 큰 라이브러리에는 십만…
-
Step 206. ROP 2: 체인으로 system(“/bin/sh”) 호출 — NX를 넘어 쉘로
지금까지의 목표는 "플래그를 출력하는 함수를 부르는 것"이었습니다. 오늘의 목표는 다릅니다. system("/bin/sh") — 프로그램에게 쉘을 실행시키는 것. 공격자의 최종 목적지입니다. 그리고 오늘부터는 NX(스택 실행 금지)를…
-
Step 207. ret2libc: libc 주소 leak과 ASLR 우회 — 매번 바뀌는 주소를 추적한다
Step 206의 공격에는 공짜가 하나 있었습니다. system@plt라는 고정 관문. 그런데 libc의 진짜 함수들 — system, 그리고 "/bin/sh" 문자열 — 은 ASLR 때문에 실행할 때마다 다른 주소에 실립니다. 오늘 우리는 그 미끄러…
-
Step 208. Format String: %n으로 메모리 쓰기 — 출력 함수로 쓰는 공격
버퍼 오버플로우는 "넘치게 쓰는" 공격이었습니다. 오늘의 주인공은 다릅니다. printf — 출력하는 함수 — 에게 메모리를 읽게 하고, 심지어 쓰게 합니다. 넘침도, 덮어쓰기도 없이, 포맷 문자열의 문법 그 자체가 무기가 됩니다. %p 몇…
-
Step 209. pwnable.kr Toddler’s Bottle 완주 — 입문 워게임 졸업식
Step 177에서 Toddler’s Bottle의 첫 두 문제(fd, collision)를 맛봤습니다. 오늘은 남은 전 구간을 달립니다. 이 코너의 문제들은 하나같이 "C 언어의 함정 하나"를 가르치는 명문입니다 — 버퍼 오버플로우, 패킹된 바이너리…
-
Step 210. GOT/PLT 구조 이해와 GOT overwrite — 함수 호출 가로채기
프로그램이 puts를 부를 때, 그 주소는 어디서 올까요? 컴파일 시점에는 모릅니다 — puts는 라이브러리(libc)에 있고, 라이브러리가 메모리 어디에 올라갈지는 실행 때 정해지니까요. 그래서 프로그램은 주소표(GOT)를 하나 두고, 첫 호출 때 주소를 찾아…
-
Step 211. 힙 입문: 할당자 동작, use-after-free 개념 — 반납된 땅의 재사용
Step 61에서 우리는 malloc/free를 "빌리고 반납하는 규칙"으로 배웠고, 댕글링 포인터도 일부러 만들어 봤습니다. 오늘은 한 겹 아래로 내려갑니다 — 반납된 메모리가 실제로 어디에, 어떤 모습으로 보관되고, 다음 malloc이 왜 그 자리…
-
Step 212. 힙 익스플로잇 맛보기: tcache poisoning — 대기열 장부를 덮다
Step 211에서 우리는 반납된 청크가 대기열(tcache)로 들어가고, 다음 malloc이 그 자리를 다시 준다는 것을 봤습니다. 그런데 그 대기열은 어떻게 "다음 빈 청크"를 기억할까요? 정답은 — 반납된 청크의 앞 8바이트에 다음 청크의 주소를…
-
Step 213. pwnable.tw 쉬운 문제 3개 — 소스 없는 세계로
pwnable.kr의 Toddler’s Bottle을 졸업했다면, 다음 관문은 pwnable.tw입니다. 겉모습은 비슷한 워게임이지만 한 가지가 결정적으로 다릅니다 — 소스를 주지 않는 문제가 많다는 것. 지금까지의 "소스 읽기 → 역산" 루틴이 &q…
-
Step 214. ★ 중간 점검: Canary+NX 바이너리 독립 익스플로잇 — 유출하고, 살려 두고, 덮는다
지금까지 Pwn 트랙에서 배운 것은 네 조각입니다 — 스택 오버플로우로 RET를 덮는 법(Step 186), 보호 기법이 무엇을 막는가(Step 187), pwntools로 페이로드를 만드는 법(Step 188), 그리고 포맷 스트링으로 메모리를 읽는 법. 오늘은 이…
-
Step 215. Ghidra 심화: 함수 분석, 구조체 복원 — 기계가 지은 이름을 사람의 언어로
Step 178에서 Ghidra를 처음 열어 디컴파일 결과를 "읽어" 봤습니다. 실전 리버싱은 읽기가 아니라 정리입니다. FUN_00101169, param_1, local_48 같은 기계 이름을 의미 있는 이름으로 바꾸고, 변수의 타입을 고치고, 바…
-
Step 216. x64dbg 심화: 메모리 브레이크포인트, 패치 — 실행 중인 프로그램을 수술한다
Ghidra가 "읽고 정리하는 책상"이라면, x64dbg는 "실행 중인 프로그램의 조종실"입니다. 오늘 배우는 두 기술은 리버싱의 가장 강력한 수법입니다. 하나는 메모리 브레이크포인트 — "이 값이 대체 어디서 읽히는 거야?…
-
Step 217. crackme 10개 (난이도 하) — 유형을 간파하는 속도를 기른다
지금까지 리버싱 기법을 하나씩 배웠습니다. 오늘부터 이틀은 반복입니다 — 같은 기법을 낯선 문제에 얼마나 빨리 적용하는가가 실력입니다. 난이도 하 crackme는 사실 세 가지 유형의 반복이고, 유형을 30초 안에 간파하는 것이 오늘의 목표입니다.…
-
Step 218. crackme 10개 (난이도 중) — 관계식을 읽고, 문을 하나씩 연다
어제의 난이도 하가 "정답이 어디 숨었나"였다면, 오늘의 난이도 중은 "검증의 구조를 읽는가"입니다. 이름과 시리얼의 관계식을 풀어 키젠을 만들거나, 세 겹의 검증문을 하나씩 열거나, 실행할 때마다 바뀌는 검증 앞에서 전략을 바꾸거나…
-
Step 219. 안티디버깅 기법과 우회 — 디버거를 피하는 프로그램과 그 돌파법
Step 178에서는 얌전한 crackme를 만났습니다 — 비밀번호를 묻고, 얌전히 비교하고, 결과를 알려 줬죠. 실전의 바이너리는 다릅니다. 악성코드와 상용 보호 프로그램은 "지금 디버거에 잡혀 있는가"를 스스로 검사하고, 감지되면 종료하거나 엉터리…
-
Step 220. 패킹과 언패킹 — UPX와 OEP 찾기
Step 219의 샘플은 strings에 메시지가 그대로 보였습니다. 그런데 실전 바이너리 — 특히 악성코드 — 는 strings에 아무것도 안 걸리는 경우가 많습니다. 원본 코드를 통째로 압축·암호화해 싸 버렸기 때문입니다. 이것이 패킹(packing)이고, 싸인 것…
-
Step 221. 키젠 — 시리얼 알고리즘 분석과 생성기 작성
패치(Step 219식 우회)가 "검사를 부수는 것"이라면, 키젠(keygen)은 "검사를 통과하는 정답을 만들어 내는 것"입니다. 검증 로직을 파괴하지 않고 완전히 이해했음을 증명하는 방식 — 리버싱 실력의 꽃이라 불립니다. 오늘은…
-
Step 222. .NET과 파이썬 바이너리 리버싱 — 기계어가 아닌 바이너리
지금까지의 리버싱은 기계어(x86-64 어셈블리)와의 싸움이었습니다. 그런데 세상의 실행 파일이 전부 기계어는 아닙니다. .NET 프로그램은 IL 바이트코드, PyInstaller로 묶인 파이썬은 파이썬 바이트코드를 품고 있습니다 — 그리고 이들은 디컴파일하면 소스 코…
-
Step 223. 안드로이드 APK 분석 맛보기 — jadx
리버싱의 마지막 맛보기는 모바일입니다. 안드로이드 앱의 배포 파일 APK는 사실 zip이고, 안의 코드(classes.dex)는 자바 바이트코드 — Step 222에서 배운 "잘 읽히는 세계"의 연장선입니다. 오늘은 APK의 구조를 직접 풀어 보고(실…
-
Step 224. 난독화된 코드 분석 전략 — 정면으로 읽으면 지는 싸움
Step 217~218에서 crackme를 풀다 보면 만납니다 — 변수명이 _0x4a2f이고, 문자열이 숫자 배열이고, while True 안에서 상태 번호로 점프하는 코드. 정면으로 한 줄씩 읽으면 집니다. 난독화는 "읽기를 괴롭게" 만드는 기술이고…
-
Step 225. 악성코드 정적 분석 (격리 랩 필수) — 실행하지 않고 속을 읽는다
악성코드 분석가의 첫 번째 무기는 실행이 아니라 독서입니다. 파일을 열지도, 실행하지도 않은 채 해시, 문자열, 헤더, 임포트 목록만으로 "이 파일이 무엇을 하려는가"를 추정하고 IoC(Indicator of Compromise, 침해 지표)를 뽑아냅…
-
Step 226. ★ 중간 점검: 난이도 중 crackme 독립 해부 — 풀이 없이, 끝까지
Reversing 트랙의 졸업 시험입니다. 규칙은 단순합니다 — 안 풀어 본 난이도 중 crackme 하나를 골라, 다른 사람의 풀이를 보지 않고, 전체 로직을 문서화할 수준까지 해부한다. 정답을 맞히는 것으로 끝이 아니라, 검증 알고리즘…
-
Step 227. 수학 기초: 모듈러 연산, 유클리드 호제법, 오일러 정리 — 암호의 최소 무장
Crypto 트랙의 첫날입니다. 현대 암호는 전부 "mod n 세계의 산수"로 돼 있습니다 — 나머지만 남기는 세계에서 곱하고, 거듭제곱하고, "나누기"를 합니다. 오늘 배울 세 가지 — 모듈러 연산, 유클리드 호제법, 오일러 정리 …
-
Step 228. RSA 완전 구현: 키 생성부터 암복호화까지 — 교과서를 내 손으로
Step 227에서 부품(역원, 오일러 정리)을 만들었으니, 오늘은 조립입니다. RSA는 "큰 수의 소인수분해가 어렵다"는 사실 하나에 선 암호입니다 — 두 소수를 곱한 n은 공개해도, n을 다시 쪼개지 못하면 비밀키를 모릅니다. 오늘 512비트 소수…
-
Step 229. RSA 공격 1: 작은 e, 공통 모듈러스 — 구현 실수가 수학적 약점이 되는 순간
Step 228에서 RSA 성을 지었습니다. 오늘은 그 성의 약한 돌 두 개를 찾아 뽑습니다. 첫째, 공개 지수 e가 작고 메시지도 작으면 m^e가 n을 넘지 못해 mod 연산이 아예 걸리지 않습니다 — 암호문의…
-
Step 230. RSA 공격 2: 페르마 인수분해, Wiener’s attack — 키 생성이 엉터리면 수학이 무너진다
RSA의 안전성은 "n을 인수분해하기 어렵다"에 걸려 있습니다. 그런데 이 어려움은 키 생성이 정상일 때만 성립합니다. p와 q가 너무 가까우면 n의 제곱근 근처를 훑는 것만으로 인수분해가 끝나고(페르마), 비밀 지수 d가 너무 작으면 공개값…
-
Step 231. Cryptopals Set 1 완주 — XOR 공격의 교과서를 내 코드로
Cryptopals는 "암호 공격을 코드로 배우는" 최고의 커리큘럼으로 꼽힙니다. Set 1의 8문제는 XOR 공격의 교과서입니다 — 단일 바이트 XOR을 빈도 분석으로 깨고, 반복키 XOR은 키 길이를 해밍 거리로 추정한 뒤 열(column)별 단일…
-
Step 232. Cryptopals Set 2: ECB/CBC, 패딩 오라클 — 블록 암호의 허점을 뚫는다
Set 1이 "XOR과 통계"였다면, Set 2는 "블록 암호 모드의 구조적 결함"입니다. ECB는 같은 평문 블록이 같은 암호문 블록이 되는 성질 하나로 "비밀 문자열을 한 글자씩 빼내는" 공격을 허용하고, CBC…
-
Step 233. AES 구조와 모드별 취약점 — 세계 표준의 해부도와 실패 지도
AES는 미국 표준(NIST FIPS 197)이자 사실상 전 세계 대칭키 암호의 단일 표준입니다 — TLS, 디스크 암호화, Wi-Fi까지 전부 AES 위에 있습니다. 그런데 이틀간 우리는 이 "세계 표준"을 반복해 깨뜨렸습니다. 모순이 아닙니다 —…
-
Step 234. 해시 공격: 길이 확장, 충돌 개념 — 해시를 “서명”으로 쓰면 생기는 일
해시는 지문입니다 — 입력이 1비트만 달라도 출력이 통째로 바뀌고, 되돌릴 수 없습니다. 그런데 이 안전한 도구를 잘못 조립하면 공격이 됩니다. 대표적인 것이 길이 확장 공격(length extension attack): H(secret + message)를 "…
-
Step 235. DH 키 교환과 MITM 시뮬레이션 — 도청당하는 채널에서 비밀을 만드는 법, 그리고 그 한계
지금까지의 암호(대칭키)에는 치명적인 선행 문제가 있었습니다 — 키를 먼저 어떻게 나누는가? 디피-헬먼(Diffie-Hellman) 키 교환은 그 문제를 수학으로 해결합니다: 도청당하는 채널에서 공개값만 주고받고도, 두 사람만 아는 공통 비밀이 생깁니다. 그런데 이 마…
-
Step 236. ECC 맛보기: 타원곡선 위의 덧셈 — 점을 더해서 암호를 만든다
RSA와 DH가 "mod 세계의 거듭제곱"으로 만든 암호라면, 타원곡선 암호(ECC)는 "곡선 위의 점 덧셈"으로 만드는 암호입니다. 문법은 바뀌지만 함정 함수의 구조는 같습니다 — 점 P를 k번 더한 Q는 계산이 빠른데, P와 Q만…
-
Step 237. CTF Crypto 기출 10문제 — 배운 무기를 실전에 투입하는 날
Crypto 문제 풀이의 절반은 계산이 아니라 분류입니다. output.txt만 덩그러니 주어진 문제에서 "이건 작은 e 문제다"라고 감잡는 순간 풀이의 80%가 끝납니다. 오늘은 기출 10문제를 선정해 분류 루틴을 적용하고, 그 전에 먼저 — 이…
-
Step 238. ★ 중간 점검: 보통 난이도 Crypto 5문제 독립 해결 — Write-up 금지 구간
Crypto 트랙의 졸업 시험입니다. 규칙은 하나 — 보통 난이도 문제 5개를 풀이 없이 독립 해결하는 것. 수학을 "아는 것"과 "공격 코드로 쓰는 것"은 다릅니다. 지금까지 10개 챕터에서 배운 모든 무기를, 아무도 알려…
-
Step 239. 헥스와 파일 시그니처: file, binwalk, 수동 치빙 — 바이트 여섯 개의 신원 조회
Forensics 트랙의 첫 챕터입니다. 포렌식 분석가가 증거 파일을 받아 제일 먼저 하는 일은 "네가 정말 너니?"를 묻는 것입니다. 파일의 신원을 증명하는 것은 확장자가 아니라 앞쪽 몇 바이트 — 매직 바이트입니다. 오늘은 이…
-
Step 240. 스테가노그래피: LSB, zsteg, 오디오 스펙트로그램 — 보이는 그림 뒤의 편지
암호가 "읽을 수 없게" 숨긴다면, 스테가노그래피(steganography)는 "있는 줄도 모르게" 숨깁니다. 휴일 풍경 사진 한 장이 사실은 편지 봉투일 수 있습니다. CTF 포렌식의 단골 종목이자, 실제 악성코드가 설정값이나 페이…
-
Step 241. pcap 분석 심화: Wireshark 고급 필터, tshark — 패킷 백 개의 사건 재구성
CTF와 실제 침해 사고에서 pcap 파일은 수만 개의 패킷으로 옵니다. 눈으로 한 줄씩 읽는 것은 불가능하고, 필요도 없습니다. 실전 분석가의 솜씨는 통계로 좁히고, 필터로 파고들고, 스트림으로 읽는 3단 체계입니다. 오늘은 "사무실 PC가…
-
Step 242. 메모리 포렌식: Volatility 3 — 꺼지면 사라지는 증거를 붙잡는 법
사건 현장의 컴퓨터 전원을 끄는 순간, RAM의 내용은 증발합니다. 그런데 정작 가장 중요한 증거 — 지금 실행 중인 악성 프로세스, 방금 친 명령어, 복호화된 키, 평문으로 풀린 암호 — 는 디스크가 아니라…
-
Step 243. 디스크 포렌식: Autopsy, 삭제 파일 복구 — 지워진 것은 지워지지 않았다
휴지통을 비우면 파일은 어디로 갈까요? 정답은 — 아무데도 안 갑니다. 파일시스템은 "이 자리 써도 됨"이라는 표시만 바꾸고 데이터는 그대로 둡니다. 그래서 덮어쓰이기 전까지 복구가 가능하고, 범인이 지운 파일이 법정 증거가 됩니다. 오늘은…
-
Step 244. 윈도우 포렌식: 레지스트리, 이벤트 로그, 프리페치 — 실행 흔적의 보고를 뒤진다
"어제 밤 이 PC에서 악성 exe가 실행됐다"는 신고가 접수됐다고 합시다. 조사관은 무엇을 볼까요? 윈도우는 사용자의 행동을 사방에 기록해 둡니다 — 실행한 프로그램의 캐시(Prefetch), 실행 횟수와 마지막 실행 시각(UserAssist), 로…
-
Step 245. 로그 분석 시나리오: 침입 흔적 타임라인 재구성 — 흩어진 퍼즐을 한 줄의 이야기로
실제 침해 조사 현장에서 증거는 한 파일에 예쁘게 정리되어 있지 않습니다. 웹 서버 로그, 인증 로그, 명령 기록이 제각각 흩어진 퍼즐 조각입니다. 그런데 "웹 로그의 웹쉘 업로드 시각 → 인증 로그의 이상…
-
Step 246. EXIF/메타데이터와 문서 포렌식 — 파일 속에 새겨진 지문을 읽는다
사진 한 장에는 찍힌 풍경 말고도 또 하나의 정보층이 있습니다 — 무슨 기기로, 언제, 어디서 찍었는지가 파일 안에 새겨져 있습니다(EXIF). 오피스 문서에도 작성자, 마지막 수정자, 만든 프로그램의 이름이 남습니다. 사건에서는 이것이 위치…
-
Step 247. 암호화 아티팩트 복구 기법 — 잠긴 증거를 여는 세 가지 열쇠
포렌식 현장에서 "중요한 파일이 암호로 잠겨 있다"는 흔한 벽입니다. 압축 파일, 오피스 문서, 암호화된 메모 — 조사는 거기서 멈추지 않습니다. 잠금장치마다 약점이 있기 때문입니다: 단순 XOR은 전수 조사 몇 백 번에 무너지고,…
-
Step 248. 종합 포렌식 챌린지 5개 — 기법 사슬을 혼자 힘으로 잇는다
실전 포렌식 문제는 기법이 섞여 나옵니다. 파일 하나를 열었더니 다음 단서가 나오고, 그 단서가 다른 파일의 열쇠가 되는 사슬(chain) 구조입니다. "pcap에서 파일 추출 → 그 파일이 암호화 → 크래킹 → 안에 메타데이터…
-
Step 249. 네트워크 침해 사고 분석 시뮬레이션 — 패킷 속에서 사건을 재구성한다
포렌식 트랙의 종합 시험은 침해 사고 전체를 다루는 것입니다. 실무의 침해 사고 대응(Incident Response, IR) 팀은 사건이 터지면 증거 묶음을 받아 침입 지점을 찾고, 피해 범위를 정하고, 타임라인을 만들고, 보고서를 씁니다. 오늘은…
-
Step 250. ★ 중간 점검: 종합 포렌식 문제 독립 해결 + 보고서 — 증명하는 사람이 된다
Forensics 트랙의 졸업 시험입니다. 포렌식은 "풀었다"가 아니라 "증명했다"가 완성입니다 — 플래그를 찾는 것으로 끝나지 않고, 모든 주장에 증거(명령, 출력, 스크린샷)가 붙은 보고서로 마무리되어야 합니다. 오늘의 완료 조건…
-
Step 251. TryHackMe 입문 경로 + Easy 룸 3개 — 실전 머신의 문을 연다
지금까지의 무대는 내 컴퓨터와 미리 짜인 문제지였습니다. 오늘부터는 실전형 플랫폼으로 옮깁니다. TryHackMe(THM)는 문제와 가이드가 함께 있는 실전 머신 플랫폼입니다 — 룸(room)마다 공격할 가상 머신이 뜨고, 룸의 질문에 답을 제출하며 진행합니다.
-
Step 252. THM Easy 5개 (누적 8) — 루틴을 손가락에 새긴다
머신 공략은 루틴 게임입니다. nmap → 서비스 조사 → 웹이면 경로 스캔 → 취약점 가설 → 익스플로잇 → 쉘 → 열거 → 권한 상승. 이 순서가 손가락에 새겨지기 전까지는 실력이 아니라 우연이…
-
Step 253. THM 리눅스 privesc 룸 (누적 13) — 쉘 그다음, root까지
쉘까지는 되는데 root가 안 되는 머신을 공략하는 구간입니다. 리눅스 권한 상승(privilege escalation, privesc)의 실전 패턴은 정해져 있습니다 — SUID(GTFOBins), sudo -l, cron 쓰기 가능 파일, capabilities, …
-
Step 254. THM 윈도우/AD 입문 룸 (누적 18) — 기업 환경의 주인공을 만나다
지금까지 여러분이 깨 온 머신은 전부 리눅스였습니다. 그런데 실제 기업 환경의 주인공은 윈도우입니다 — 사무실 PC, 파일 서버, 그리고 그 전체를 관리하는 Active Directory(AD)까지. 오늘부터는 공격 표면이 완전히 바뀝니다. SSH 대신 RDP,…
-
Step 255. Hack The Box Starting Point 완주 — 한 수 위의 무대로
TryHackMe가 "안내가 있는 실습장"이었다면, Hack The Box(HTB)는 "안내를 거의 떼어낸 실전"입니다. 힌트가 적고, 머신은 날것에 가깝고, 같은 머신을 전 세계의 다른 플레이어와 동시에 두드립니다. 그래서 HTB …
-
Step 256. HTB Easy 2대 — 혼자서 root까지: 안내 없는 첫 완주
오늘은 이 커리큘럼에서 가장 조용하고 가장 무거운 챕터입니다. 해야 할 일은 단순합니다 — HTB Easy 머신 두 대를, write-up도 힌트도 없이, 정찰부터 root까지 혼자 뚫는 것. Starting Point까지는 안내가 있었습니다. 오늘부터는 없습니다.
-
Step 257. HTB Easy 2대 (누적 4) — 입구의 레퍼토리를 넓히다
두 대를 혼자 뚫었으니, 이제 여러분에게는 "내가 잘하는 입구"가 생겼습니다. 그리고 그것이 오늘의 문제입니다. 사람은 성공한 경로를 반복하게 되어 있습니다 — 웹으로 뚫은 사람은 다음에도 웹만 봅니다. 머신마다 입구는 다른데(웹 취약점, FTP…
-
Step 258. HTB Easy 2대 (누적 6) — 시간 제한 훈련: 시계를 켜고 푼다
대회와 시험에는 시계가 돌아갑니다. OSCP 시험은 24시간이고, CTF 예선은 몇 시간이고, 그 안에서 "시간을 어디에 쓰는가"가 합격과 우승을 가릅니다. 지금까지 여러분은 정확성을 훈련했습니다 — 오늘부터는 거기에 시계를 얹습니다.
-
Step 259. 리눅스 권한 상승 완전 정복 — 패턴에서 체크리스트로
Step 125~126에서 상승 정찰을 배웠고, 머신들을 풀면서 SUID·sudo·cron 같은 패턴을 흩어져 만났습니다. 오늘은 그 흩어진 경험을 한 장의 완전한 체크리스트로 조립하는 날입니다. 새 머신에 쉘을 얻었을 때 위에서부터 기계적으로 돌릴 수 있는…
-
Step 260. 윈도우 권한 상승 완전 정복 — 서비스·토큰·설정의 문들
리눅스의 상승이 SUID·sudo·cron의 세계였다면, 윈도우는 다른 생태계입니다 — 서비스, 토큰 특권, 레지스트리 설정이 무대입니다. 그런데 사고방식의 뼈대는 같습니다. Step 259의 그 질문, "높은 권한이 실행하는 것을 낮은 권한이 바꿀 수 있는가…
-
Step 261. Active Directory 1 — 도메인 구조 이해
지금까지의 상대는 "한 대의 머신"이었습니다. 그런데 회사를 상대하는 순간 세계가 바뀝니다 — 직원 수백 명의 계정, 수백 대의 PC, 파일 서버, 프린터가 하나의 중앙 시스템으로 묶여 있습니다. 그것이 Active Directory(AD)입니다. 그…
-
Step 262. Active Directory 2 — Kerberoasting과 AS-REP Roasting
Step 261에서 두 문장을 남겼습니다 — "서비스 티켓은 서비스 계정의 비밀번호로 암호화돼 온다", "도메인 사용자는 누구나 서비스 티켓을 요청할 수 있다". 오늘은 이 두 문장을 맞물려 AD의 대표 공격 Kerberoasting…
-
Step 263. Active Directory 3 — Pass-the-Hash와 BloodHound
Step 262에서는 티켓을 까서 비밀번호를 얻었습니다. 그런데 침투 현장에서는 비밀번호가 아니라 해시가 먼저 손에 들어오는 경우가 많습니다 — 장악한 머신의 메모리나 SAM 파일에서요. 평문으로 못 까면 쓸모없는 걸까요? 윈도우 NTLM 인증의 뼈아픈…
-
Step 264. 피벗팅 심화 — 장악한 머신을 통과해 내부망으로
Step 163에서 여러분은 터널 하나를 팠습니다. 실전 침투 테스트에서는 터널 하나로 끝나지 않습니다 — 외부에서 보이는 웹 서버를 장악해 보니, 그 너머에 외부망에서 절대 닿지 않는 내부망이 또 있습니다. 장악한 머신을 거점(피벗)…
-
Step 265. HTB Medium 1대 — 며칠 걸려도 독립 해결
첫 Medium 머신은 벽입니다. Easy에서 익힌 "표준 기법 하나로 입구가 열리는" 감각이 여기서는 통하지 않습니다 — 입구가 두 겹이고, 뚫려도 권한 상승이 꼬여 있습니다. 오늘의 목표는 빨리 푸는 것이 아닙니다. 며칠 걸려도…
-
Step 266. Medium 복기 + 재공략 — 풀고 나서 배우는 법
머신 한 대의 학습 가치는 root를 찍는 순간이 아니라, 그 다음에 발효됩니다. 혼자 힘으로 뚫은 지금이야말로 남의 풀이를 읽을 수 있는 유일한 시점입니다 — 스포일러의 위험 없이, 내 경로와 남의 경로를 나란히…
-
Step 267. HTB Medium 1대 (누적 2) — 주연 서비스를 읽고, 막힘을 통계로
두 번째 Medium은 다른 의미로 중요합니다. 첫 대에서 배운 패턴(열거 심화 + 가설 운영 + 리서치)이 우연이 아니라 재사용 가능한 실력인지 검증하는 판이기 때문입니다. 오늘의 주제는 둘입니다 — 첫 스캔에서 "이 머신의…
-
Step 268. HTB Medium 1대 (누적 3) — 열거의 깊이
Step 267의 막힘 통계가 가리키는 사실 하나 — Medium에서 막히는 대부분은 기법이 아니라 "본 데를 안 봄"입니다. 정답은 대개 첫 정찰의 반경 안에 있었는데, 우리가 그 반경을 얕게 훑고 지나갔을 뿐입니다. 오늘의…
-
Step 269. HTB Medium 1대 (누적 4) — 취약점 조합
Easy까지는 취약점 하나가 열쇠 하나였습니다. Medium 후반부부터는 풍경이 바뀝니다 — 정보 노출로 자격증명을 얻고, 그걸로 로그인하고, 인증 뒤에 숨은 기능에서 LFI를 찾고, LFI로 읽은 개인키로 SSH에 접속합니다. 어느 취약점 하나도 단독으로는 끝까지…
-
Step 270. HTB Medium 1대 (누적 5) + Medium 졸업 정리
다섯 대의 Medium 머신은 "중급 실력"의 방증입니다. 하지만 푼 것과 정리한 것은 다릅니다 — 다섯 번의 공략이 머릿속에 흩어져 있으면, 그것은 경험 다섯 번이지 실력이 아닙니다. 오늘은 마지막 한 대를 풀고, 다섯…
-
Step 271. HTB AD 트랙 머신 1대 — 도메인 장악의 표준 루트
Step 261~263에서 Active Directory의 부품을 하나씩 배웠습니다 — 도메인 구조, Kerberoasting, AS-REP Roasting, Pass-the-Hash, BloodHound. 오늘은 그 부품들을 실제 도메인 머신 앞에서 한 줄의 경로로 …
-
Step 272. 나만의 침투 플레이북 완성 — 지금 실력의 사진을 찍는다
지금까지 여러분은 여러 문서를 만들었습니다. 기법 분류표, privesc 체크리스트, 열거 루틴, Medium 가이드, AD 경로 주석. 그런데 이 문서들은 각각의 순간에는 훌륭했지만 전투 중에 펼치기엔 흩어져 있습니다. "새 머신을 받으면 처음에 뭘…
-
Step 273. HTB Hard 도전 1 — 자세히 열거, 가설 검증
Hard는 Medium의 연장이 아닙니다. Medium까지의 루틴으로는 입구조차 안 보일 수 있습니다 — "모르는 기술 + 숨겨진 입구 + 다단계 체인"이 겹치기 때문입니다. 실제로 첫 Hard에서 사흘을 쓰고도 포트 스캔 화면만 보고 있는…
-
Step 274. HTB Hard 도전 2 — 기술 부채 상환: 모르는 것을 목록으로 만들어 갚는다
첫 Hard 도전(Step 273)이 끝났다면, 완주했든 막혔든 여러분의 손에는 귀중한 것이 하나 남아 있습니다 — 내 지식 지도의 빈칸 목록입니다. 몰라서 넘어간 프로토콜, 처음 본 프레임워크, 출력이 안 읽혔던 도구. 이 빈칸들이…
-
Step 275. HTB Hard 복기 — 상위 플레이어 Write-up 분석: 결과가 아니라 판단 근거를 읽는다
Hard를 도전한 뒤 상위 플레이어의 Write-up을 읽으면 대부분 충격을 받습니다. 같은 머신인데 보는 곳이 다릅니다. 여러분이 3일을 태운 구간을 그들은 1시간에 지나가고, 여러분이 아예 인식하지 못한 단서에서 공격을 시작합니다.
-
Step 276. 속도 훈련: Easy 4시간 컷 — 루틴을 자동화 수준으로 끌어올린다
대회에서 상위권을 가르는 것은 Hard를 푸는 사람이 아니라 Easy를 빨리 정리하는 사람입니다. Easy급에 8시간을 쓰는 팀은 어려운 문제를 볼 시간 자체가 없습니다. 지금까지 쌓은 정찰 → 침투 → 상승 루틴을, 생각하지 않아도…
-
Step 277. 속도 훈련: Medium 8시간 컷 — 장기전의 체력과 페이스 배분
Medium 8시간은 대회 하루 일정과 거의 같은 페이스입니다. Easy 4시간이 스프린트라면, Medium 8시간은 중거리 달리기입니다 — 스프린트 기술(병렬화, 템플릿)만으로는 부족하고, 페이스 배분과 체력 관리라는 새 종목이 추가됩니다.
-
Step 278. ★ 실전 점검: Medium 타임어택 + 발표 연습 — 푸는 것과 설명하는 것은 다른 근육이다
푸는 것과 설명하는 것은 다른 근육입니다. 혼자 뚫은 머신을 "그래서 어떻게 뚫었는데?"라는 질문에 15분 안에 설명하지 못한다면, 그 지식은 아직 온전히 여러분의 것이 아닙니다. 대회 팀 플레이의 상황 공유, Write-up, 그리고 언젠가의…
-
Step 279. ★ CTF 대회 #1: 주말 대회 풀 참가 — 첫 대회의 목표는 성적이 아니라 완주다
드디어 대회입니다. Step 176의 맛보기에서 시작해 5개 분야 트랙과 실전 머신 구간을 지나 여기까지 왔습니다. 첫 대회의 목표를 분명히 정하고 시작하겠습니다 — 완주와 데이터 수집입니다. 어느 분야에서 점수가 나오는지, 시간이 어디로 새는지,…
-
Step 280. CTF 복기 블록 A: 틀린 문제 3개 끝까지 파기 — 실력은 대회가 아니라 복기에서 늘어난다
대회의 성적은 숫자일 뿐이고, 실력은 복기에서 늘어납니다. 오늘은 대회에서 못 푼 문제 세 개를 골라 끝까지 파는 복기 블록 A 루틴을 확립합니다. "혼자 2시간 더 → Write-up으로 답 확인 → 손으로 재현"의…
-
Step 281. ★ CTF #2: 이번엔 팀으로 — 분업의 효율과 소통의 비용을 동시에 배우는 날
CTF는 원래 팀 스포츠입니다. 혼자서는 물리적으로 불가능한 분야 커버리지를 팀이 만들어 줍니다. 그런데 두 번째 대회에서 여러분을 기다리는 새로운 발견이 있습니다 — 팀은 분업의 효율만큼 소통의 비용을 청구한다는 사실. 오늘의 목표는 우승이…
-
Step 282. CTF 복기 블록 A + 블록 B: Write-up 3개 작성 — 재현 가능한 글이 실력의 증거다
복기 블록 A(Step 280)가 남의 정답으로 배우는 훈련이었다면, 오늘의 블록 B는 내가 푼 문제를 글로 쓰는 훈련입니다. Write-up은 한 번 쓰면 세 번 이득을 봅니다 — 미래의 나를 위한 복습 자료, 팀원·커뮤니티와의…
-
Step 283. ★ CTF #3: 팀 첫 출전 + 목표 설정 — 측정되는 목표만이 팀을 키운다
세 번째 대회부터는 게임의 규칙이 바뀝니다. 첫 대회는 완주가 목표였고, 두 번째는 협업의 체험이었습니다. 이제 두 번의 데이터가 쌓였으니, 세 번째는 목표를 세우고 채점하는 대회입니다. 목표가 있는 팀과 없는 팀의 차이는 그…
-
Step 284. CTF 복기 블록 A + 팀 회의: 약점 분석 — 감이 아니라 데이터로 팀의 지도를 그린다
세 번의 대회를 치르고 나면 팀마다 비슷한 대화가 나옵니다. "우리 Web은 좀 하는 것 같은데." "Pwn은 솔직히 답이 없지 않아?" — 전부 감(感)입니다. 감으로 정한 훈련 방향은 한 달 뒤에도 감으로밖에 평가할…
-
Step 285. ★ CTF #4: 약점 분야 공략 대회 — 잘하는 것을 잠깐 내려놓는 용기
지난 회의에서 팀은 약점을 숫자로 확인했고, 담당자는 2주간 그 분야를 집중 학습했습니다. 이제 남은 질문은 하나입니다 — 학습이 실전에서 통하는가. 이 대회는 그 답을 재는 시험지입니다.
-
Step 286. CTF 복기 블록 B: Write-up 누적 30개 달성 — 기록은 복리로 불어난다
Write-up은 하나씩은 일기이고, 서른 개쯤 모이면 백과사전이 됩니다. "이거 어디서 봤는데"가 "내 글 어딨지"로 바뀌고, 검색 한 번에 예전의 내가 풀이를 건네줍니다. 누적이 만들어내는 것은 양이 아니라 패턴 인식의 속도입니다…
-
Step 287. ★ CTF #5: 주력 분야 심화 확인전 — 우리의 천장이 어디인지 재는 대회
Step 285에서 팀은 약점 분야의 문을 열었습니다. 이번에는 반대쪽입니다 — 잘하는 분야에서 우리가 어디까지 왔는가를 측정합니다. "주력 분야는 괜찮다"는 감으로는 팀의 체급을 모릅니다. 체급은 같은 분야 안에서 Easy는 놓치지 않는지, Medi…
-
Step 288. CTF 복기 블록 A + 약점 집중: 틀린 유형 10문제 훈련 — 고질병은 집중 반복으로 끊는다
다섯 대회의 복기 데이터를 겹쳐 보면 패턴이 보입니다. 힙 문제만 나오면 0점, SSTI를 매번 놓침, 암호 오라클 문제는 손도 못 댐 — 한 번의 실패는 운이지만, 세 번 반복된 실패는 고질병입니다. 고질병은…
-
Step 289. ★ CTF #6: 중간 평가 대회 — 상위 50% 목표, 점수 구조를 읽는 팀이 배점을 주운다
여섯 번째 대회는 성적표입니다. Step 279부터 다섯 번의 대회를 치르고, 매번 복기하고, 약점 유형을 특훈으로 메웠습니다. 그 사이클이 실전 점수로 환산되는지 확인하는 중간 결산이 오늘의 대회입니다.
-
Step 290. CTF 복기 블록 A + 블록 C: 익스플로잇 코드 정리 — 급조를 자산으로 바꾼다
대회마다 스크립트를 새로 짜고 계십니까? 그러면 여섯 번의 대회 동안 같은 뼈대를 여섯 번 짠 셈입니다. 소켓을 열고, 프롬프트까지 받고, 페이로드를 보내고 — 그 30줄은 매번 같고, 문제마다 다른 것은 주소와 값…
-
Step 291. ★ CTF #7: 라이브러리 실전 검증 — 자산의 가치는 대회에서만 판명된다
라이브러리 v1은 서랍 안에서는 완벽해 보입니다. 주석도 달렸고, 목차도 있고, 로컬 검증도 끝냈습니다. 그런데 자산의 진짜 가치는 대회의 압박 속에서만 드러납니다 — 시간에 쫓기는 손이 템플릿을 10초 안에 찾는가, 대회 서버의 생김새가…
-
Step 292. CTF 복기 블록 A + 블록 B: Write-up 누적 40개 — 읽히는 글이 실력의 증명이다
Write-up 30개를 넘기면 변화가 생깁니다. 이제 "쓰는 것"은 루틴이 됐고, 다음 질문은 "읽히는가" 입니다. 독자가 있는 글은 쓰는 사람을 더 성장시킵니다 — 남이 이해할 문장으로 바꾸는 과정이 이해의 구멍을 드러내고, 독자…
-
Step 293. ★ CTF #8: 팀 전술 실험 — 역할 로테이션, 점수를 버리고 팀의 지도를 얻는다
여덟 번째 대회에서 일부러 점수를 버립니다. 평소의 분업 — 웹 담당은 웹만, 포너블 담당은 포너블만 — 은 점수 효율이 최고지만, 한 가지를 영원히 모르게 합니다. 팀의 취약 고리가 어디인지를. 웹 담당이 쓰러지면(졸업·취업·단순…
-
Step 294. CTF 복기 블록 A + Write-up 누적 50개 + 블로그 정돈 — 기록이 커리어가 되는 순간
Write-up 50개는 CTF 커뮤니티에서 "꾸준히 활동하는 플레이어"의 기준선으로 통합니다. 한두 개의 잘 쓴 글은 운이 만들 수 있지만, 50개의 누적은 오직 시간과 루틴만이 만들 수 있습니다. 그래서 이 숫자는 채용 담당자와 커뮤니티에게…
-
Step 295. ★ CTF #9: 상위 30% 목표 대회 — 체급을 재는 시험대
상위 50%와 상위 30%는 숫자 20의 차이가 아닙니다. 50%는 "쉬운 문제를 빠짐없이 푸는 팀"으로 도달할 수 있습니다. 30%부터는 다릅니다 — 참가 팀의 절반 이상이 쉬운 문제를 다 풀기 때문에, 순위는 Medium급 이상에서…
-
Step 296. CTF 복기 블록 A + 팀 전략 점검: 운영 개선 — 기술이 아닌 마찰을 줄이는 것도 점수다
대회 9회차가 되면 팀에는 규칙과 도구가 쌓여 있습니다 — 상태표, 스왑 규칙, 단서 공유 규칙, 디스코드 채널, 공유 문서. 그런데 질문 하나를 던져 보세요. 그 규칙들, 지금 지켜지고 있습니까? 상태표 갱신은 1시간마다…
-
Step 297. ★ CTF #10: 10회차 기념 — 전체 회고 — 성장은 선형이 아니라 정체와 도약의 반복이다
열 번째 대회는 이정표입니다. 첫 대회의 로그를 펼쳐 보세요 — 전 문제 훑기 30분에 벌벌 떨던 팀, 쉬운 문제 2개를 풀고 환호하던 팀. 그리고 지금의 여러분을 나란히 놓아 보세요. 푼 문제 수,…
-
Step 298. 국내 대회 예선 대비: 코드게이트/CCE 기출 풀이 — 기출은 최고의 교과서다
주말 CTF를 10회 돌린 여러분의 다음 무대는 국내 메이저 대회입니다 — 코드게이트, CCE 같은 이름 있는 대회들. 이 대회들은 문제 스타일의 결국이 다릅니다. 실전 침해 시나리오를 재현한 문제, 한국적 소재, 그리고 예선-본선으로…
-
Step 299. 예선 속도 훈련: 10문제 타임어택 — 쉬운 문제부터 쓸어 담는 페이스의 기술
예선은 제한 시간 안에 최대한 많은 문제를 푸는 게임입니다. 그리고 이 게임의 커트라인을 가르는 것은 어려운 문제 한 개가 아니라, 쉬운 문제를 얼마나 빠르고 정확하게 쓸어 담았는가입니다. 상위 팀과 중위 팀의 차이는…
-
Step 300. ★ CTF #11: 예선 대비 실전 점검 — 80%의 힘으로 검증하는 리허설
예선이 열흘 남았다고 가정해 봅시다. 이때 실력을 늘리는 것은 거의 불가능하지만, 실력이 점수로 환산되는 비율은 아직 크게 올릴 수 있습니다. 그 장치가 오늘의 대회입니다 — 예선과 같은 규칙으로 뛰는 마지막 해외 대회를,…
-
Step 301. CTF 복기 블록 A + 블록 B: 마지막 보강 — 구멍 봉인과 전투 패키지
열두 번의 복기 사이클 중 마지막입니다. 지금까지의 복기가 "실력을 키우는" 시간이었다면, 이번 복기는 "실력이 새는 곳을 막는" 시간입니다. 새 것을 더 얹는 것보다, 아는 것이 시험장에서 빠져나가지 않게 하는 것 — 그것이…
-
Step 302. ★ CTF #12: 목표 달성 대회 — 상위 30%, 시즌 피날레
열두 번째 대회입니다. Step 279의 첫 대회에서 손에 땀이 났던 화면이, 오늘은 익숙한 작업 화면입니다. 이 대회는 Level 3의 피날레이자 수료 시험 — 목표는 상위 30%. 지난 열한 대회의 복기와 특훈, 속도…
-
Step 303. ★ Level 3 종합 평가: 최근 3개 대회 득점 분석 + Level 4 계획 — 데이터로 닫고 설계로 연다
Step 175에서 Level 2를 한 장의 표로 닫았던 것처럼, 오늘은 Level 3를 데이터로 닫습니다. 다만 규모가 다릅니다 — 이번에는 열두 번의 실전 대회, 다섯 전문 분야, 수십 대의 실전 머신이 쌓인 기록을…