EXPLORE THE CURRICULUM
나의 학습지도
전체 흐름을 살펴보고, 지금 배울 수업을 찾아보세요.
37 개의 수업 · C · 시스템 · Pwn
선택 초기화L1C와 컴퓨터 내부Step 56–7015 수업
- 056 C 시작 — 기계가 직접 아는 언어로해석 언어(파이썬)와 컴파일 언어(C)의 차이를 설명한다
- 057 C 제어문과 함수 — 같은 생각, 다른 표기C의 if, for, while을 파이썬과 대응시켜 쓴다
- 058 포인터 1 — 주소를 손에 쥐는 날모든 변수가 메모리의 주소에 산다는 사실을 %p 출력으로 확인한다
- 059 포인터 2: 배열 — 붙어 있는 칸들의 법칙배열이 "메모리에 붙어 있는 칸들"임을 주소 출력으로 확인한다
- 060 메모리 구조 — 실행 중인 프로그램의 지도실행 중인 프로그램의 메모리가 네 영역(코드/데이터/힙/스택)으로 나뉨을 설명한다
- 061 malloc과 free — 힙에서 빌리고 반납하라malloc으로 실행 중에 필요한 만큼 메모리를 빌리고, sizeof와 함께 쓴다
- 062 실험: 버퍼 오버플로우 — 넘친 입력의 행선지버퍼가 무엇이며, 왜 넘치는지 설명한다
- 063 컴파일 과정 — 네 명의 일꾼이 바톤을 넘긴다gcc hello.c -o hello 한 줄 뒤의 네 단계(전처리, 컴파일, 어셈블, 링크)를 순서대로 말한다
- 064 어셈블리 첫 만남 — 내 코드의 최종 실체어셈블리어가 무엇인지(기계어의 인간 판독판) 설명한다
- 065 CPU와 레지스터 — 실행의 심장 박동을 보다CPU가 계산을 메모리가 아닌 레지스터에서 하는 이유를 설명한다
- 066 실행 파일의 구조 — 아이콘 속의 설계도실행 파일이 "설명서(헤더) + 용도별 구역(섹션)"으로 이루어져 있음을 설명한다
- 067 운영체제의 역할 — 모든 부탁은 커널에게커널이 무엇이고 왜 프로그램이 하드웨어를 직접 못 건드리는지 설명한다
- 068 프로세스의 실체 — fork 실험프로세스와 PID, PPID를 설명하고 ps와 pstree로 관찰한다
- 069 가상 메모리 — 모든 프로세스의 달콤한 착각가상 주소와 물리 주소의 차이, 그리고 둘을 잇는 페이지 테이블의 역할을 설명한다
- 070 프로젝트 — C로 메모리 관찰 도구 만들기자기 자신의 메모리 주소 지도를 그려 주는 C 프로그램 memmap을 완성한다
L3어셈블리와 시스템 입문Step 182–1909 수업
- 182 어셈블리 1: 레지스터, mov/push/pop/call/ret, 스택 프레임 — 공용 언어의 문자표x86-64 범용 레지스터의 이름과 용도(rax, rdi, rsp, rbp 등)를 안다
- 183 어셈블리 2: gdb 기초 — 실행 중인 프로그램의 현미경gcc -g -O0의 의미(-g: 디버그 정보, -O0: 최적화 끄기)를 설명하고 디버깅용 바이너리를 만든다
- 184 어셈블리 3: C 프로그램을 gdb로 한 줄씩 따라가기 — 호출 규약의 실황 중계gcc -S로 만든 어셈블리 소스와 gdb의 disas 출력을 대조해 읽는다
- 185 스택 완전 이해 — 함수 호출 시 스택에 쌓이는 것들의 완전한 지도함수 호출 시 스택에 쌓이는 것들의 순서(지역 변수 → saved rbp → RET)를 그린다
- 186 ★ 버퍼 오버플로우 재현: RET 덮어쓰기 성공 — 인생 첫 메모리 공격공격 대상 바이너리를 실험실용 옵션으로 컴파일하고 각 옵션의 의미를 설명한다
- 187 보호 기법: NX, ASLR, Canary, PIE — 사중 방어막의 지도NX, Canary, ASLR, PIE 네 보호 기법의 동작 원리를 각각 한 문장으로 설명한다
- 188 pwntools 입문: 연결, p64, 페이로드 자동화 — 손공격에서 스크립트로venv에 pwntools를 설치하고 설치를 검증한다
- 189 ★ 미니 프로젝트: 오버플로우 익스플로잇 스크립트 완성 — 손 공격을 공학으로cyclic() 패턴의 원리(겹치지 않는 조각의 나열)를 설명한다
- 190 팀 찾기/결성 + CTFtime 캘린더 — 혼자 하는 게임을 팀 스포츠로CTFtime의 대회 캘린더·팀 페이지·랭킹 구조를 읽는다
L3Pwn과 메모리Step 203–21412 수업
- 203 shellcode 작성: execve 쉘코드 손으로 만들기 — 쉘을 띄우는 29바이트execve 시스템 콜의 호출 규약(rax=59, rdi, rsi, rdx)을 설명한다
- 204 ret2win: 원하는 함수 호출 — 인자까지 쥐여주는 RET 덮어쓰기System V 호출 규약에서 첫 번째 인자가 rdi로 전달됨을 설명한다
- 205 ROP 1: 가젯 개념, ROPgadget/ropper — 코드 조각의 조립술가젯의 정의("ret로 끝나는 명령 조각")와 유용 가젯의 종류를 안다
- 206 ROP 2: 체인으로 system("/bin/sh") 호출 — NX를 넘어 쉘로NX가 켜진 바이너리에서 ROP가 유일한 길인 이유를 설명한다
- 207 ret2libc: libc 주소 leak과 ASLR 우회 — 매번 바뀌는 주소를 추적한다ASLR이 libc 주소를 어떻게 바꾸는지 ldd 실측으로 증명한다
- 208 Format String: %n으로 메모리 쓰기 — 출력 함수로 쓰는 공격printf(buf)가 왜 취약한지, 올바른 코드와 비교해 설명한다
- 209 pwnable.kr Toddler's Bottle 완주 — 입문 워게임 졸업식Toddler's Bottle 전체 문제 목록과 각 문제가 가르치는 함정을 정리한다
- 210 GOT/PLT 구조 이해와 GOT overwrite — 함수 호출 가로채기PLT(점프대)와 GOT(주소표)의 역할과 지연 바인딩의 순서를 설명한다
- 211 힙 입문: 할당자 동작, use-after-free 개념 — 반납된 땅의 재사용힙 청크(chunk) 의 구조(헤더 + 사용자 데이터)를 그리고 크기를 계산한다
- 212 힙 익스플로잇 맛보기: tcache poisoning — 대기열 장부를 덮다tcache가 단일 연결 리스트라는 것과 next 포인터의 위치를 설명한다
- 213 pwnable.tw 쉬운 문제 3개 — 소스 없는 세계로pwnable.kr과 pwnable.tw의 난이도·구성 차이를 설명한다
- 214 ★ 중간 점검: Canary+NX 바이너리 독립 익스플로잇 — 유출하고, 살려 두고, 덮는다보호 기법 판별(정찰)부터 전략 수립까지 익스플로잇의 전 과정을 혼자 설계한다