Необходимо использовать переполнение буфера. Не можете понять, как разорвать стек после выполнения кода эксплойта?

В основном функция, которую я использую, такова:

int getbufn()
{
     char buf[512];
     Gets(buf);
     return 1;
}

Когда я запускаю основную программу, функция выполняется 5 раз, и каждый раз меняется местоположение буфера, а также местоположение%ebp. То, что я должен сделать, это поместить определенное шестнадцатеричное значение, скажем, 0xFFFFFFFF, в переменную, и основная программа каждый раз проверяет, есть ли эта переменная. Если это так, он выполняется снова, пока все 5 раз не будут выполнены, и программа завершится спокойно.

У меня проблема в том, что перед проверкой шестнадцатеричного значения есть проверка на другое постоянное значение, скажем, 0x12345678. Если я испортил 0x12345678 и его там нет, программа взорвется.

Я выяснил, что 0x12345678 хранится в -0x10(%ebp), поэтому я знаю, что он основан на%ebp, и я знаю адрес%ebp каждый раз, но я могу заставить эксплойт работать только в первый раз. Я делаю это, используя в основном 496 байтов и имея этот машинный код в байтовом формате:

mov  0xFFFFFFFF, %eax
movl address old ebp, %ebp
push correct return adress in function main
ret

в итоге получается 5 слов и байт для длинного возврата, который я заполняю 0x313131, чтобы сделать его длинным 6 слов. На данный момент моя строка эксплойта имеет длину 520 байт, что в точности соответствует размеру буфера ниже%ebp, поэтому я добавляю адрес старого ebp и адрес где-то внутри моего nopsled, перезаписывая текущее значение в%ebp, а также возврат адрес для getbufn.

Проблема заключается в том, что когда программа выполняется во второй раз,%ebp находится по адресу, который на 0x10 меньше его предыдущего адреса, поэтому мой способ разложения%ebp не работает, и main обнаруживает, что значение 0x12345678 не равно -0x10(%ebp). Как мне разложить%ebp?

1 ответ

Решение

pmjordan прав, вы должны быть в состоянии вычислить, где% ebp по отношению к% esp. Помните,% esp - это ваш текущий указатель стека, а% ebp - это место, где указатель вашего стека был для предыдущей функции. Вместо статического% ebp вам нужно иметь динамический, рассчитанный из%esp (или просто посмотреть, что хранится в памяти, расположенной в% esp, смещенной переменными стека). Псевдокод будет выглядеть примерно так:

  1. рассчитать смещение% ebp от% esp
  2. прочитать значение, хранящееся в этом месте памяти и сохранить для себя
  3. сделай свой подвиг
  4. восстановить старое значение% ebp, сохраненное на шаге 2
  5. RET
Другие вопросы по тегам