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

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

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

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

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

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

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 не работает, а основной обнаруживает, что 0x12345678 не находится на -0x10 (% ebp), Как отключить% ebp?

Ответ 1

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

  • вычислить смещение% ebp из% esp
  • прочитайте значение, хранящееся в этой ячейке памяти, и сохраните для себя
  • сделай свой эксплойт
  • восстановить старое значение% ebp, сохраненное на шаге 2
  • RET