Управление EIP
Перезапись адреса возврата
«Управление EIP» — бесплатный урок Ethical Hacking Academy на CoddyKit. Это урок 3 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Ethical Hacking Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Ethical Hacking Academy содержит 4 уроков всего.
Цель
Теперь у Вас есть смещение, поэтому Вы можете поместить любые четыре байта в EIP. Возникает вопрос: какой адрес следует туда записать?
Вы хотите, чтобы EIP указывал на Ваш шелл-код. Но нельзя просто жёстко задать адрес стека: нужен надёжный переход.
Почему нельзя жёстко задать адрес стека
Адрес стека, по которому находится Ваш шелл-код, может меняться между запусками и в разных системах. Даже небольшие изменения окружения сдвигают его.
Вместо этого используется стабильная инструкция, уже находящаяся в памяти, которая перенаправляет выполнение туда, куда в данный момент указывает ESP.
Приём с JMP ESP
Если в момент сбоя ESP указывает на Ваш шелл-код, можно установить в EIP адрес инструкции JMP ESP. Когда EIP загрузит этот адрес, CPU выполнит jmp esp и перейдёт к Вашему шелл-коду.
Такое косвенное перенаправление делает эксплойт надёжным независимо от точного адреса стека.
jmp esp ; opcode FF E4Поиск JMP ESP
Ищите в загруженных модулях (желательно без ASLR) байты опкода FF E4. Базовый адрес модуля остаётся постоянным, поэтому этот гаджет надёжен.
Такие инструменты, как mona.py, автоматически находят подходящие инструкции.
!mona jmp -r esp -cpb "\x00"Исключение недопустимых символов
Некоторые значения байтов повреждают входные данные до того, как они целиком попадут в буфер. Классический пример — нулевой байт 0x00, завершающий строки C. К другим относятся 0x0a (перевод строки) и 0x0d (возврат каретки).
Адрес JMP ESP не должен содержать ни одного из этих недопустимых символов.
Определение недопустимых символов
Чтобы определить, какие байты являются недопустимыми, отправьте в буфер все значения байтов от 0x00 до 0xff и изучите память в отладчике. Повреждённые или отсутствующие байты являются недопустимыми символами.
Их нужно исключить и из адреса возврата, и из шелл-кода.
!mona bytearray -cpb "\x00"Формирование перезаписи EIP
Теперь сформируйте входные данные: сначала заполнение до смещения, затем адрес JMP ESP в порядке от младшего байта к старшему.
Если JMP ESP находится по адресу 0x625011AF, записываемые байты идут в обратном порядке.
buf = "A"*offset + "\xaf\x11\x50\x62" # 0x625011AF, little-endianПроверка перехода
Установите точку останова на адресе JMP ESP в отладчике и запустите эксплойт. Когда EIP достигнет этого адреса и перейдёт к ESP, Вы подтвердите надёжность перенаправления.
На этом этапе EIP указывает туда, где будет размещён Ваш шелл-код.
Освобождение места для шелл-кода
После адреса возврата оставшаяся часть буфера (куда указывает ESP) содержит Ваш шелл-код. Если места мало, может потребоваться короткий переход или перемещение данных.
Цепочка NOP (последовательность байтов без операции 0x90) перед шелл-кодом допускает неточность, поэтому переход может попасть в любую её часть.
buf = "A"*offset + ret + "\x90"*16 + shellcodeСборка эксплойта
Теперь полная структура эксплойта выглядит так:
- Заполнение до смещения.
- Адрес JMP ESP (без недопустимых символов, в порядке от младшего байта к старшему).
- Цепочка NOP.
- Шелл-код.
Остался один шаг до командной оболочки.
Альтернативы JMP ESP
JMP ESP — классический способ перенаправления, но не единственный. Если на Ваш буфер указывает другой регистр, можно использовать гаджет jmp eax, call esp или push esp; ret.
Принцип тот же: найдите стабильную инструкцию, которая передаст управление туда, где находится Ваш шелл-код.
Быстрая проверка
Вспомните, почему JMP ESP предпочтительнее жёстко заданного адреса стека.
Повторение
Теперь Вы управляете ходом выполнения:
- Перезаписывайте EIP адресом гаджета JMP ESP, а не ненадёжным адресом стека.
- Находите гаджет в модуле без ASLR, избегая недопустимых символов, таких как
0x00. - Записывайте адрес в порядке от младшего байта к старшему и добавляйте цепочку NOP перед шелл-кодом.
Далее Вы сгенерируете шелл-код и запустите командную оболочку.
Часто задаваемые вопросы
Урок «Управление EIP» бесплатный?
Да — полный текст урока «Управление EIP» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Ethical Hacking Academy, подпишись на CoddyKit PRO. Курс Ethical Hacking Academy содержит 4 уроков всего.
Чему я научусь в уроке «Управление EIP»?
Перезапись адреса возврата Ты практикуешь Ethical Hacking Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Ethical Hacking Academy?
Предыдущий опыт не требуется. Ethical Hacking Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 3 из 4.
Сколько времени занимает урок «Управление EIP»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Ethical Hacking Academy?
Да. Каждый урок Ethical Hacking Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.