Форматы исполняемых файлов: 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 … PE0x7F ELF
Код.text.text
Константы.rdata.rodata
ИмпортыImport TablePLT/GOT

Частые ошибки

  • Думать, что ELF без символов (после strip) нечитаем — читаем, просто имён функций нет.
  • Путать секции и сегменты.

Итог

  • ELF — формат Linux; начинается с 0x7F ELF.
  • Код в .text, строки в .rodata, вызовы библиотек — через PLT/GOT.
  • Секции — для анализа, сегменты — для загрузки в память.
Проверьте себя
1. С каких байтов начинается ELF-файл?
AMZ
BPE\0\0
C0x7F 'E' 'L' 'F'
D#!/bin
2. Чем секции отличаются от сегментов в ELF?
AЭто одно и то же
BСекции нужны для линковки/анализа, сегменты — для загрузки в память при запуске
CСекции исполняются, сегменты — нет
DСегменты содержат только строки