* 주의: 이 글의 내용은 100% 개인적인 견해입니다. 또한, 대회, 즉 CTF 기준으로 적어놓았으며 시간이 지남에 따라 여기에 적어놓은 내용이 맞지 않을 수도 있습니다. 마지막으로, 빼먹은 내용이 많으니 참고 바랍니다. (생각나는대로 적음)

소개

테크트리라고 한다면 매우 웃긴 얘기지만 혹시나 이 글을 보는 몇몇 사람들에게는 도움이 될 것 같아 적어놓는다. 여기에 적은 내용들은 전부 개인적인 생각이며, 절대로 공식적인 것이 아님을 당부드리고 시작한다. 난이도나 공부의 순서를 대회 기준으로 적어놓은 것이며 리얼월드, 즉 현실 기준으로 적은 것이 아님도 알려드리고 시작한다.

순서

1. 사전 지식들

 

당연한 이야기지만 보안을 시작하기 위해서는 일부 사전 지식이 필요하다. 물론, 이 글은 완전한 초보자를 대상으로 적은 글이기에 최소한의 필요 지식들만 적어두었다. (컴퓨터과학 또는 공학에 대한 지식이 아예 없는 대상으로 적었다) 사전 지식이라고는 하나 이 또한 순서대로 공부하면 좋다.

 

1-a. Linux 기초 (전부 파악할 필요는 없고 명령어 몇개 끄적일 정도로만)

1-b. Python (의외로 C를 먼저 시작할 필요가 없다. 모든 문법을 익힐 필요는 없다. 다만, 완전 기초라도 어느 정도의 코드를 작성할 수 있어야 한다. 클래스나 람다 함수와 같은 개념은 필요 없으니 적당히 익히면 된다)

1-c. C 기초 (C++가 아니다. C를 정말 체계적으로 공부해서 C에 어떤 문법이 있고 까지 익힐 필요는 없다. 다른 사람들이 작성한 코드들을 읽을 수 있을 레벨까지만 익히면 된다)

1-d. 어셈블리 기초 (x86, x86_64만 일단 공부하면 된다. 모든 명령어를 익힐 필요는 없지만 레지스터가 어떻고, calling convention이 뭐고 등 어느정도 숙련된 레벨까지 공부해야 한다. 많은 사람들이 여기서 접는다)

1-e. 정적 분석 툴 사용법 (IDA, Ghidra, Binary Ninja, ... 등 많은 툴 중에서 하나만 대충 익히면 된다. 정말 대충 익히면 된다)

1-f. GDB 사용법 (항상 그렇지만 모든 명령어를 익힐 필요는 없다. 기초만 다져놓고 나머지를 공부하면서 익숙해지면 된다)

1-g. 네트워크, file descriptor, socket (간단한 클라이언트-서버 모델만 작성할 수 있으면 된다)

1-h. Pwntools (간단한 스크립트만 작성할 수 있으면 된다. Python이 사용된다)

1-k. 가상 머신, Docker (환경 구축)

 

일단은 위와 같이 적었지만 나중에 가서 필요하면 더 체계적으로 익혀야 한다. 위에 적어놓은 것은 야매 방법이다.

 

2. 시작 - 스택에서 놀자

 

이제 스택에서 일어나는 일들에 대해 공부한다. 개념들만 일단 나열해놓겠지만 해당 개념들에 대해 문제를 하나씩은 풀어볼 것을 추천한다.

 

2-a. Stack Buffer Overflow (ASLR을 꺼야 한다.  -> 1. 로컬 변수 조작 / 2. 리턴 주소 조작 / 3. 쉘코드 넣어놓고 쉘코드로 점프하기)

2-b. Fake EBP (공부할 필요는 없지만 공부하면 calling convention 등에 좀 더 익숙해질 수 있다)

2-c. 보호 기법들 (ASLR, NX (DEP), PIE)

2-d. Memory Leak (주소나 필요한 데이터를 따는 방법에 대해 다룬다. 메모리 할당했다가 풀어주지 않아서 메모리를 계속해서 잡아먹는 현상을 지칭하지 않는다)

2-e. Procedure Linkage Table, Global Offset Table (줄여서 PLT, GOT)

2-f. Return to libc, Return Oriented Programming (줄여서 RTL, ROP)

2-g. Format String Bug (줄여서 FSB)

2-h. Stack Pivoting

 

아래는 고급 테크닉들을 다룬다. 굳이 공부할 필요가 있을까 싶다.

 

2-i. GDB Scripting (분석을 위해 필요할 수 있다)

2-j. SROP, FSOP

2-k. Return to dl_resolve

2-l. Hard shellcoding (Sandbox가 걸려있는 경우 등에서 쉘코딩 하기)

2-m. Exit function list

2-n. One gadget (Magic gadget)

2-o. stdout overwrite (stdout이나 stderr 구조 덮어써서 메모리 릭을 내는 방법)

2-p. Race condition

 

3. 힙 트릭들

 

솔직히 권장 사항으로 두고 싶지만 요즘은 기본이 된 기술들이다. 거의 필수화되었기 때문에 공부하는게 좋다. 난이도가 급격하게 올라가니 주의가 필요하다.

공부하는게 좋지만 불필요하다고 느껴지는 것들은 건너뛰면 된다.

 

3-a. Use After Free (UAF)

3-b. C++ Reversing (C++ 문법에 대한 어느정도 지식이 필요하다)

3-c. Fake vtable

3-d. Double free bug (줄여서 DFB)

3-e. Dynamic allocator basics (Dynamic allocator에 대한 기초적인 지식들을 배운다. 청크, fragmentation 등)

3-f. GLIBC 2.23 heap (Bins, arena, ...)

3-g. House 시리즈 (GLIBC 2.23 이전 우선, 전부다 공부할 필요는 없다)

  권장 리스트 (난이도 순) : House of Spirit, Fastbin dup, Overlapping chunks, House of Force, Unsorted bin attack, Unsafe Unlink, House of Lore (2.23에서는 안 되는데 개념은 알아둘 필요가 있음), Poison Null Byte

  비권장 리스트 (굳이?) : House of einherjar, House of Orange, Small bin attack, Large bin attack

3-h. GLIBC >2.23 heap (Tcache, 바뀐 mitigation, ...)

  권장 리스트 (난이도 순) : Tcache dup, Tcache Poisoning, 나머지는 필요한대로

 

4. 고인물의 영역

 

정말 많은 것들이 나오기 시작한다. 생각나는 것들만 리스트로 남겨놓는다.

 

4-a. Kernel (요즘 필수화되고 있음)

4-b. VM Pwn (거의 필수화 됨)

4-c. Go, Rust (심심하면 나옴)

4-d. Windows Pwn

4-e. Browser (V8, JavascriptCore, Safari, ...)

4-f. VM Escape (VM Pwn이랑은 다름. 여기서는 VirtualBox, QEMU 등이 나옴)

4-g. Web Pwn (웹이랑 섞여 나오는 혼종)

4-h. Hardware 취약점 (가끔 뜰 경우 나온다. 대표 - Spectre)

 

'보안 > Pwn' 카테고리의 다른 글

Kernel 1 - 환경 세팅 (작성중)  (0) 2021.05.04
공부용 갓갓 레퍼런스들  (0) 2021.01.23

+ Recent posts