нужной нам функции (захуканной) ➔ Выполняем функцию ➔ Сохраняем полученное значение ➔ Возвращаемся обратно, как будто вызвали обычную функцию Как работает method hooking
5 = 10 testprogram.exe: 5 + 5 = 10 your program has been hacked! testprogram.exe: 5 + 5 = 1010 your program has been hacked! testprogram.exe: 5 + 5 = 1010 your program has been hacked! testprogram.exe: 5 + 5 = 1010 Метод Hooking
сторонний процесс. ➔ Загружаем нужную библиотеку, вызывая dlopen . ➔ Находим адрес нашей hooked функции с помощью dlsym. ➔ Вызываем нашу hooked функцию. ➔ Выгружаем загруженную библиотеку, используя функцию dlclose. Детальнее о Hooking
pid, void *addr, void *data); Системная функция ptrace () предоставляет средство, с помощью которого один процесс («трассировщик») может наблюдать и контролировать выполнение другого процесса («трассировка»), а также проверять и изменять память и регистры трассировки. В основном, он используется для реализации отладки и трассировки системных вызовов. Метод Hooking
offset Где: libc start address — константа (0xb7e22000 – например, для какого-то ‘заражённого’ бинарника) Отступ функции от начала библиотеки (ищется с помощью “readelf -s libc.so.fun_name | grep “) Если бы было всё просто
адресного пространства») — технология, применяемая в операционных системах, при использовании которой случайным образом изменяется расположение в адресном пространстве процесса важных структур данных, а именно образов исполняемого файла, подгружаемых библиотек, кучи и стека. Address space layout randomization
регистр процессора, который указывает, какую команду нужно выполнять следующей. LR ( R14 ) – (англ. Link register) — регистр, хранящий адрес, куда будем возвращаться после выполнения функции R0-R3 — вспомогательные регистры. Сначала хранят первые 4 аргумента, после выполнения в R0 лежит значение выполнившейся функции. R13 – регистр, в котором хранится адрес на стек. Основные понятия
Если есть ещё какие-то – они кладутся в стек (R13) . • В регистр PC ( R15 ) кладётся указатель на функцию. • В регистр LR ( R14 ) кладётся адрес, куда нам вернуться. • Возвращаемое значение складывается в регистр R0. Конвенция ARM
регистры в соответствии с конвенцией (R0 – R3, если мало – кладём в стек). • Ставим 0 в LR, чтобы мы смогли поймать SIGSEGV после вызова функции. • Кладём в PC адрес функции. • Обновляем регистры с помощью PTRACE_SETREGS. • Стартуем функцию с помощью PTRACE_CONT и ждём SIGSEGV (потому что 0 в LR). • Забираем и сохраняем данные из регистра R0. • Восстанавливаем оригинальные регистры. Как происходит инъекция