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

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

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

Когда я запускаю основную программу, функция выполняется 5 раз, и каждый раз меняется местоположение buf и местоположение %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?


person michael60612    schedule 12.10.2011    source источник
comment
Нельзя ли вычислить %ebp как смещение от %esp? т.е. восстановить %ebp не с помощью movl непосредственного адреса, а скопировав %esp в %ebp и добавив к нему смещение?   -  person pmdj    schedule 01.11.2011
comment
Какие флаги компилятора вы используете, какой компилятор. Можете ли вы предоставить полную программу и код эксплойта?   -  person Stellarator    schedule 11.11.2011
comment
Школа, дающая домашнее задание по эксплойту буфера... Респект!   -  person Sedat Kapanoglu    schedule 25.01.2012


Ответы (1)


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

  1. рассчитать смещение %ebp от %esp
  2. прочитать значение, хранящееся в этой ячейке памяти, и сохранить для себя
  3. сделай свой подвиг
  4. восстановить старое значение %ebp, сохраненное на шаге 2
  5. рет
person dbeer    schedule 29.11.2011