Адрес возврата в стеке перед вызовом функции: на какой сегмент указывает адрес возврата? - PullRequest
0 голосов
/ 07 февраля 2019

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

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

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

1 Ответ

0 голосов
/ 07 февраля 2019

Поскольку вы имеете в виду адреса возврата в стеке, я предполагаю, что вы используете вездесущий 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.

...