滴水三期:day07.1-函数堆栈图2

一、函数

  • 计算机的函数,是一个固定的一个程序段,或称其为一个子程序,它在可以实现固定运算功能的同时还带有一入口和一个出口,所谓的入口,就是函数所带的各个参数,我们可以通过这个入口,把函数的参数值代入子程序,供计算机处理,所谓出口,就是指函数的计算结果,也称为返回值,在计算机求得之后,由此口带回给调用它的程序。(参数和返回值不是必须的)

  • 汇编中的函数入口:

    image-20211201085526590

    不是函数入口这有多少个push此函数就有多少参数!用这里判断,不准确。后面会学习从哪里判断参数有多少

  • 汇编中的函数:

    image-20211201085403153
  • 函数的出口:

    image-20211201090402155
  • 注意:函数传参不是只能用堆栈传(push),也可以用其他方式,比如直接在内存中找到这个数等;返回值也不是只能用eax传,也可以直接存到内存中等,不能形成思维定式。

二、windows堆栈

1.特点

  • 先进后出
  • 向低地址扩展(比如push一个数,栈顶指针会-4)

2.堆栈平衡

  • windows中的堆栈就是一块普通的内存,主要用来存储一些临时的数据和参数等,但是当一个程序使用完堆栈,一定要将堆栈恢复成原来的样子:即函数使用前后栈顶和栈底不发生变化,这个过程就是堆栈平衡
  • 但是提升堆栈时此函数使用存储的数据会被遗留在内存中,因为C没有自动回收机制

三、嵌套函数堆栈图

  • 逆向的程序为stack.exe

    image-20211201180300879

  • 该函数的起始地址为0x0040d518,用OD打开将函数定位到此地址,设置断点f2,并将CPU执行到此处f9,开始画

  • 堆栈图详见:https://edimadezhou-typora.oss-cn-chengdu.aliyuncs.com/%E5%B5%8C%E5%A5%97%E5%87%BD%E6%95%B0%E5%A0%86%E6%A0%88%E5%9B%BE.xlsx

  • 要说明的内容是:

    • 提升堆栈,提升多少个空间,是编译器自己决定,只要能够函数用即可,一般为0x40,0x44,0x48等(根据该函数需要的局部变量大小等来决定)

    • 内部嵌套的函数内部功能执行完后,会有这么几条指令:

      add esp, 48		
      cmp ebp, esp     -->此时ZF位变为1		
      call 004010B0		
      
      --->跳转到004010B0
      jnz short 004010B3	  #此时由于标志寄存器的ZF位为1,则不会执行jnz指令跳转,而是接着执行retn语	
      retn		
      …下面就是检查到堆栈不平衡的报错功能指令,不用管	
      

      这里编译器会自动加一个函数,不是我们写代码手写的函数,这个函数的作用是检查堆栈是否平衡:如果堆栈平衡,则会retn;如果不平衡就会执行下面的代码,大概就是一个错误提示的功能。因为我们使用了嵌套函数,编译器害怕堆栈出错,所以会自动检查一下。这个功能在debug版中有,但是再release发行版中没有

    • 其他的嵌套函数的过程分析和单个函数差不多,都是将要使用的参数压入栈、存入返回地址、保存栈底、提升堆栈(缓冲区)、保留现场、填充缓冲区、执行功能指令(函数的功能)、如果有嵌套函数就把嵌套函数要使用的参数再存入堆栈、再调用内部函数存入返回地址、又会再为此内部函数提升堆栈…其中如果函数的返回值要被其他函数使用或者最终返回,都会将结果存到eax寄存器中,存不下就存到内存

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值