前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >二进制逆向学习笔记:堆栈图解析汇编中函数调用的过程

二进制逆向学习笔记:堆栈图解析汇编中函数调用的过程

作者头像
Ms08067安全实验室
发布2020-06-16 10:57:26
1.2K0
发布2020-06-16 10:57:26
举报

C语言中的函数

三个关键点:局部变量、参数、函数返回值

下面是示例程序:

代码语言:javascript
复制
#include "stdafx.h" 
int Plus(int x, int y) 
{      
  int z = 2;      
  return x+y+z; }     
  int main(int argc, char* argv[]) 
{      
  int r = Plus(3, 4);      
  return 0; 
}

画堆栈图:

esp:栈顶

ebp:栈底

对于函数调用,先压入参数,再执行call

对于参数,从右向左依次压入堆栈(stdcall模式) 因此,本程式先压入4,再压入3

1.调用前的堆栈

2.PUSH 4 PUSH 3 向栈内压入4,esp -4,eip向下一条向栈内压入3,esp-4,eip向下一条

3. call指令

一般的mov等指令无法改变eip的值,但是call可以call 00401005: a.将eip的值改为函数所在的地址0x00401005 b.将函数的ret address 压入堆栈保存

4.进入函数后,保留现场,划分堆栈

5.PUSH EBP

保留原栈底位置

6.提升堆栈,创建缓冲区

紫色部分即为缓冲区

7.填充缓冲区

LEA EDI,DWORD PTR SS : [EBP - 44] (EDI中存放缓冲区的最顶地址)MOV ECX ,11 MOV EAX , CCCCCCCCREP STOS DWORD PTR ES : [EDI]

8.定义局部变量

一般情况下:ebp - n 是局部变量 ebp +n 是参数 EBP + 4 是返回地址(因此凡是想修改 ebp + 4 的指令都必须小心)

9.执行加法

EAX存放函数返回值

10.恢复堆栈

MOV ESP,EBP

POP EBP 恢复栈底

11.ret指令

将堆栈中函数的返回地址pop到eip中

ADD ESP,8 平衡堆栈

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

本文分享自 Ms08067安全实验室 微信公众号,前往查看

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • C语言中的函数
  • 三个关键点:局部变量、参数、函数返回值
  • 下面是示例程序:
  • 画堆栈图:
  • 1.调用前的堆栈
  • 2.PUSH 4 PUSH 3 向栈内压入4,esp -4,eip向下一条向栈内压入3,esp-4,eip向下一条
  • 3. call指令
  • 4.进入函数后,保留现场,划分堆栈
  • 5.PUSH EBP
  • 6.提升堆栈,创建缓冲区
  • 7.填充缓冲区
  • 8.定义局部变量
  • 9.执行加法
  • 10.恢复堆栈
  • 11.ret指令
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档