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

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

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?

1 Ответ

5 голосов
/ 29 ноября 2011

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

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