通过main调用_调用函数的过程

本文通过一个简单的程序实例,详细解释了C语言中函数调用的过程,包括调用函数(caller)如何通过栈传递参数给被调用函数(callee),以及函数调用前后的栈帧变化。特别地,文章讨论了函数调用惯例,如何保存返回地址,以及在函数执行完毕后如何恢复执行流程。同时,提到了栈溢出漏洞的概念,指出这种漏洞可能通过覆盖返回地址来控制程序执行路径。
摘要由CSDN通过智能技术生成

5cc6002442524e7aa0926cc8fea428d6.png

前两篇文章介绍了栈帧函数调用约定,这篇文章通过一个简单的程序来具体说明一下调用函数时都经历了哪些步骤。(建议结合着栈帧的介绍和调用约定的介绍这两篇来理解这篇文章,然后通过一个buffer overflow的实例进行深入的理解)。

首先看一下源码,非常简单的一个例子,定义了一个foo()函数,将传入的参数xy的和赋值给z,然后返回zmain()函数中调用了foo()函数,将返回结果赋值给a并打印。

#include <stdio.h>

int foo(int x, int y)
{
    
        int z;
        z = x + y;
        return z;
}

int main(int argc, char* argv[])
{
    
        int a;
        a = foo(5, 6);
        printf("a = %d", a);

}

用pwndbg调试一下,在main函数下断点&

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值