C语言函数调用栈的过程

5 篇文章 2 订阅
1 篇文章 0 订阅

前言:

菜鸡总结如有不对,望各位大佬及时指点,以免误人子弟。

下面是以一个具体的程序调用的函数的过程为例进行讲解的,主要涉及到的是为了做 pwn 题准备的。



0x1 :进入函数之前:

首先查看一下程序的伪代码:就是调用一个fun函数来比较三个数值的大小。
在这里插入图片描述

查看一下一下main函数的汇编代码:
在这里插入图片描述

可以发现在调用fun函数之前先进行了传参,注意32位程序和64位程序的传参方式不一样,32位程序是栈传参,而64位优先寄存器传参,寄存器总共有六个:rdi、rsi、rdx、rcx、r8、r9,当参数多于七个时才轮到栈传参。

传参以后就是执行call指令。call指令实际上包含两个指令
在这里插入图片描述
就这里而言应该push的是 0x00000590,然后跳到fun函数里。此时的栈布局应该是这样的:
在这里插入图片描述




0x2 :进入函数时:

跳到fun函数里面,查看一下汇编代码:
在这里插入图片描述
重点讲一下前的三行,基本上每一个程序都有这三个指令,那么它们有什么作用呢?

push ebp: 将主调函数(main函数)的ebp保存下来,为了就是调用完这个函数以后以后跟调用之前的一样。

mov ebp, esp: 将ebp栈底抬上去,什么意思呢?就是之前的ebp的地址不是main函数的吗,而esp是栈顶,随着你的输入输出而改变的,mov指令就是将你的ebp放到最上面。

sub esp,10h: 为新栈开辟一段内存空间,其大小为0x10.

在这里插入图片描述

最终的结果:
在这里插入图片描述



0x3 :退出函数时:

在这里插入图片描述
主要就是两个命令leave和ret命令
在这里插入图片描述

其最终结果为:

在这里插入图片描述

  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值