Форматы исполняемых файлов: ELF (Linux)
Аналог PE в мире Linux и Unix — формат ELF.
ELF (Executable and Linkable Format) — стандартный формат исполняемых файлов, библиотек и объектных файлов в Linux и других Unix-системах.
Зачем отдельный урок
Многие учебные задачи, CTF и серверная малварь — это ELF под Linux. Формат отличается от PE, но идея та же: заголовок, код, данные, таблицы.
Структура ELF
| Часть | Назначение |
| ELF-заголовок | Начинается с байтов 0x7F 'E' 'L' 'F'; тип файла, архитектура, точка входа. |
| Заголовки программы | Сегменты — как загружать файл в память (нужны при запуске). |
| Секции | Логические части для линковки и анализа. |
| Заголовки секций | Таблица с описанием всех секций. |
Типичные секции ELF
.text— машинный код..data— изменяемые данные..rodata— константы и строки (только чтение)..symtab/.strtab— таблицы символов (если не убраны командойstrip)..plt/.got— механизм вызова функций из динамических библиотек.
Секции против сегментов
Важная особенность ELF: секции нужны для линковки и анализа (что куда относится), а сегменты (program headers) описывают, как загрузить файл в память при запуске. Один сегмент может объединять несколько секций. Дизассемблеры работают с секциями, загрузчик ОС — с сегментами.
Как работает под капотом: динамическая линковка
Когда программа вызывает функцию из библиотеки (например, printf из libc), адрес функции заранее неизвестен. Механизм PLT/GOT подставляет реальный адрес при первом вызове. В дизассемблере вы увидите вызовы вида call printf@plt — это нормально.
PE и ELF: сравнение
| PE (Windows) | ELF (Linux) | |
| Сигнатура | MZ … PE | 0x7F ELF |
| Код | .text | .text |
| Константы | .rdata | .rodata |
| Импорты | Import Table | PLT/GOT |
Частые ошибки
- Думать, что ELF без символов (после
strip) нечитаем — читаем, просто имён функций нет. - Путать секции и сегменты.
Итог
- ELF — формат Linux; начинается с
0x7F ELF. - Код в
.text, строки в.rodata, вызовы библиотек — через PLT/GOT. - Секции — для анализа, сегменты — для загрузки в память.