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

#stack #buffer-overflow

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

Вопрос:

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

Ответ №1:

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

Комментарии:

1. я отредактировал свой вопрос. когда вы записываете вниз, вы не можете перезаписать адреса возврата, поэтому злоумышленникам сложнее перехватить контроль?

2. Хотя вы не можете перезаписать собственный адрес возврата текущего стека, поступая таким образом, вы все равно не можете делать никаких предположений о том, что находится рядом с массивом — это может быть указатель на функцию, это может быть другой фрейм стека для подпрограммы, которую вызывает ваша функция. Для примера рассмотрим memset(amp;buf, 300, 0); .