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

В основном я использую следующую функцию:

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

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

10
задан Bill the Lizard 18 September 2012 в 16:59
поделиться