Я хочу понять точную разницу между этими двумя типами атак. Из того, что я прочитал:
Переполнение буфера: он перезаписывает адрес ret в стеке, чтобы указать на другой раздел кода, в который вставлен вредоносный код. Так эффективно - здесь нам нужно изменить исходный код программы, чтобы фактически выполнить атаку.
Вернитесь к Libc- Вместо того, чтобы изменять исходный код, используются вызовы времени выполнения, предоставляемые библиотекой C (чтобы открыть оболочку). Здесь параметры, используемые для вызова функции, также передаются в буфере перезаписи, заканчивающемся после ret-части стека.
Является ли приведенное выше точное описание?
И еще один связанный с этим вопрос - возможно ли иметь переполнение буфера без фактического изменения исходного кода исходной программы? Возможно, если мы напишем новую программу и разрешим это изменять некоторые разделы памяти (это новый адрес ret в поврежденном стеке исходной программы). С другой стороны, я думаю, что это может быть невозможно из-за защиты памяти между процессами в ядре.