Дорожная карта системного программирования
Дорожная карта для самостоятельного обучения разработке компиляторов, обратному проектированию вредоносных программ и основам разработки ядра. Следует отметить, что они предназначены только для фундаментальных знаний и не делают вас мастером каких-либо знаний. Я выберу одну или несколько из нижеперечисленных областей для дальнейших исследований по некоторым конкретным темам. В Университете низкоуровневого программирования также есть хороший список ресурсов, которым стоит следовать, но это моя личная дорожная карта.
Темы для изучения здесь могут быть по порядку, а могут и не по порядку, и их можно изучать в соответствии с вашими предпочтениями, при условии, что для каждой из них выполняются предварительные условия.
Предварительные условия
Я уже предполагаю, что у вас есть базовое понимание компьютерной архитектуры и опыт работы хотя бы с одним языком системного программирования, некоторые основы работы ассемблера и знание любой системы POSIX. Хороший подробный обзор того, как компьютеры работают на уровне электроники, можно найти в книге Агнера Фога «Введение в цифровую электронику». А для эквивалентной работы программного обеспечения вы можете обратиться к cpu.land.
Языки системного программирования
Изучите любые два из указанных языков, создайте несколько базовых проектов, чтобы познакомиться с ним, решите несколько упражнений по программированию.
- С
- Ржавчина
- Изучите C++, справочник по C++
- С++ (видео)
Изучите немного компьютерной архитектуры
Изучите компьютерную архитектуру на базе Arm и RISCV, чтобы создать эффективный и оптимизированный подход к решению проблем на аппаратном уровне.
- Дэвид А. Паттерсон, Джон Л. Хеннесси «Компьютерная архитектура: количественный подход»
- Дэвид А. Паттерсон, Джон Л. Хеннесси «Компьютерная организация и дизайн ARM Edition»
- Дэвид А. Паттерсон, Джон Л. Хеннесси «Компьютерная организация и проектирование RISC-V Edition»
- Джон Пол Шен, Микко Х. Липасти «Современный дизайн процессоров: основы суперскалярных процессоров»
- Компьютерная архитектура CMU от CMU Youtube
Изучите немного сборки
Предварительные требования: узнать о цифровой логике.
Если вы еще не знакомы с ассемблером, я бы рекомендовал просмотреть некоторые учебные пособия, например:
- Краткое руководство по x86[MASM]
- Краткое руководство по x86 [NASM]
- Репетитор по АСМ[NASM]
- Введение в язык ассемблера x86 от Дэви на YouTube
- Уроки ОМУ x86_64
- Искусство Асма
- Интел х64 руководства
- Compiler Explorer: Создание программ на C и чтение дизассемблирования всегда помогает найти шаблоны.
- Статья о реверсе 0x44 для чайников, чтобы они могли реверсировать базовые крэки.
После этого я бы порекомендовал решать простые крэки для упражнений. Crackmes.one и tryhackme — это места, где можно найти самые простые из них. Сложные по-прежнему требуют некоторых навыков взлома, которые я собираюсь обсудить в разделе эксплуатации.
Составители
Предпосылки включают опыт создания проектов на системном языке программирования и глубокое понимание памяти и процессора.
- Прочитайте Книгу Дракона.
- Crafting Interpreters — хороший вариант для начинающих.
- Шаблоны языковой реализации дают хорошее представление о работе компиляторов.
- Stanford Notes CS143 Хорошие задания и заметки, связанные с проектированием компилятора.
- Слайды и проекты CMU
- Потрясающие компиляторы
- Создать язык в Rust
- Основы анализа ржавчины
- Сделайте обход дерева интерпретируемым языком программирования.
- Также попробуйте реализовать механизм байт-кода для вашего интерпретатора, попробуйте некоторые оптимизации и сборщик мусора.
- Вы также можете эмулировать такие машины, как Chip8 или Nes.
- Эмуляция требует знаний внутреннего устройства виртуальной машины и графического программирования.
- Вы можете использовать SDL в качестве механизма ввода/вывода/графики/звука.
- Попробуйте создать компилируемый язык программирования, ориентированный на одну архитектуру.
- Узнайте об инструментальной цепочке LLVM
- Учебное пособие по LLVM в Rust
- Попробуйте следовать руководству по llvm, чтобы создать свой первый язык программирования с использованием серверной части llvm.
- Попробуйте создать JIT-компилятор на основе механизма байт-кода, обнаружить горячие области и выполнить их JIT-компиляцию.
- Раздел lang-dev моего сервера Discord
Эксплуатация
Обязательным условием является опыт сборки.
- ike: Справочник по системному хакерству
- pwn.college — лучший учебный ресурс, который я когда-либо использовал. Он охватывает все: от сборки до эксплуатации ядра.
- Введение в разработку эксплойтов
- Кошмар: введение в бинарную эксплуатацию на основе CTF.
- CS6265: Лаборатория обратного проектирования и использования двоичных данных
- Лаборатории эксплуатации ОМУ
- Серия binexp от LiveOverflow на YouTube
- Учебник от 0xinfection
- Разработчик эксплойта в справочнике по информационной безопасности
- Торговый центр РОП
- Windows
- Реверс Windows x64
- Программирование API Win32
- Разработчик эксплойтов для Windows
- Канал Казза на YouTube
- Академия взлома игр
- Узнав о некоторых уязвимостях, вы можете решить CTF прямо сейчас. Некоторые из них включают в себя:
- pwnable.kr
- Используйте образовательные виртуальные машины
- Военные игры по беспроводной сети, посвященные эксплуатации
- Проблемы HackTheBox, основанные на бинарной эксплуатации
Взлом браузера
Предварительные требования включают высокий уровень знаний внутреннего устройства виртуальных машин, а также глубокое понимание и опыт разработки компиляторов.
- Разработка
- Создайте базовый парсер html dom на Rust
- Игрушечный браузерный движок, Браузерный движок с нуля
- Байт-код JavaScript VM Андреас Клинг
- Парсинг браузера и JS AST Андреас Клинг
- Взгляд изнутри на современный браузер
- Блоги, на которые стоит подписаться: V8, MozHacks, Webkit.
- Документы: Firefox, Chromium, Webkit Wiki.
- Компилятор Компилятор: серия Twitch о работе над движком JavaScript.
- Графика: выберите библиотеку 2D-графики для вашего языка или платформы. Вы наверняка можете использовать OpenGL или Vulkan?!? для рендеринга вашего невинного CSS, но поверьте мне, оно того не стоит.
- Skia — хороший вариант для Linux и Android (Chrome использует его на Android).
- Direct2D да, только для Windows.
- Cairo и Blend2D. Это кроссплатформенные приложения, на которые стоит обратить внимание.
- Высокопроизводительный gc для V8
- Приключения в JIT-компиляции
- Спекуляции в JavaScriptCore
- Сетевое программирование Rust Networking, Rust std::net, C
- Изучив синтаксический анализ, рендеринг и JIT, вы теперь можете создать свой собственный браузер с базовыми API и минимальными функциями, следуя стандартам Whatwg.
- Эксплуатация: отличный способ понять, как работает браузер, — попытаться взломать его: (предварительные условия включают в себя надежные навыки эксплуатации двоичных файлов)
- Серия «Эксплуатация браузера» от LiveOverflow | Написано
- Доклад о хакерстве веб-сборки Black Hat
- Браузер pwn на github
- Эксплуатация веб-браузера - Университет Флориды
- Просмотрите описания проблем CVE или CTF на основе браузеров или сред выполнения.
Вредоносное ПО
Предварительные требования включают глубокое понимание Windows и хорошие навыки реверс-инжиниринга.
- Практический анализ вредоносного ПО
- Учебный курс по анализу вредоносного ПО от hackersploit
- CS5138 Анализ вредоносного ПО, UC
- Прямые трансляции Prelude
- Канал Cr0w на YouTube
- Изучив основы реверсирования и поведения вредоносных программ, теперь вы можете перейти к реверсированию некоторых их реальных образцов.
- Лаборатории Malware Unicorn
- VX Underground — крупнейшая коллекция исходного кода, образцов и документов вредоносного ПО в Интернете.
- Раздел «Вредоносное ПО» из справочника по информационной безопасности
- Базар вредоносных программ
Основы ОС
Я не совсем уверен, что хочу заняться разработкой ядра (пока), но концепции кажутся крутыми, и это хорошая идея для проекта на каникулах. Прежде чем приступить к работе, обязательно прочтите требования.
- OS Dev Wiki — это то место, куда можно обратиться, если вы хотите узнать об ОС. Это хорошо документировано и также помогает глазам кровоточить.
- Лаборатории ядра Linux
- Раздел руководств из Awesome OS на github
- Учебник Сломанного Шипа
- ОС в 3-х частях
- Маленькая книга по ОС
- Блог ОС: Написание ОС на Rust
- Слайды и лаборатории Bootlin
- 539kernel: путь создания ядра ОС
- Над чем работать:
- Хайку
- Реагировать ОС
- Вызов Евдиптулы
- Редокс
- Еще проекты по ржавчине
- Отличная ОС на github
- Канал разработки ОС моего сервера Discord, где можно получить дополнительные ресурсы и книги.
Внутреннее устройство виртуальной машины
Списки внутреннего устройства виртуальной машины, которое необходимо изучить, продвигаясь в разработке компилятора и браузера:
- Как собрать виртуальную машину
- Внутреннее устройство JS, байт-код V8
- Архитектура Дарт ВМ
- Основная структура JVM, Внутреннее устройство JVM I, Внутреннее устройство JVM Для начинающих
Коллективные курсы
Коллекция ресурсов, включающая 2 или более тем, обсуждавшихся выше:
- Nand To Tetris Курс, который научит вас собирать компьютер, операционную систему и компилятор из stratch.
- Погружение в системы Действительно хорошая книга, которая познакомит вас с системным программированием.