[secsem][seccourse] Ассемблер, исполнение программ, GNU binutils

YOUTUBE · 24.11.2025 05:51

Ключевые темы и таймкоды

Криптография и ошибки в программах

0:24
  • Криптография решает задачи защиты информации, но не решает проблемы безопасности в сети интернет.
  • Ошибки в программах могут быть связаны с проектированием, обратной совместимостью и архитектурой процессоров.

Архитектура Intel и уязвимости

7:29
  • В архитектуре Intel можно исполнять программы с любого байта, что облегчает организацию атак на переполнение буфера.
  • В операционной системе Linux изучается архитектура Intel для учебных целей.

Пример уязвимости и отладка

11:36
  • В программе на языке C есть уязвимость, связанная с переполнением буфера.
  • В лекции рассматривается, как отлаживать и трассировать процессы в операционной системе Linux.

Указатели и стеки

17:52
  • Указатель - это указатель на данные, обычно используется как счетчик цикла.
  • Важные для понимания шелкода регистры, которые работают со стеком: указатель на вершину стека, указатель на данные на стеке, ESP и EBP.

Процессы и виртуальная память

19:10
  • Каждый процесс имеет свое адресное пространство, которое операционная система следит за тем, чтобы процессы не нарушали данные друг друга.
  • Процесс может использовать всю физическую память, но виртуальная память контролируется операционной системой.

Сегменты и права доступа

22:30
  • Сегмент - единица разделения памяти по типам данных и по сегментам.
  • В каждом процессе есть сегменты, которые могут быть помечены как исполняемые или неисполняемые.

Стек и его работа

26:14
  • Стек - структура данных, которая работает по принципу "пласты".
  • Стек-фрейм - это параметры и локальные переменные функции, которые хранятся на стеке.
  • При работе с функциями, объекты памяти могут иметь статическое, динамическое или автоматическое размещение.

Сэмплеры и их использование

36:26
  • В Linux используются два синтаксиса сэмплера: Intel и AT&T.
  • В Unix-подобных операционных системах исторически используется AT&T-синтаксис, который используется в GCC и других утилитах.

Компиляция и линковка

39:36
  • При компиляции из C в язык ассемблера выполняются основные языкозависимые оптимизации.
  • После компиляции получается объектный файл, содержащий машинный код и вызовы внешних функций.
  • Линукс умеет понимать и исполнять исполнимые файлы старых форматов, таких как a.out.

Исполнимые файлы и их форматы

44:06
  • В Linux используются форматы ELF и a.out.
  • Исполнимые файлы могут быть текстовыми, динамическими библиотеками и объектными файлами.
  • Статические библиотеки имеют расширение .a и представляют собой архивы объектных файлов.

Перегрузка функций и манглинг

52:11
  • В C++ при перегрузке функций компилятор использует манглинг для декорирования имен функций.
  • Манглинг отличается от компилятора к компилятору и обычно добавляет подчеркивания к имени функции и суффикс, указывающий типы аргументов.

Работа с бинарными файлами

54:10
  • Для чтения и работы с бинарными файлами используются утилиты из состава бинутиус.
  • Для формата ELF используются интерпретаторы lipl de и lipl so.
  • При старте программы связываются символы в ELF файле с динамическими библиотеками.

Настройка и использование библиотек

57:40
  • Настройка библиотек осуществляется через файлы конфигурации или переменные окружения.
  • Указание пути в файле конфигурации позволяет найти разделяемую библиотеку при запуске программы.
  • Через интерфейс дели опен можно связать указатель на функцию с библиотекой и вызвать ее с параметрами.

Работа с переменными окружения

1:02:49
  • Переменные окружения могут быть определены для текущего пользователя или для всех процессов.
  • Утилиты, такие как sudo и screen, могут изменять значение переменных окружения.

Манипуляции с бинарными файлами

1:09:32
  • Для работы с бинарными файлами используются утилиты из состава бинутиус, такие как nm и objdump.
  • Эти утилиты могут быть полезны для анализа файлов и в системах сборки проектов.

Использование nm и ldd

1:10:24
  • nm показывает список символов, экспортируемых из объектного файла в библиотеке.
  • ldd показывает список библиотек, от которых зависит бинарник.

Использование обж-дампа

1:13:03
  • обж-дамп позволяет получить листинг ассемблера для любой секции или всего файла.
  • Используется для дезацилирования статических файлов.

Использование трассировщиков

1:16:11
  • Трассировщики, такие как стресс, могут использоваться для отслеживания системных вызовов и сигналов.
  • Профайлер джи проф может показать более подробную информацию о программе.

Задание на практику

1:18:34
  • Скомпилировать, собрать объектный файл, слинковать исполнимый файл.
  • Исследовать программу с помощью гдб, обж-дампа и трассировщиков.
  • Сравнить вывод обж-дампа с исходным текстом программы.