
Простой инжектор разделяемых библиотек для x64 Linux без использования ptrace
Простой инжектор общей библиотеки для x64 Linux, не использующий ptrace.
linux_injector <режим> <pid> <файл>
режим
pid
Идентификатор целевого процесса. Для этого требуются права ptrace (необходимо для доступа к /proc/$pid/mem). Процесс не трассируется через ptrace, поэтому другой процесс может свободно выполнять его ptrace.
файл
Для режима 1: модуль для инжекции, который будет загружен через dlopen в удалённом процессе. Вероятно, следует указывать полный путь, поскольку в противном случае для разрешения используется удалённая переменная LD_LIBRARY_PATH.
Для режима 2: модуль для инжекции, который будет загружен через dlopen в удалённом процессе из memfd, куда будет скопировано содержимое.
Для режима 3: сырой shellcode для инжекции. Вы будете размещены по адресу, выровненному по 16 байт, и начнёте выполнение на случайном перехваченном потоке. Разместите хуки или создайте поток, затем вернитесь.
Для перехвата потока управления этой программе требуется кандидат на перехват. Представленный здесь код использует malloc; это можно изменить, отредактировав FUN_NAME и перекомпилировав. Убедитесь, что перехваченная функция может выполняться менее 100 мс, чтобы она не была перезаписана во время своего выполнения. Это означает, что такие вызовы, как sleep или wait, плохо подходят для начального shellcode. Функция также должна иметь длину более 0x50 байт, чтобы shellcode не перезаписывал другие функции.
Glibc и musl поддерживаются как для целевого, так и для исходного процесса. Целевой процесс может работать в контейнере и использовать другую libc. Для режимов 2 и 3 не требуются какие-либо пути, доступные целевому процессу.
Режим 2 требует Linux 3.17.
Протестировано на Oracle Linux 7 (режим 2 не поддерживается), Fedora 37 и Alpine Linux 3.17