Это действительно зависит от того, что находится в стеке, которое определяет, сколько байтов вы должны перезаписать как минимум.Параметры функции и локальные переменные будут на пути указателя стека, что вы пытаетесь перезаписать правильно?Я бы сказал, переполните его 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.