Return 函数调用前堆栈中的地址: return 地址指向哪个段?
Return address in stack before function call: To which segment points the return address?
我目前正在学习缓冲区溢出攻击。
我明白这个想法是覆盖 return 地址。
return地址指向函数调用后的语句。我想知道的是:这个指针是否指向程序的文本段?或者它是否指向堆或其他东西?
非常感谢您的帮助!
因为你指的是堆栈上的 return 地址,我假设你在无处不在的 x86_64 上。您可以通过将 call
指令替换为等效的 push
、jmp
和标签(假设 myfn
是叶例程)来自行检查:
push offset RA1
jmp _myfn
RA1:
; Remainder of instructions in the calling code...
当我实际上 assemble 时,我得到以下代码:
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,所以是的,当调用 myfn
时 [esp]
中的 return 地址确实指向 .text
段内。
您认为它还指向其他什么地方? return 地址必须是 call
指令之后的指令地址,与所有其他代码一样,该指令位于 .text
段中。
我目前正在学习缓冲区溢出攻击。 我明白这个想法是覆盖 return 地址。
return地址指向函数调用后的语句。我想知道的是:这个指针是否指向程序的文本段?或者它是否指向堆或其他东西?
非常感谢您的帮助!
因为你指的是堆栈上的 return 地址,我假设你在无处不在的 x86_64 上。您可以通过将 call
指令替换为等效的 push
、jmp
和标签(假设 myfn
是叶例程)来自行检查:
push offset RA1
jmp _myfn
RA1:
; Remainder of instructions in the calling code...
当我实际上 assemble 时,我得到以下代码:
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,所以是的,当调用 myfn
时 [esp]
中的 return 地址确实指向 .text
段内。
您认为它还指向其他什么地方? return 地址必须是 call
指令之后的指令地址,与所有其他代码一样,该指令位于 .text
段中。