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