- Регистрация
- 27 Апр 2025
- Сообщения
- 51
- Реакции
- 0
- Баллы
- 6
Создание малозаметного ELF-шифровальщика с использованием memfd_create: демонстрация практического подхода
Введение в идею и концепцию
Современные подходы к разработке утилит, способных шифровать и исполнять ELF-файлы напрямую из памяти, активно используют преимущества системных вызовов ядра Linux. Одним из таких ключевых вызовов является memfd_create, который позволяет создавать анонимные участки памяти с файловым интерфейсом, не оставляя при этом следов в файловой системе.
В данной статье рассмотрим экспериментальный шифровальщик под архитектуру x86_64, который реализует идею исполнения ELF-файлов из памяти, без записи на диск, с элементами демоноподобного поведения. Мы покажем, как работает данный механизм, сгенерируем зашифрованный бинарник, подключим к нему заглушку-дешифратор и в реальном времени отследим поведение процесса в памяти. Проект базируется на Ezuri (Go + AES + memfd_create), доступном на GitHub, и может быть легко адаптирован под различные цели.
---
Что такое memfd_create и зачем он нужен
Системный вызов memfd_create — это мощный инструмент для создания исполняемых объектов в оперативной памяти. Он позволяет разработчику создать временный файловый дескриптор, не отображаемый в файловой системе, при этом доступный как обычный файл для записи и исполнения. В результате создаётся ситуация, при которой программа, записанная в такой дескриптор, может быть запущена напрямую, без какого-либо следа на диске.
В представляемом примере мы используем этот механизм для выполнения зашифрованного ELF-бинарника, дешифруя его в памяти, подключая через memfd_create и активируя как фоновый процесс.
---
Архитектура шифровальщика Ezuri
Основные компоненты проекта:
Шифровальщик, написанный на Go, который:
Шифрует исполняемый файл (любое ELF-приложение)
Встраивает в заглушку ключ и IV шифрования (или генерирует их случайно)
Создаёт новый исполняемый файл, готовый к запуску
Заглушка (stub), которая:
Расшифровывает зашифрованный бинарник в памяти
Использует memfd_create для создания анонимного исполняемого пространства
Демонизирует процесс и исполняет его в фоне (без привязки к терминалу)
Целевой бинарник — небольшой ELF-файл, демонстрирующий поведение процесса
---
Сборка и использование Ezuri: пошаговая инструкция
1. Сборка целевого демона
Создайте простой демон, например demon.c, записывающий строки в /tmp/log.txt.
gcc demon.c -o demon
2. Сборка Ezuri-шаблона
Из папки проекта выполните:
go build -o ezuri
3. Запуск шифровальщика
./ezuri
На экране появится серия запросов:
[?] Путь к файлу для шифрования: demon
[?] Путь выходного (зашифрованного) файла: cryptedDemon
[?] Имя целевого процесса: DEMON
[?] Ключ шифрования (оставьте пустым для генерации):
[?] IV шифрования (оставьте пустым для генерации):
Пример вывода:
[!] Случайный ключ: R@7ya3fo1#y67rCtNOYwpm5lyOA5xeYY
[!] Случайный IV: 5Ti65dgBKidm5%sA
[!] Генерация заглушки...
---
Результат: исполняемый демон без файловой активности
Теперь у вас есть файл cryptedDemon, который содержит:
зашифрованный ELF-файл
встроенную заглушку, расшифровывающую его в памяти
исполнение демона через memfd_create
Выполните его:
./cryptedDemon
ps -f $(pidof DEMON)
Вы увидите, что процесс работает в фоне, не имеет привязки к терминалу (TTY: ?), и идентифицируется как DEMON.
---
Проверка результата
Чтобы удостовериться в функционировании программы, проверьте файл логов:
tail /tmp/log.txt
Пример вывода:
Я всегда хотел быть ДЕМОНОМ!
|\___/|
/ \
| /\__/|
||\ <.><.>
| _ > )
\ /----
| -\/
/ \
---
Безопасность, маскировка и возможности по доработке
Для более сложного применения возможны следующие улучшения:
Присвоение имени процесса в честь реального системного сервиса (например, firewalld, xorg, apparmor)
Реализация обработки сигналов (SIGHUP, SIGKILL и т.д.) для автозапуска после остановки
Использование нескольких ключей шифрования и шифрование ключа внутри заглушки
Добавление функционала автозапуска при входе пользователя (через .bashrc, .desktop, systemd и пр.)
Кроме того, можно создать детектор-инжекторов, которые динамически внедряют шифровальщик в другие процессы или запускают его от имени системных служб — это значительно усложнит анализ.
---
Заключение
Представленная утилита демонстрирует, как можно создать малозаметный ELF-шифровальщик для Linux, исполняющий зашифрованные бинарники полностью из памяти. Подобные техники находят применение в тестах на проникновение, в разработке механизмов самозащиты программного обеспечения и демонстрации слабых мест в системной архитектуре Linux.
Однако, напомним: данный материал представлен исключительно в образовательных целях и для развития навыков безопасного программирования и анализа системной безопасности.
Введение в идею и концепцию
Современные подходы к разработке утилит, способных шифровать и исполнять ELF-файлы напрямую из памяти, активно используют преимущества системных вызовов ядра Linux. Одним из таких ключевых вызовов является memfd_create, который позволяет создавать анонимные участки памяти с файловым интерфейсом, не оставляя при этом следов в файловой системе.
В данной статье рассмотрим экспериментальный шифровальщик под архитектуру x86_64, который реализует идею исполнения ELF-файлов из памяти, без записи на диск, с элементами демоноподобного поведения. Мы покажем, как работает данный механизм, сгенерируем зашифрованный бинарник, подключим к нему заглушку-дешифратор и в реальном времени отследим поведение процесса в памяти. Проект базируется на Ezuri (Go + AES + memfd_create), доступном на GitHub, и может быть легко адаптирован под различные цели.
---
Что такое memfd_create и зачем он нужен
Системный вызов memfd_create — это мощный инструмент для создания исполняемых объектов в оперативной памяти. Он позволяет разработчику создать временный файловый дескриптор, не отображаемый в файловой системе, при этом доступный как обычный файл для записи и исполнения. В результате создаётся ситуация, при которой программа, записанная в такой дескриптор, может быть запущена напрямую, без какого-либо следа на диске.
В представляемом примере мы используем этот механизм для выполнения зашифрованного ELF-бинарника, дешифруя его в памяти, подключая через memfd_create и активируя как фоновый процесс.
---
Архитектура шифровальщика Ezuri
Основные компоненты проекта:
Шифровальщик, написанный на Go, который:
Шифрует исполняемый файл (любое ELF-приложение)
Встраивает в заглушку ключ и IV шифрования (или генерирует их случайно)
Создаёт новый исполняемый файл, готовый к запуску
Заглушка (stub), которая:
Расшифровывает зашифрованный бинарник в памяти
Использует memfd_create для создания анонимного исполняемого пространства
Демонизирует процесс и исполняет его в фоне (без привязки к терминалу)
Целевой бинарник — небольшой ELF-файл, демонстрирующий поведение процесса
---
Сборка и использование Ezuri: пошаговая инструкция
1. Сборка целевого демона
Создайте простой демон, например demon.c, записывающий строки в /tmp/log.txt.
gcc demon.c -o demon
2. Сборка Ezuri-шаблона
Из папки проекта выполните:
go build -o ezuri
3. Запуск шифровальщика
./ezuri
На экране появится серия запросов:
[?] Путь к файлу для шифрования: demon
[?] Путь выходного (зашифрованного) файла: cryptedDemon
[?] Имя целевого процесса: DEMON
[?] Ключ шифрования (оставьте пустым для генерации):
[?] IV шифрования (оставьте пустым для генерации):
Пример вывода:
[!] Случайный ключ: R@7ya3fo1#y67rCtNOYwpm5lyOA5xeYY
[!] Случайный IV: 5Ti65dgBKidm5%sA
[!] Генерация заглушки...
---
Результат: исполняемый демон без файловой активности
Теперь у вас есть файл cryptedDemon, который содержит:
зашифрованный ELF-файл
встроенную заглушку, расшифровывающую его в памяти
исполнение демона через memfd_create
Выполните его:
./cryptedDemon
ps -f $(pidof DEMON)
Вы увидите, что процесс работает в фоне, не имеет привязки к терминалу (TTY: ?), и идентифицируется как DEMON.
---
Проверка результата
Чтобы удостовериться в функционировании программы, проверьте файл логов:
tail /tmp/log.txt
Пример вывода:
Я всегда хотел быть ДЕМОНОМ!
|\___/|
/ \
| /\__/|
||\ <.><.>
| _ > )
\ /----
| -\/
/ \
---
Безопасность, маскировка и возможности по доработке
Для более сложного применения возможны следующие улучшения:
Присвоение имени процесса в честь реального системного сервиса (например, firewalld, xorg, apparmor)
Реализация обработки сигналов (SIGHUP, SIGKILL и т.д.) для автозапуска после остановки
Использование нескольких ключей шифрования и шифрование ключа внутри заглушки
Добавление функционала автозапуска при входе пользователя (через .bashrc, .desktop, systemd и пр.)
Кроме того, можно создать детектор-инжекторов, которые динамически внедряют шифровальщик в другие процессы или запускают его от имени системных служб — это значительно усложнит анализ.
---
Заключение
Представленная утилита демонстрирует, как можно создать малозаметный ELF-шифровальщик для Linux, исполняющий зашифрованные бинарники полностью из памяти. Подобные техники находят применение в тестах на проникновение, в разработке механизмов самозащиты программного обеспечения и демонстрации слабых мест в системной архитектуре Linux.
Однако, напомним: данный материал представлен исключительно в образовательных целях и для развития навыков безопасного программирования и анализа системной безопасности.

