Переполнение сохраненного значения регистра 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-атаку.