Обучение сборке по соображениям безопасности

С чего начать, если я хочу изучить ассемблер по соображениям безопасности? Я думаю, что если я хочу избежать ошибок, лучше всего знать, что ты делаешь. Что произойдет, если я приведу подписанный int в unsigned int. Как только я получил странное сообщение об ошибке, переменная выровнена неправильно. В это время я понятия не имел, что такое выравнивание.

1 ответ

Решение

Мои два цента

Если вы не находите сборку интригующей и у вас не так много времени, я хотел бы предложить вам изучить только эти вещи: как представлены числа со знаком, как представлены числа с плавающей запятой и что такое выравнивание данных.

Я настоятельно рекомендую вам изучить ассемблер, так как это очень увлекательно, но я признаю, что для начинающего это огромное усилие с определенной целью.
Обучение сборке - это не изучение списка инструкций, на самом деле нет необходимости запоминать такой список. Изучение ассемблера означает изучение каждого аспекта работы вашего компьютера, начиная с таблицы технических характеристик оборудования и заканчивая реализацией ОС.
Это много материала, так что даже составить его список сложно, не говоря уже о том, чтобы его изучить!

Я начал изучать ассемблер, когда был подростком, потому что был очарован этим, не было никакой цели, кроме знания. Я сделал (и делаю) это для удовольствия, это сделало вещи проще, у меня не было сроков. Тогда у меня было достаточно времени, чтобы изучить кусочки головоломки по одному, и, наконец, я получил, как я надеюсь, полное представление обо всем.
Я провел дни, исследуя один, банальный, маленький аспект, который выскочил, когда я работал над большим проектом.
Это поведение, которое вы должны получить, если вы начнете пропускать детали, все станет размытым.
Всегда делайте быстрый мысленный след того, что происходит за сценой, и записывайте свои сомнения.
Позже исследуйте эти сомнения и напишите текстовый файл с вашими аннотациями и открытиями.

Пункты ниже пытаются дать вам путь для подражания.

Я предполагаю, что вас не интересует сам язык ассемблера и системное программирование (поэтому я пропустил, предлагая вам эту старую, но обязательную книгу: язык искусства ассемблера).
Я также предположил, что у вас есть архитектура IA32e (то есть процессор Intel или AMD).


1. Прочитайте документацию (потребуется время)

Прочитайте руководства Intel.
В первый раз вы можете остановиться на главе 7 первого руководства, но вернуться как можно скорее, чтобы закончить чтение.

Используйте NASM в качестве ассемблера.
Вам понадобится компоновщик, используйте GCC в Linux и CL в Windows (предоставляется вместе с Visual Studio, экспресс-версия бесплатна).

Не используйте среду выполнения C или любую читаемую библиотеку.
Изучите Linux API.
Изучите Windows API.
Изучите Linux ABI.
Изучите Windows ABI.

Найти онлайн (неполные, дрянные) учебники, чтобы получить практическое представление о том, как это работает.

Узнайте, как правильно писать прологи и эпилоги функций и как использовать стек.
Практикуйтесь. Пишите простые глупые программы.

Получите представление о том, как работает системный вызов для этих ОС, что происходит в процессе загрузки, как разрешаются символы и загружается библиотека.

Ищите в Интернете упражнение по программированию на C и делайте это в сборке, не используя среду выполнения C.
Сделайте их снова, используя среду выполнения C.

2. Много работаем с компиляторами.

Напишите тестовые программы на C и посмотрите, как это реализовано.
Сделайте гипотезу-тест-тезис циклов.
Всегда имейте в виду, что говорит стандарт C, так как он играет главную роль в решениях компилятора, и вы не сможете сделать вывод из разборки.

Другие вопросы по тегам