Адрес возврата в стеке перед вызовом функции: на какой сегмент указывает адрес возврата?

В настоящее время я учусь на атаках переполнения буфера. Я понимаю, что идея состоит в том, чтобы переписать обратный адрес.

Адрес возврата указывает на оператор, следующий за вызовом функции. Что мне интересно: этот указатель указывает на текстовый сегмент программы? Или это указывает на кучу или что-то еще?

Большое спасибо за вашу помощь!

1 ответ

Решение

Поскольку вы имеете в виду адреса возврата в стеке, я предполагаю, что вы используете вездесущий x86_64. Вы можете проверить это самостоятельно, заменив call инструкция с ее эквивалентом push, jmpи метка (при условии myfn это листовая рутина):

push offset RA1
jmp _myfn
RA1:
; Remainder of instructions in the calling code...

Когда я на самом деле собираю это, я получаю следующий код:

00401004: 68 0B 10 40 00     push        40100Bh ; RA1
00401009: EB F5              jmp         00401000 ; myfn
0040100B: 33 C0              xor         eax,eax ; next instruction

Теперь 00400000 является базовым адресом по умолчанию для исполняемых файлов в формате MS Windows PE, и для этого конкретного исполняемого файла он говорит, что .text (т.е. код) раздел работает от 00401000 до 0040100D, так что да, адрес возврата в [esp] когда myfn называется действительно точки внутри .text сегмент.

Где еще вы думаете, это может указывать? Обратный адрес должен быть по адресу инструкции сразу после call инструкция, которая, как и весь другой код, идет в .text сегмент.

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