Часть 39

[Используемые материалы]

У нас остался последний случай эксплуатации переполнения стека с защитами CANARY и DEP для перезаписи SEH.

Мы переименовываем имя исполняемого файла и присоединяемся к нему с помощью IDA, чтобы увидеть, что случиться.

Так же как и раньше, программа закрывается, когда стек заканчивается. Давайте посмотрим её SEH,

Как и в предыдущем случае, программа перезаписывает указатель на гаджет POP - POP - RET. Давайте установим здесь BP.

Я нажимаю клавишу F9 и принимаю исключение.

Здесь, как и всегда стек находится на третьей позиции. Есть указатель на поле NEXT.

Если я исполню инструкции с помощью клавиши F7.

Программа перейдёт на выполнение в стек. Эта инструкция JMP состоит из байтов EB 06 90 90 из поля NEXT, но когда я хочу исполнить эту инструкцию, я получаю ошибку.

Стек не может быть выполнен, потому что здесь есть защита DEP. Нам необходимо запустить ROP.

Проблема заключается в том, что стек переместился для выполнения ROP и наши данные не указаны регистром ESP для продолжения выполнения ROP. Поэтому, в этом случае вместо гаджета POP - POP - RET нам нужен гаджет, который исправляет стек к моменту выполнения инструкции RET этого ГАДЖЕТ. Он берет один из моих адресов стека для того, чтобы вернуть управление, и продолжает выполнение ROP.

Мы видели, что в моем случае, перед выполнением гаджета POP – POP - RET, регистр ESP равен 0xAFEF98

И я буду искать этот адрес в стеке где начинаются мои данные.

Я установил этот адрес, чтобы найти непосредственное значение 0x41414141.

Мы видим, что данные начинается по адресу 0xAFF5A8. Теперь мы можем рассчитать расстояние. Данные находятся ниже ESP.

HEX(0xAFF5A8 - 0xAFEF98)

Таким образом, расстояние между ESP и началом моих данных равно 0x610 байт. Это означает, что если я найду гаджет

ADD ESP, XXXX - RET

Если значение XXXX больше чем 0x610 байт, когда он находится внутри диапазона стека, ESP будет перемещаться туда, где мои данные будут продолжать выполнение ROP.

Давайте посмотрим гаджеты MYPEPE.

Я вижу, что программа добавляет ещё 0x30 байт к ESP. Код не достигнет моего фруктового шеллкода.

К сожалению, у программы нет гаджета или, по крайней мере, я не нашел такой гаджет. Даже используя утилиту AGAFI у меня ничего не получается. Программа приложена к туториалу для тех, кто хочет научиться ей пользоваться.

Я запускаю GISNAP на процессе остановленном после обработки исключения, например на первом POP гаджета POP - POP - RET, без каких-либо действий.

Этот GISNAP будет делать дамп процесса. Затем я должен отредактировать файл OBJECTIVE.TXT программы AGAFI устанавливающей условие, которое мы хотим. В этом случае оно может быть таким.

ESP = [ESP + 0x08]

И мы можем настроить программу только для того, чтобы начать поиск с определенного исполняемого файла, в нашем случае это MYPEPE.DLL.

Я комментирую в файле условие и диапазон, и пишу тот, который мне нужен.

Затем я запускаю AGAFI используя имя дампа, который я сделал раньше, и сохраняю его в ту же папку и с тем же именем.

AGAFI.EXE OBJECTIVE.TXT DUMPED.DMP PEPE.TXT

Программа нашла некоторые редкие гаджеты, но есть одна проблема.

Это то, что происходит после его запуска. ESP снова указывает на SEH и переходит назад на тот же гаджет и разрывается второй раз для значения регистра EBP 0x41414141, которое помещается в регистр ESP в LEAVE - RET.

Хорошо. Чтобы победить защиту и показать, как это сделать, я добавлю инструкцию ADD ESP, XXXX - RET в MYPEPE.

Мы будем использовать это как гаджет для перехода из SEH.

Давайте попробует перейти туда, где программа переставала работать, обработав исключение.

Мы видим, что после выполнения инструкции ADD ESP, 700 я готов продолжить выполнять наш ROP, а затем и сам шеллкод.

Мы видим расстояние, на которое должен идти ROP. Сейчас я нахожусь по адресу ESP = 0xEFF5C0. Давайте посмотрим где начинаются мои данные.

Данные начинаются по адресу 0xEFF4D4. Я могу сделать вычитание и увидеть нужное расстояние.

Я подготавливаю скрипт.

Мы видим, что скрипт использует тот же ROP что и раньше, и добавляет тот же шеллкод для MYPEPE и он работает.

Мы видим, что когда я прихожу в инструкцию RET, ROP остается в стеке с самого начала, чтобы продолжить исполнять ROP и выполнять шеллкод.

Теперь у нас запускается калькулятор.

Автор оригинального текста — Рикардо Нарваха.

Перевод и адаптация на английский язык — IvinsonCLS.

Перевод и адаптация на русский язык — Яша Яшечкин.

Перевод специально для форума системного и низкоуровневого программирования - WASM.IN

08.04.2018

Источник: ricardonarvaja.info

Last updated

Was this helpful?