#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. Итак, это, вероятно, ложный результат.