您好,我正在分析返回libc攻击的过程,发现一个有用的website,其中的图表显示了为返回libc攻击而设计的缓冲区溢出的之前(右侧)和之后(左侧)。返回地址被系统地址覆盖。
我不完全了解函数结尾的执行顺序。在函数返回到system()的地址之前,是否将保存的ebp
的值弹出到ebp
中?我读过“功能结语是在功能终止时执行的”。该功能在什么时候完全终止?我认为这不是在调用system()
之前,因为这意味着包含4 crappy bytes
的覆盖保存的ebp将存储在ebp
中。但我想确定。任何帮助深表感谢。
答案 0 :(得分:1)
我不完全了解功能的执行顺序 结语。保存的
ebp
的值会在ebp
之前弹出吗? 函数返回到system()的地址吗?
是的。返回到返回地址是可以合理地认为是函数而不是调用者的动作的最后一个动作。
我已经读过 “功能结尾是在功能终止时执行的”。在 该功能到底在什么时候终止?
什么功能?您还没有提出。但是用一般的C术语来说,函数在执行return
语句时或函数体中最后一条语句的执行完成时终止。这是文档所指的“终止”。
我认为不是 致电
之前system()
那么,惊喜!整个问题在于,在函数终止后执行的函数 epilogue 使控制权转移到system()
函数的入口点。但是请注意,正确解释这一点需要分开的观点。函数终止是特定于函数的,最好根据函数的源代码进行定义。另一方面,结语在源代码中没有表示形式-它包含编译器插入的额外机器指令,以实现源语言的函数返回语义。
因为这将意味着覆盖已保存 包含4个cr脚字节的ebp将存储在ebp中。
是的,但是没关系,因为esp
的设置正确。然后控制跳到system()
的入口点,函数序言将esp
设置为新的ebp
,并设置了新的esp
。因此,该函数具有有效的堆栈边界,因此可以正确运行。 system()
返回时可能会发生不好的事情,因为返回地址是由4个糟糕的字节确定的,但是我们不在乎-我们会在要引起{{ 1}},以便在system()
返回之前提供给我们。
答案 1 :(得分:-1)
函数在以下情况终止: