Переполнение сохраненного значения регистра RIP с коротким адресом

Я пытаюсь сделать переполнение буфера, где мне нужно переписать сохраненное значение регистра RIP с адресом.

Адрес короткий (8 байт), например, 0x0000000012345678. Регистр RIP составляет 16 байтов, но если я ввожу 0, он завершает строку (потому что буфер переполняется strcpy). Как мне обойти переписывание с коротким адресом без завершения строки?

Я смотрю на значение, устанавливая точку останова на main в gdb, и шагая до тех пор, пока она не скопирует строку, а затем просматриваю сохраненное значение RIP с помощью info frame команда.

Кажется, это будет распространенная проблема, но я думаю, что я не гуглюсь должным образом.

1 ответ

Решение

Регистр RIP составляет 16 байтов,

Там нет текущих процессоров с 128-битными адресами; приведенное выше утверждение является ложным.

Как мне обойти переписывание с коротким адресом без завершения строки?

Используйте что-то кроме strcpy выполнить переполнение.

Мне не разрешено менять код

В этом случае ваша задача "переполниться коротким адресом через strcpyстановится невозможным.

Тем не менее, вы все равно можете достичь конечного результата, сначала переполнив адрес возврата батутом, который указывает, например, memcpy (вы не сказали, какую ОС вы используете, но на Linux, например, memcpy обычно будет иметь "длинный" адрес), а затем, имея memcpy переполнить обратный адрес во второй раз (memcpy не остановлюсь на NUL персонаж).

Эта техника называется возвращением в libc-атаку.

Другие вопросы по тегам