В чем заключается смысл записи переменных стека в восходящем стеке в нисходящем стеке? Например, если у меня есть char buf [200], скажем, по адресу памяти 0x400. Когда я пишу в этот массив, я буду писать от 0x400 до 0x600, что соответствует предыдущим кадрам стека. Это делает программу уязвимой для переполнения буфера, которое может взять под контроль программу, перезаписав указатели возврата и т. Д. Так почему бы просто не записать массив от 0x600 до 0x400?
Направление стека и переполнение буфера
Ответы (1)
Это не имеет значения; когда вы пытаетесь записать более 200 байтов, вы все равно пытаетесь записать по адресу, который не принадлежит массиву (вне границ), следовательно, происходит переполнение буфера.
person
spacehunt
schedule
03.06.2011
я отредактировал свой вопрос. когда вы пишете вниз, вы не можете перезаписать адреса возврата, поэтому злоумышленникам сложнее взять под контроль?
- person extraeee; 04.06.2011
Хотя вы не можете перезаписать собственный адрес возврата текущего стека, сделав это, вы по-прежнему не можете делать никаких предположений о том, что находится рядом с массивом - это может быть указатель на функцию, это может быть другой кадр стека для подпрограммы, которую вызывает ваша функция . Например, рассмотрим
memset(&buf, 300, 0);
.
- person spacehunt; 04.06.2011