前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >函数在栈中的调用过程

函数在栈中的调用过程

作者头像
Elapse
发布2020-08-17 11:40:14
3.9K0
发布2020-08-17 11:40:14
举报
文章被收录于专栏:E条咸鱼

本篇原创作者:Rj45

背景

1、代码

2、编译

代码语言:javascript
复制
sudo gcc stack.c -o stack -m32

反调试

gdb

代码语言:javascript
复制
gdb stack

objudmp

代码语言:javascript
复制
objudmp -d stack -M intel

栈特点

栈是一种线性存储的数据结构,向下增长。其存在栈底和栈顶,栈对其中的数据元素有进栈和出栈的操作,遵循‘First In last Out’即FILO原则。

分析

1、main函数

代码语言:javascript
复制
0804842d <main>:
 804842d:    8d 4c 24 04             lea    ecx,[esp+0x4]
 8048431:    83 e4 f0                and    esp,0xfffffff0
 8048434:    ff 71 fc                push   DWORD PTR [ecx-0x4]
 //
 8048437:    55                      push   ebp  //将ebp压入栈
 8048438:    89 e5                   mov    ebp,esp  //将esp压入栈
 804843a:    51                      push   ecx  //将ecx压入栈
 804843b:    83 ec 04                sub    esp,0x4  //抬高栈帧
 804843e:    83 ec 08                sub    esp,0x8//    抬高栈帧
 8048441:    6a 14                   push   0x14 //压入参数20
 8048443:    6a 0a                   push   0xa  //压入参数10
 8048445:    e8 c1 ff ff ff          call   804840b <Add>    //调用Add函数
 804844a:    83 c4 10                add    esp,0x10 //调整栈帧
 804844d:    b8 00 00 00 00          mov    eax,0x0  //清空eax
 8048452:    8b 4d fc                mov    ecx,DWORD PTR [ebp-0x4]  //将[ebp-0x4]内的数据赋给ecx
 8048455:    c9                      leave   //mov esp,ebp;pop ebp
 8048456:    8d 61 fc                lea    esp,[ecx-0x4]    //取[ecx-0x4]中的数据赋给esp
 8048459:    c3                      ret //pop eip
 804845a:    66 90                   xchg   ax,ax
 804845c:    66 90                   xchg   ax,ax
 804845e:    66 90                   xchg   ax,ax

2、Add函数

代码语言:javascript
复制
0804840b <Add>:
 804840b:    55                      push   ebp  //将ebp压入栈
 804840c:    89 e5                   mov    ebp,esp  //将esp压入栈
 804840e:    83 ec 08                sub    esp,0x8//    抬高栈帧
 8048411:    8b 55 08                mov    edx,DWORD PTR [ebp+0x8]  //将[ebp+0x8]压入edx
 8048414:    8b 45 0c                mov    eax,DWORD PTR [ebp+0xc]  //将[ebp+0xc]压入eax
 8048417:    01 d0                   add    eax,edx  //将eax与edx中的内容相加赋给eax
 8048419:    83 ec 08                sub    esp,0x8  //抬高栈帧
 804841c:    50                      push   eax  //将eax压入栈
 804841d:    68 e0 84 04 08          push   0x80484e0    //压入x+y=
 8048422:    e8 b9 fe ff ff          call   80482e0 <printf@plt> //调用printf函数
 8048427:    83 c4 10                add    esp,0x10 //调整栈帧
 804842a:    90                      nop
 804842b:    c9                      leave
 804842c:    c3                      ret

3、图示

这是一张函数在栈中的调用过程图

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-10-01,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 E条咸鱼 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 本篇原创作者:Rj45
  • 背景
  • 反调试
  • 栈特点
  • 分析
相关产品与服务
对象存储
对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档