系統程式路線圖
自學編譯器開發、惡意軟體逆向工程和核心開發基礎知識的路線圖。要注意的是,它們只是基礎知識,並不能讓你成為任何方面的大師。我將選擇下面提到的一個或多個領域來進行後續某些特定主題的研究。低階程式設計大學也有一個很好的資源清單可供遵循,但這是我個人的路線圖。
這裡要學習的主題可能是按順序排列的,也可能不是按順序排列的,可以根據您的喜好進行研究,前提是每個主題都滿足先決條件。
先決條件
我已經假設您對電腦體系結構有基本的了解,並且具有至少一種系統程式語言的經驗、彙編工作原理的一些基礎知識,並且熟悉使用任何 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 一本向您介紹系統程式設計的非常好的書。