Направление стека и переполнение буфера

В чем заключается смысл записи переменных стека в восходящем стеке в нисходящем стеке? Например, если у меня есть char buf [200], скажем, по адресу памяти 0x400. Когда я пишу в этот массив, я буду писать от 0x400 до 0x600, что соответствует предыдущим кадрам стека. Это делает программу уязвимой для переполнения буфера, которое может взять под контроль программу, перезаписав указатели возврата и т. Д. Так почему бы просто не записать массив от 0x600 до 0x400?


person extraeee    schedule 03.06.2011    source источник


Ответы (1)


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

person spacehunt    schedule 03.06.2011
comment
я отредактировал свой вопрос. когда вы пишете вниз, вы не можете перезаписать адреса возврата, поэтому злоумышленникам сложнее взять под контроль? - person extraeee; 04.06.2011
comment
Хотя вы не можете перезаписать собственный адрес возврата текущего стека, сделав это, вы по-прежнему не можете делать никаких предположений о том, что находится рядом с массивом - это может быть указатель на функцию, это может быть другой кадр стека для подпрограммы, которую вызывает ваша функция . Например, рассмотрим memset(&buf, 300, 0);. - person spacehunt; 04.06.2011