系统编程路线图
自学编译器开发、恶意软件逆向工程和内核开发基础知识的路线图。需要注意的是,它们只是基础知识,并不能让你成为任何方面的大师。我将选择下面提到的一个或多个领域来进行后续某些特定主题的研究。低级编程大学也有一个很好的资源列表可供遵循,但这是我个人的路线图。
这里要学习的主题可能是按顺序排列的,也可能不是按顺序排列的,可以根据您的喜好进行研究,前提是每个主题都满足先决条件。
先决条件
我已经假设您对计算机体系结构有基本的了解,并且具有至少一种系统编程语言的经验、汇编工作原理的一些基础知识,并且熟悉使用任何 POSIX 系统。有关计算机在电子层面如何工作的详细介绍,请参阅 Agner Fog 所著的《数字电子学概论》一书。对于软件等效工作,您可以参考 cpu.land。
系统编程语言
学习任意两种给定的语言,制作一些基本项目来熟悉它,解决一些编程练习。
学习一些计算机体系结构
学习基于 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 计算机架构 by CMU Youtube
学习一些汇编
先决条件:了解数字逻辑
如果您还不熟悉汇编,我建议您查看一些教程,例如-
- x86 快速入门[MASM]
- x86 快速入门 [NASM]
- ASM导师[NASM]
- YouTube 上 Davy 的 x86 汇编语言简介
- OMU x86_64 课程
- Asm 的艺术
- 英特尔 x64 手册
- 编译器资源管理器:编写 C 程序并阅读反汇编代码总是有助于匹配模式。
- 0x44 的文章《逆向傻瓜》能够逆向基本的裂纹。
之后,我建议解决简单的裂纹以进行练习。 rackmes.one 和 tryhackme 是可以找到一些简单方法的地方。困难的仍然需要一些pwning知识,我将在利用部分讨论这些知识。
编译器
先决条件包括使用系统编程语言创建项目的经验以及对内存和 CPU 的深入了解。
- 读龙书。
- Crafting Interpreters 对于初学者来说是一个很好的选择。
- 语言实现模式提供了有关编译器工作原理的一些很好的见解。
- 斯坦福笔记 CS143 与编译器设计相关的良好作业和笔记。
- CMU 幻灯片和项目
- 很棒的编译器
- 用 Rust 创建一门语言
- Rust 解析基础知识
- 制作树行走解释型编程语言。
- 还尝试为您的解释器实现字节码引擎,尝试一些优化和 GC。
- 您还可以模拟 Chip8 或 Nes 等机器。
- 仿真需要了解 VM 内部结构和图形编程知识。
- 您可以使用 SDL 作为 IO/图形/声音引擎。
- 尝试制作一种针对一种架构的编译型编程语言。
- 了解 LLVM 工具链
- Rust 中的 LLVM 教程
- 尝试按照 llvm 教程使用 llvm 后端制作您的第一种编程语言。
- 尝试围绕字节码引擎创建一个即时编译器,检测热点区域并对其进行 JIT。
- 我的不和谐服务器 lang-dev 部分
开发
先决条件包括组装经验。
- ike:系统黑客手册
- pwn.college 是我迄今为止获得的最好的利用学习资源。从汇编到内核开发,它涵盖了一切。
- 漏洞利用开发简介
- Nightmare:基于 CTF 的二进制利用简介。
- CS6265:逆向工程和二进制利用实验室
- OMU开发实验室
- YouTube 上的 LiveOverflow 的 binexp 系列
- 0xfection 的教程
- 利用 infosec 参考上的开发
- ROP商场
- Windows 的东西
- Windows x64 逆向
- Win32 API编程
- Windows漏洞利用开发
- Cazz 的 YouTube 频道
- 游戏黑客学院
- 了解了一些漏洞利用之后,您现在就可以解决 CTF 问题了。其中一些包括:
- pwnable.kr
- 利用教育虚拟机
- 涵盖剥削的线上兵棋推演
- 基于二进制利用的 HackTheBox 挑战
浏览器黑客
先决条件包括对 VM 内部结构的高级了解,以及对编译器工程的扎实理解和经验
- 发展
- 创建一个基本的 html dom 解析器 Rust
- 玩具浏览器引擎,从头开始的浏览器引擎
- JavaScript 字节码 VM Andreas Kling
- 浏览器解析和 JS AST Andreas Kling
- 深入了解现代浏览器
- 关注的博客:V8、MozHacks、Webkit
- 文档:Firefox、Chromium、Webkit Wiki
- Compiler 编译器:有关 JavaScript 引擎工作的 Twitch 系列
- 图形:选择适合您的语言或平台的 2d 图形库。你肯定可以使用 OpenGL 或 Vulkan 吗?!?渲染你无辜的CSS,但相信我,这是不值得的。
- Skia 对于 Linux 和 android 来说都是一个很好的选择(chrome 在 Android 上使用它)
- Direct2D 是的,仅限 Windows。
- Cairo 和 Blend2D 这些是跨平台的,值得研究。
- V8 的高性能气相色谱仪
- JIT 编译的冒险
- JavaScriptCore 中的推测
- 网络编程 Rust 网络、Rust std::net、C
- 在学习了解析、渲染和 JIT 之后,您现在可以按照 Whatwg 标准,使用基本 API 和最少功能制作自己的浏览器
- 漏洞利用:了解浏览器如何工作的一个好方法是尝试破解它:(先决条件包括扎实的二进制漏洞利用技能)
- LiveOverflow 的浏览器攻击系列 |书面
- Web Assembly 黑客讲座黑帽
- github上的浏览器pwn
- 网络浏览器利用 - 佛罗里达大学
- 根据浏览器或运行时环境查看 CVE 或 CTF 挑战的文章。
恶意软件
先决条件包括对 Windows 的深入了解和扎实的逆向工程技能。
- 实用恶意软件分析
- hackersploit 恶意软件分析训练营
- CS5138 恶意软件分析,UC
- Prelude 的直播
- Cr0w 的 YouTube 频道
- 在学习了恶意软件逆向和行为的基础知识之后,您现在可以开始逆向其中的一些真实示例。
- 恶意软件独角兽实验室
- VX Underground - 互联网上最大的恶意软件源代码、样本和论文集合。
- 信息安全参考中的恶意软件部分
- 恶意软件集市
操作系统基础知识
我不太确定我是否想进入内核开发(还),但这些概念看起来很酷,对于假期项目来说这是一个好主意。请务必在开始之前阅读要求。
- 如果您想了解操作系统,OS Dev Wiki 是您的最佳选择。它有据可查,也有助于眼睛流血。
- Linux 内核实验室
- 来自 github 上很棒的操作系统的教程部分
- 断荆棘的教程
- 操作系统分为 3 个部分
- 操作系统小书
- 博客操作系统:用 Rust 编写操作系统
- Bootlin 幻灯片和实验室
- 539kernel:创建操作系统内核的旅程
- 需要做的事情:
- 俳句
- 反应操作系统
- 尤迪普图拉挑战
- 氧化还原
- 更多铁锈项目
- github 上很棒的操作系统
- 我的不和谐服务器的操作系统开发频道可以获取更多资源和书籍。
虚拟机内部结构
在编译器工程和浏览器开发方面取得进展时需要研究的 VM 内部结构列表:
- 如何构建虚拟机
- JS 内部结构,V8 的字节码
- Dart 虚拟机架构
- JVM结构主要、JVM内部原理I、JVM内部原理初学者
集体课程
包含 2 个或多个上述主题的资源集合:
- Nand To Tetris 一门教您如何构建计算机、操作系统和编译器的课程。
- Dive Into Systems 一本向您介绍系统编程的非常好的书。