시스템 프로그래밍 로드맵
컴파일러 개발, 맬웨어 리버스 엔지니어링 및 커널 개발 기본 사항을 스스로 배우기 위한 로드맵입니다. 주의할 점은 이러한 내용은 단지 기본적인 지식을 위한 것일 뿐 당신을 어떤 지식의 달인으로 만들어 주지는 않는다는 것입니다. 나는 특정 주제에 대한 추후 연구를 위해 아래에 언급된 분야 중 하나 이상을 선택할 것입니다. Low Level Programme University에는 따라야 할 유용한 리소스 목록도 있지만 이는 내 개인 로드맵입니다.
여기에서 공부할 주제는 순서가 있을 수도 있고 그렇지 않을 수도 있으며 각 주제에 대한 전제 조건이 충족된다는 점을 고려하여 귀하의 선호도에 따라 공부할 수 있습니다.
전제조건
나는 이미 당신이 컴퓨터 아키텍처에 대한 기본적인 이해와 하나 이상의 시스템 프로그래밍 언어에 대한 경험, 어셈블리 작동 방식에 대한 몇 가지 기본 사항 및 POSIX 시스템 사용에 익숙하다고 가정하고 있습니다. 전자 공학 수준에서 컴퓨터가 어떻게 작동하는지에 대한 자세한 내용은 Agner Fog가 쓴 책 Introduction to Digital Electronics에서 찾을 수 있습니다. 그리고 소프트웨어에 상응하는 작업에 대해서는 cpu.land를 참조할 수 있습니다.
시스템 프로그래밍 언어
주어진 언어 중 두 가지를 배우고, 몇 가지 기본 프로젝트를 만들어 익숙해지고, 몇 가지 프로그래밍 연습을 해결하세요.
- 기음
- 녹
- C++, C++ 참조 알아보기
- C++(비디오)
컴퓨터 아키텍처를 배우십시오
하드웨어 수준에서 문제를 해결하기 위한 효율적이고 최적화된 접근 방식을 구축하기 위해 Arm 및 RISCV 기반 컴퓨터 아키텍처를 알아보세요.
- David A. Patterson, John L. Hennessy "컴퓨터 아키텍처: 정량적 접근 방식"
- David A. Patterson, John L. Hennessy "컴퓨터 구성 및 설계 ARM 에디션"
- David A. Patterson, John L. Hennessy "컴퓨터 구성 및 디자인 RISC-V 에디션"
- John Paul Shen, Mikko H. Lipasti "현대 프로세서 설계: 수퍼스칼라 프로세서의 기본"
- CMU YouTube의 CMU 컴퓨터 아키텍처
어셈블리를 배우세요
전제 조건: 디지털 로직에 대해 알아보기
아직 조립에 익숙하지 않다면 다음과 같은 튜토리얼을 확인해 보시기 바랍니다.
- x86 빠른 시작[MASM]
- x86 빠른 시작 [NASM]
- ASM튜터[NASM]
- YouTube에서 Davy가 x86 어셈블리 언어 소개
- OMU x86_64 수업
- Asm의 예술
- 인텔 x64 매뉴얼
- 컴파일러 탐색기: C 프로그램을 만들고 디스어셈블리를 읽는 것은 항상 패턴을 일치시키는 데 도움이 됩니다.
- 기본적인 크랙메를 되돌릴 수 있는 인형용 0x44 리버싱 기사입니다.
그다음에는 운동용으로 쉬운 크래미를 푸는 것을 추천합니다. crackmes.one과 tryhackme에서는 쉬운 것들을 찾을 수 있는 곳입니다. 어려운 것에는 여전히 활용 섹션에서 논의할 약간의 전리품 지식이 필요합니다.
컴파일러
전제 조건에는 시스템 프로그래밍 언어로 프로젝트를 작성해 본 경험과 메모리 및 CPU에 대한 깊은 이해가 포함됩니다.
- 드래곤북을 읽어보세요.
- 통역사 제작은 초보자에게 좋은 것입니다.
- 언어 구현 패턴은 컴파일러 작동에 대한 좋은 통찰력을 제공합니다.
- Stanford Notes CS143 컴파일러 설계와 관련된 좋은 과제 및 메모입니다.
- CMU 슬라이드 및 프로젝트
- 멋진 컴파일러
- Rust로 언어 만들기
- Rust 구문 분석 기본 사항
- 나무 산책 해석 프로그래밍 언어를 만듭니다.
- 또한 인터프리터용 바이트코드 엔진을 구현하고 몇 가지 최적화 및 GC를 시도해 보세요.
- Chip8이나 Nes와 같은 기계를 에뮬레이트할 수도 있습니다.
- 에뮬레이션에는 VM 내부 및 그래픽 프로그래밍에 대한 지식이 필요합니다.
- SDL을 IO/그래픽/사운드 엔진으로 사용할 수 있습니다.
- 하나의 아키텍처를 대상으로 하는 컴파일된 프로그래밍 언어를 만들어 보십시오.
- LLVM 툴체인에 대해 알아보기
- Rust의 LLVM 튜토리얼
- llvm 백엔드를 사용하여 첫 번째 프로그래밍 언어를 만들어 보려면 llvm 튜토리얼을 따르십시오.
- 바이트코드 엔진 주위에 Just In Time 컴파일러를 만들고, 핫 영역을 감지하고 이를 JIT해 보세요.
- 내 디스코드 서버 lang-dev 섹션
착취
전제 조건에는 조립 경험이 포함됩니다.
- ike: 시스템 해킹 핸드북
- pwn.college는 지금까지 제가 활용한 최고의 학습 리소스입니다. 어셈블리부터 커널 활용까지 모든 것을 다룹니다.
- 익스플로잇 개발 소개
- 악몽: CTF를 기반으로 한 바이너리 활용을 소개합니다.
- CS6265: 리버스 엔지니어링 및 바이너리 활용 연구실
- OMU 활용 연구소
- LiveOverflow의 YouTube binexp 시리즈
- 0xinfection의 튜토리얼
- Infosec 참조에 대한 개발을 악용하세요.
- ROP 엠포리움
- 윈도우즈 관련
- Windows x64 반전
- Win32 API 프로그래밍
- Windows 익스플로잇 개발자
- 카즈의 유튜브 채널
- 게임해킹학원
- 몇 가지 공격에 대해 배운 후에는 이제 CTF를 해결할 수 있습니다. 그 중 일부는 다음과 같습니다:
- pwnable.kr
- 교육용 VM 활용
- 착취를 다루는 온라인 전쟁 게임
- 바이너리 활용을 기반으로 한 HackTheBox 챌린지
브라우저 해킹
전제 조건에는 VM 내부에 대한 높은 수준의 지식과 컴파일러 엔지니어링에 대한 확실한 이해 및 경험이 포함됩니다.
- 개발
- 기본 HTML DOM 파서 Rust 만들기
- 장난감 브라우저 엔진, 처음부터 브라우저 엔진
- JavaScript 바이트코드 VM 안드레아스 클링
- 브라우저 구문 분석 및 JS AST 안드레아스 클링
- 최신 브라우저 살펴보기
- 팔로우할 블로그: V8, MozHacks, Webkit
- 문서: Firefox, Chromium, Webkit Wiki
- 컴파일러 컴파일러: JavaScript 엔진 작업에 관한 Twitch 시리즈
- 그래픽: 귀하의 언어나 플랫폼에 맞는 2D 그래픽 라이브러리를 선택하세요. OpenGL이나 Vulkan을 사용할 수 있나요?!? 무고한 CSS를 렌더링하려면 그럴 가치가 없습니다.
- Skia는 Linux 및 Android에 적합합니다(Chrome은 Android에서 사용함).
- Direct2D 예, Windows에서만 가능합니다.
- Cairo 및 Blend2D는 살펴볼 가치가 있는 크로스 플랫폼입니다.
- V8용 고성능 gc
- JIT 컴파일의 모험
- JavaScriptCore의 추측
- 네트워크 프로그래밍 Rust 네트워킹, Rust std::net, C
- 파싱, 렌더링, JIT에 대해 배운 후, 이제 whatwg 표준에 따라 기본 API와 최소한의 기능으로 나만의 브라우저를 만들 수 있습니다.
- 공격: 브라우저 작동 방식을 이해하는 가장 좋은 방법은 브라우저를 해킹해 보는 것입니다. (전제 조건에는 견고한 바이너리 공격 기술이 포함됩니다.)
- LiveOverflow의 브라우저 공격 시리즈 | 쓴
- 웹어셈블리 해킹토크 Black Hat
- github의 브라우저 pwn
- 웹 브라우저 악용 - 플로리다 대학
- 브라우저 또는 런타임 환경을 기반으로 CVE 또는 CTF 과제에 대한 글을 작성해 보세요.
악성 코드
전제 조건에는 창에 대한 높은 수준의 이해와 탄탄한 리버스 엔지니어링 기술이 포함됩니다.
- 실제 악성코드 분석
- hackersploit의 악성코드 분석 부트캠프
- CS5138 악성코드분석, UC
- Prelude의 라이브 스트림
- Cr0w의 유튜브 채널
- 맬웨어 리버싱 및 동작의 기본 사항을 학습한 후 이제 이러한 실제 샘플을 리버스할 수 있습니다.
- Malware Unicorn의 연구소
- VX Underground - 인터넷에서 가장 큰 맬웨어 소스 코드, 샘플 및 논문 모음입니다.
- infosec 참조의 악성 코드 섹션
- 악성코드 바자르
OS 기초
(아직) 커널 개발에 들어가고 싶은지는 잘 모르겠지만 개념은 멋져 보이고 휴가 프로젝트에 좋은 생각입니다. 시작하기 전에 요구사항을 읽어보세요.
- OS Dev Wiki는 OS에 대해 배우고 싶다면 방문할 수 있는 곳입니다. 이는 잘 문서화되어 있으며 눈의 출혈에도 도움이 됩니다.
- 리눅스 커널 연구소
- github의 멋진 OS 튜토리얼 섹션
- Broken Thorn의 튜토리얼
- 3개 조각의 OS
- 작은 OS 책
- 블로그 OS: Rust로 OS 작성
- Bootlin 슬라이드 및 실습
- 539kernel: OS 커널을 만드는 여정
- 작업할 내용:
- 하이쿠
- 반응 OS
- 유디프툴라 챌린지
- 산화환원
- 더 많은 녹 프로젝트
- github의 멋진 OS
- 더 많은 리소스와 책을 얻으려면 내 디스코드 서버의 OS 개발자 채널을 방문하세요.
VM 내부
컴파일러 엔지니어링 및 브라우저 개발을 진행하는 동안 연구할 VM 내부 목록:
- 가상 머신을 구축하는 방법
- JS 내부, V8의 바이트코드
- 다트 VM 아키텍처
- JVM 구조 메인, JVM 내부 I, JVM 내부 초보자
집단 강좌
위에서 논의한 주제 중 2개 이상을 포함하는 리소스 모음:
- Nand To Tetris 컴퓨터, OS 및 컴파일러 형식의 구성 방법을 가르치는 과정입니다.
- Dive Into Systems 시스템 프로그래밍을 소개하는 정말 좋은 책입니다.