Как внедрение кода влияет на стек в этом случае

#assembly

#сборка

Вопрос:

Итак, я пытался внедрить код в задание attack lab, и для фазы 1 все, что требовалось, это ввести любой ввод для точного заполнения буфера массива символов, а затем после него адрес функции «touch1».

Например, если бы буфер имел размер 0x10 байт (не тот, который я получил), тогда я бы написал что-то вроде:

00 00 00 00 00 00 00 00

00 00 00 00 00 00 00 00 (заполнение)

<< вставить адрес touch1

Это работает, как и ожидалось, но проблема на этапе 2, где я должен ввести код для перемещения cookie в%rdi, а затем touch2, я не знаю, почему такая инъекция работает:

<внедрение кода для перемещения файла cookie в %rdi> / * 8 байт */

00 00 00 00 00 00 00 00

00 00 00 00 00 00 00 00 (заполнение)

<< вставить адрес touch2

Этот код имеет 8 дополнительных байтов, затем touch1, но размер буфера остается тем же, и это меня смущает, потому что адрес touch2 заменяет вещи даже выше в стеке, чем обратный адрес.

Похоже, что единственный способ, которым я могу это понять, — это если возврат из функции увеличивает указатель стека на 8 байт, поэтому после запуска введенного кода rip достигает адреса touch2, но тогда адрес touch2 не заменит какой-либо другой, возможно, важный код и может вызвать неопределенное поведение?

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

1. Действительно ли это работает? У вас есть реальный исполняемый файл с реальным кодом для тестирования? Если первый ввод фактически перезаписывает адрес возврата, то и второй ввод должен выполняться, но с нулем .

2. Да, это работает, потому что, когда я запустил 2-й код, он очистил фазу 2 назначения

3. Но у вас нет уязвимого двоичного файла или кода, верно?

4. Да, у меня этого нет

5. Итак, это, вероятно, ложный результат.