2015-04-15 3 views
1

Я работаю над простой атакой переполнения буфера. Программа принимает массив размером 12, который при переполнении явно перезаписывает элементы в стеке, включая указатель возврата. Стек выглядит любит это перед входом I элементов в массив:Не уверен, что изменить адрес возврата в атаку переполнения буфера

0xffffcf80: 0x00000000 0x00000000 0xffffcfa8 0x00209210 
0xffffcf90: 0xffffcfd8 0x00209210 0x003514e0 0x080486a4 
0xffffcfa0: 0xffffcfb4 0x00350ff4 **0xffffcfd8** 0x08048543 

Я один жирным шрифтом я считаю, что обратный адрес. Когда я вводим шестнадцатеричную строку, например: 11 11 11 11 22 22 22 22 33 33 33 33 44 44 44 44 55 55 55 55, а затем я попробовал другую ячейку памяти в качестве последней части записи, чтобы указать обратный адрес в другом месте. Я всегда получаю ошибку незаконной инструкции.

Я пробовал много разных мест памяти, которые получаю от использования команды info frames в gdb, но все они возвращают тот же результат. Я думаю, что мне просто сложно понять концепцию. Я хотел бы получить любое объяснение или помощь, даже если это не связано напрямую с моим вопросом. Заранее спасибо!

+1

Попробуйте скомпилировать вашу программу с помощью '-fno-stack-protector' (для отключения проверки стека стека) и' -fno-PIE' (чтобы отключить рандомизацию местоположения исполняемого кода, так как вы хотите перейти на фиксированный адрес). –

ответ

0

Вам необходимо переписать адрес возврата с адресом кода, который вы хотите запустить.

Этот код может быть либо:

  • существующего кода в двоичный файл - в этом случае вы просто найти адрес для этого
  • код вы предоставляете (с помощью shellcode в буфере вы переполнении например, .) - в этом случае вы используете адрес этого шеллкода

Обратите внимание, что во всех случаях может быть дополнительно обручи, чтобы прыгать через, в виде механизмов защиты (как buffer overflow protections или data execution prevention или ...).

Смежные вопросы