c – 函数堆栈是否保存返回地址?

c – 函数堆栈是否保存返回地址?,第1张

概述我正在使用系统 Linux x86学习基于程序集的函数堆栈. 我读过一些文章,它告诉我函数堆栈(被调用者)将保存调用者调用它的返回地址,以便计算机可以知道函数返回时的继续点. 这就是为什么会有一种攻击:堆栈粉碎. 堆栈粉碎意味着如果我们可以溢出函数堆栈,特别是溢出带有设计地址的返回地址,程序将执行黑客代码. 但是,今天我正在尝试使用gdb检查一个简单的c程序,如下所示,但我找不到任何函数堆栈中保存 我正在使用系统 Linux x86学习基于程序集的函数堆栈.

我读过一些文章,它告诉我函数堆栈(被调用者)将保存调用者调用它的返回地址,以便计算机可以知道函数返回时的继续点.

这就是为什么会有一种攻击:堆栈粉碎.
堆栈粉碎意味着如果我们可以溢出函数堆栈,特别是溢出带有设计地址的返回地址,程序将执行黑客代码.

但是,今天我正在尝试使用gdb检查一个简单的c程序,如下所示,但我找不到任何函数堆栈中保存的返回地址.
这是代码:

voID func(int x){    int a = x;    int b = 0;  // set a breakpoint}int main(){    func(10);  // set a breakpoint    return 0;}

然后我使用gdb来获取它的程序集:

主要:

FUNC:

现在我们可以看到在两个函数堆栈中没有保存返回地址(至少这是我的观点).

如果一个黑客想用堆栈粉碎破解这个程序,那么函数堆栈中的哪个地址会被他非法编辑?

解决方法

Now we can see that there is no return address being saved in the two function stacks (at least this is my vIEw).

你实际展示的是反汇编的代码,而不是堆栈.

返回地址由调用者通过callq指令在堆栈上推送.在进入被调用函数时,它位于堆栈的顶部,即:此时,rsp包含存储返回地址的地址.

用GDB检查堆栈

> p / x $rsp显示rsp寄存器的值,即:堆栈顶部的地址,因为rsp指向堆栈的顶部.
> x / x $rsp显示位于堆栈顶部的内存内容(即:位于rsp指向的地址的内容).

记住这些信息,您可以在进入被调用函数时(在将任何其他内容推入堆栈之前)运行命令x / x $rsp以获取返回地址.

您还可以使用命令info frame来检查当前堆栈帧.名称已保存rip的显示字段对应于当前函数的返回地址.但是,您需要在创建当前函数的堆栈帧之后以及在它被销毁之前运行此命令(即:在mov%rsp,%rbp之后但在被调用者内部的pop%rbp之前).

总结

以上是内存溢出为你收集整理的c – 函数堆栈是否保存返回地址?全部内容,希望文章能够帮你解决c – 函数堆栈是否保存返回地址?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/1243994.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-06
下一篇 2022-06-06

发表评论

登录后才能评论

评论列表(0条)

保存