Формат атаки переполнения буфера - PullRequest
7 голосов
/ 13 марта 2011

Обычно мы все видим базовый формат переполнения буфера, который имеет: - NOPs + shellcode + return_address

Почему мы не используем NOPs + return_address + shellcode?, где мы указываем адрес возврата на начало шелл-кода?

Я предполагаю, что это потому, что мы можем пытаться записывать данные вне сегмента стека, если уязвимость находится в main ().Я прав?Если да, то единственная ли это причина?

О, и да, я не имею в виду другие виды атак, которые используют return-to-libc, ptrace и т. Д .;Я просто хочу знать, почему самая основная атака переполнения буфера демонстрируется первым, а не вторым повсюду.

1 Ответ

10 голосов
/ 13 марта 2011

Обратный адрес может быть до shellcode+nop sled или после.Например, если вы пишете в переменную, закрывающую верхушку стека, вам, возможно, придется написать nop sled+shell code после адреса возврата (EIP), потому что может не хватить места.

Однако сани NOP всегда будут рядом с кодом оболочки.Причина в том, что вы используете nop-сани, чтобы сделать цель вашего шелл-кода максимально большой.Если ваш EIP указывает + = 100 байт из кода вашей оболочки, то вам нужно использовать nop-сани размером более 100 байт, чтобы гарантировать, что вы достигнете своей цели.Таким образом, NOPs + return_address + shellcode недействительно.Обычная строка эксплойта будет выглядеть следующим образом:

JUNK + return_address + NOPs + shellcode

И, конечно же, атака в стиле "return-to-libc" не требует шелл-кода или nop-салазок.

Этот упрощенный эксплойт, основанный на переполнении буфера, не будет работать в современной системе.Разрушение Alpeh-One Stack For Fun и Прибыль больше не работает из-за зон NX, канареек стека и ASLR, которые по умолчанию установлены в Windows и Linux.

Вы должны получить копию:

enter image description here

...