Адрес возврата в стеке перед вызовом функции: на какой сегмент указывает адрес возврата?
В настоящее время я учусь на атаках переполнения буфера. Я понимаю, что идея состоит в том, чтобы переписать обратный адрес.
Адрес возврата указывает на оператор, следующий за вызовом функции. Что мне интересно: этот указатель указывает на текстовый сегмент программы? Или это указывает на кучу или что-то еще?
Большое спасибо за вашу помощь!
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
сегмент.