【问题标题】:Return address in stack before function call: To which segment points the return address?函数调用前堆栈中的返回地址:返回地址指向哪个段?
【发布时间】:2019-02-07 18:23:57
【问题描述】:

我目前正在学习缓冲区溢出攻击。 我知道这个想法是覆盖返回地址。

返回地址指向函数调用之后的语句。我想知道的是:这个指针是否指向程序的文本段?还是它指向堆或其他东西?

非常感谢您的帮助!

【问题讨论】:

  • 这是高度特定于平台的。返回地址甚至不一定在堆栈上。
  • @EugeneSh。事实上,除了 x86(_64) 之外的大多数架构都使用链接寄存器
  • @GovindParmar 确实(虽然不确定“大多数”)。但显然他们仍然使用堆栈进行嵌套调用。
  • “缓冲区溢出”的目的不是“覆盖返回地址”。这就是缓冲区溢出利用的目的;否则溢出本身只是一个运行时错误。
  • 这里的program是什么意思?文本段?我正在考虑这个数字:google.com/…:

标签: c return buffer-overflow exploit


【解决方案1】:

由于您指的是堆栈上的返回地址,我假设您使用的是无处不在的 x86_64。您可以通过将call 指令替换为等效的pushjmp 和标签(假设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,所以是的,当调用myfn 时,[esp] 中的返回地址确实指向.text 段内。

您认为它还可能指向什么地方?返回地址必须是紧跟在call 指令之后的指令地址,与所有其他代码一样,该指令位于.text 段中。

【讨论】:

    猜你喜欢
    • 2011-02-02
    • 2014-04-21
    • 1970-01-01
    • 2016-01-10
    • 1970-01-01
    • 2017-02-24
    • 1970-01-01
    • 2020-09-23
    相关资源
    最近更新 更多