Как переполнить буфер с конкретным адресом возврата? - PullRequest
0 голосов
/ 16 октября 2018

Вот массив, который мне дали:

  char overflow[16]="\xEF\xBE\xAD\xDE\xEF\xBE\xAD\xDE"
                    "\xEF\xBE\xAD\xDE\xEF\xBE\xAD\xDE";

, а вот адрес: "0x1234B000"

как мне отредактировать массив выше, чтобы переполнить и изменить адрес возвратана новый адрес выше ??

1 Ответ

0 голосов
/ 16 октября 2018

Это действительно зависит от того, что находится в стеке, которое определяет, сколько байтов вы должны перезаписать как минимум.Параметры функции и локальные переменные будут на пути указателя стека, что вы пытаетесь перезаписать правильно?Я бы сказал, переполните его 1k того же самого байтового шаблона и выполните шаг с gdb или другим отладчиком, чтобы получить трассировку стека.

ex1.(Вам нужно записать после массива байты sizeof (int), чтобы добраться до указателя стека.)

void testFunction(int arg0){
  char overflow[16] = {0};
  char HUGE_ARRAY[10000] = {0};// what does the stack look like in this case?  This giant block of memory should be on the stack AFTER your target array
  //do something that allows the user to overflow the overflow array for w/e reason
}

ex2.(вам нужно записать за массив, sizeof (int) байтов + 10000 байтов, чтобы добраться до указателя стека.)

void testFunction(int arg0){
  char HUGE_ARRAY[10000] = {0};// what does the stack look like in this case?  This giant block of memory should be on the stack BEFORE your target array.
  char overflow[16] = {0};
  //do something that allows the user to overflow the overflow array for w/e reason
}

Если вы знаете целевую среду (например, sizeof int), точисло и тип параметров функции, а также число и тип локальных переменных, которые появляются в стеке при вводе функции, указатель стека которой вы пытаетесь перезаписать, тогда вы можете теоретически записать точные байты указателя стека функции.

В качестве альтернативы, вы можете выяснить это, записав 0x00 значений после буфера переполнения и увеличивая расстояние PAST до 16 байтов каждый раз, пока не произойдет ошибка.После того, как вы обнаружите ошибку, вы нашли указатель стека функции.

В общем случае, стек увеличивается, выполняя следующие действия в следующем порядке: адрес возврата-> параметры функции-> locals.

В вашем случае вы можете проверить это, написав больше байтов, чем вам нужно.(будет работать до тех пор, пока <4k было выделено для этого стека функций до того, как в стеке возникнет переполнение) </p>

for (offset = 0; offset < 1000; offset++){
  (int)(*overflow + 4 + offset) = 0x1234B000;
}

GL.

...