システムプログラミングロードマップ
コンパイラ開発、マルウェア リバース エンジニアリング、カーネル開発の基礎を独学するためのロードマップ。これらは基本的な知識のみを目的としたものであり、何かをマスターするものではないことに注意してください。後でいくつかの特定のトピックで研究するために、以下で説明するフィールドから 1 つ以上を選択します。 Low Level Programming University にも参考になるリソースの優れたリストがありますが、これは私の個人的なロードマップです。
ここで学習するトピックは順番が決まっている場合とそうでない場合があり、それぞれの前提条件が満たされているという前提で、好みに応じて学習できます。
前提条件
すでに、読者がコンピュータ アーキテクチャの基本を理解し、少なくとも 1 つのシステム プログラミング言語の経験があり、アセンブリの仕組みについての基本がいくつかあり、POSIX システムの使用に精通していることを前提としています。コンピュータが電子機器レベルでどのように動作するかについては、Agner Fog 著『デジタル エレクトロニクス入門』に詳細に記載されています。また、ソフトウェアの同等の作業については、cpu.land を参照してください。
システムプログラミング言語
指定された言語のうち任意の 2 つを学び、それに慣れるためにいくつかの基本的なプロジェクトを作成し、いくつかのプログラミング演習を解きます。
- C
- さび
- C++ を学ぶ、C++ リファレンス
- C++ (ビデオ)
コンピュータアーキテクチャを学ぶ
Arm および RISCV ベースのコンピュータ アーキテクチャを学び、ハードウェア レベルでの問題を解決するための効率的で最適化されたアプローチを構築します。
- デビッド A. パターソン、ジョン L. ヘネシー「コンピューター アーキテクチャ: 定量的アプローチ」
- デビッド A. パターソン、ジョン L. ヘネシー「コンピュータの組織と設計 ARM 版」
- デビッド・A・パターソン、ジョン・L・ヘネシー「コンピュータの組織と設計 RISC-V版」
- John Paul Shen、Mikko H. Lipasti 「最新のプロセッサ設計: スーパースカラー プロセッサの基礎」
- CMU コンピューター アーキテクチャ (CMU Youtube)
組み立てを学ぶ
前提条件: デジタル ロジックについて学ぶ
まだアセンブリに慣れていない場合は、次のようなチュートリアルをチェックすることをお勧めします。
- x86 クイックスタート[MASM]
- x86 クイックスタート [NASM]
- ASM講師[NASM]
- YouTube の Davy による x86 アセンブリ言語の紹介
- OMU x86_64 レッスン
- アズムの芸術
- インテル x64 マニュアル
- Compiler Explorer: C プログラムを作成し、逆アセンブリを読むと、常にパターンを一致させるのに役立ちます。
- 基本的なクラックを元に戻すことができるダミー用の 0x44 reversing による記事。
この後、簡単なクラックを解いて練習することをお勧めします。 crashmes.one と tryhackme は、簡単なものをいくつか見つける場所です。ハードなものでは、まだポーニングの知識が必要ですが、これについてはエクスプロイトのセクションで説明します。
コンパイラ
前提条件には、システム プログラミング言語でプロジェクトを作成した経験と、メモリと CPU についての深い理解が含まれます。
- ドラゴンブックを読んでください。
- Crafting Interpreters は初心者に適しています。
- Language Implementation Patterns は、コンパイラーの動作に関するいくつかの優れた洞察を提供します。
- Stanford Notes CS143 コンパイラ設計に関連する優れた課題とメモ。
- CMU のスライドとプロジェクト
- 素晴らしいコンパイラ
- Rustで言語を作る
- Rust 解析の基本
- ツリーウォークを解釈するプログラミング言語を作成します。
- また、インタプリタにバイトコード エンジンを実装し、いくつかの最適化と GC を試してみてください。
- Chip8 や Nes などのマシンをエミュレートすることもできます。
- エミュレーションには、VM の内部構造とグラフィックス プログラミングの知識が必要です。
- SDL を IO/グラフィックス/サウンド エンジンとして使用できます。
- 1 つのアーキテクチャをターゲットにしたコンパイル済みプログラミング言語を作成してみてください。
- LLVM ツールチェーンについて学ぶ
- RustのLLVMチュートリアル
- llvm チュートリアルに従って、llvm バックエンドを使用して最初のプログラミング言語を作成してみてください。
- バイトコード エンジンを中心に Just In Time コンパイラを作成し、ホット領域を検出して JIT 処理してみます。
- 私のDiscordサーバーのlang-devセクション
搾取
前提条件には、組み立ての経験が含まれます。
- ike: システム ハッキング ハンドブック
- pwn.college は、これまで私が活用した中で最高の学習リソースです。アセンブリからカーネルの活用まで、すべてをカバーします。
- エクスプロイト開発の概要
- Nightmare: CTF に基づいたバイナリ悪用の紹介。
- CS6265: リバース エンジニアリングおよびバイナリ悪用ラボ
- OMU 活用ラボ
- YouTube の LiveOverflow の binexp シリーズ
- 0xinfection によるチュートリアル
- infosec リファレンスで開発を悪用する
- ROPエンポリアム
- Windows のもの
- Windows x64 の反転
- Win32 API プログラミング
- Windowsエクスプロイト開発者
- CazzさんのYoutubeチャンネル
- ゲームハッキングアカデミー
- 悪用について学習したら、CTF を解決できるようになります。そのうちのいくつかは次のとおりです。
- pwnable.kr
- 教育用 VM を悪用する
- 搾取をカバーする有線ウォーゲーム
- バイナリ悪用に基づく HackTheBox の課題
ブラウザハッキング
前提条件には、VM の内部構造に関する高度な知識、コンパイラー エンジニアリングに関する確かな理解と経験が含まれます。
- 発達
- 基本的な HTML dom パーサー Rust を作成する
- おもちゃのブラウザエンジン、ゼロから作るブラウザエンジン
- JavaScript バイトコード VM Andreas Kling
- ブラウザ解析と JS AST Andreas Kling
- 最新のブラウザの内部を見る
- フォローするブログ: V8、MozHacks、Webkit
- ドキュメント: Firefox、Chromium、Webkit Wiki
- Compiler Compiler: 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 によるブラウザエクスプロイション シリーズ |書かれた
- Web アセンブリ ハッキング トーク Black Hat
- github 上のブラウザ pwn
- Web ブラウザの悪用 - フロリダ大学
- ブラウザまたはランタイム環境に基づいて、CVE または CTF チャレンジの書き込みを確認します。
マルウェア
前提条件には、Windows に関する高度な理解と確かなリバース エンジニアリング スキルが含まれます。
- 実践的なマルウェア分析
- hackersploitによるマルウェア分析ブートキャンプ
- CS5138 マルウェア分析、UC
- プレリュードのライブストリーム
- Cr0wのYoutubeチャンネル
- マルウェアの逆転と動作の基本を学習したら、それらの実際のサンプルの逆転に進むことができます。
- Malware Unicorn によるラボ
- VX Underground - インターネット上のマルウェアのソース コード、サンプル、論文の最大のコレクション。
- infosec リファレンスのマルウェアに関するセクション
- マルウェアバザール
OSの基礎
(まだ) カーネル開発に携わりたいかどうかはよくわかりませんが、コンセプトは素晴らしく、休暇中のプロジェクトには良いアイデアだと思います。始める前に必ず要件をお読みください。
- OS について学びたい場合は、OS Dev Wiki が最適です。これは十分に文書化されており、目の出血にも役立ちます。
- Linux カーネル ラボ
- github のすばらしい OS のチュートリアル セクション
- ブロークン・ソーンのチュートリアル
- OSは3つに分かれています
- リトルOSブック
- ブログ OS: Rust で OS を書く
- Bootlin のスライドとラボ
- 539kernel: OS カーネル作成の旅
- 取り組むべきこと:
- 俳句
- 反応OS
- ユーディプトゥラの挑戦
- レドックス
- さらなる錆プロジェクト
- github にある素晴らしい OS
- 私の Discord サーバーの OS 開発チャネルで、さらにリソースや書籍を入手できます。
VM の内部構造
コンパイラ エンジニアリングとブラウザ開発を進める際に検討すべき VM 内部のリスト:
- 仮想マシンの構築方法
- JS 内部、V8 のバイトコード
- Dart VM アーキテクチャ
- JVM 構造メイン、JVM 内部 I、JVM 内部 初心者
集合コース
上記で説明したトピックを 2 つ以上含むリソースのコレクション:
- Nand To Tetris コンピュータ、OS、コンパイラの構築方法を学ぶコースです。
- Dive Into Systems システムプログラミングを紹介するのにとても良い本です。