В основном, функция, которую я использую, такова:
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.
Проблема заключается в том, что когда программа выполняется во 2-й раз,% ebp находится по адресу, который на 0x10 меньше его предыдущего адреса, поэтому мой способ развращения% ebp не работает, и main обнаруживает, что 0x12345678 не работаетпри -0х10 (% отн.).Как мне разложить% ebp?