Какой должен быть правильный порядок для построения эксплойта - PullRequest
0 голосов
/ 08 апреля 2020

Недавно я прочитал интересную статью о эксплуатации переполнения стека: https://blog.own.sh/introduction-to-network-protocol-fuzzing-buffer-overflow-exploitation/. Все работает. Но что-то в последнем подвиге остается для меня неясным. Оригинальный эксплойт содержит следующие строки:

eip = "\xd7\x30\x9d\x7c" # 0x7c9d30d7 - jmp esp [SHELL32.dll] (Little endian)
move_esp = "\x81\xc4\xc0\xfd\xff\xff" # add esp,-240h
buf = 'A'*246 # EIP offset from findmsp
buf += eip # EIP overwrite
buf += move_esp
buf += 'C'*8 # Add 8 additional bytes of padding to align the bytearray with ESP
buf += shellcode

По моему мнению, полезная нагрузка НЕ ​​должна быть описана выше " ... EIP + move_esp + 8_byte_padding + шеллкод ". Вместо этого он должен быть в следующем порядке: « ... EIP + 8_byte_padding + move_esp + шеллкод », чтобы инструкция JMP ESP (на которую указывает EIP) могла привести к выполнению кода «move_esp» , Удивительно, но оба варианта работают !!!!

Вторая неочищенная вещь - это необходимость "move_esp" и смещение (240) движения. Автор упоминает, что это необходимо для работы декодера. Но, как я понимаю, шелл-код (включая декодер) остается прямо на вершине стека во время выполнения (после инструкции JMP ESP). Так что, если декодер использует стек, он должен использовать часть стека ниже текущей вершины и не изменит шелл-код.

Может кто-нибудь, пожалуйста, прояснить это?

...