0day2安全——笔记3
第二章
函数调用约定
不同的操作系统,语言和编译器调用函数的原理差不多,但是具体的调用约定有差异。

C语言VC++编译的函数传参顺序如下图所示(默认使用__stdcall调用约定)

函数调用步骤(__stdcall约定)
1. 参数入栈:将参数从右向左依次压入系统栈中
2. 返回地址入栈:将当期代码区调用指令的下一条指令地址压入栈中,供函数返回时继续执行
3. 代码区跳转:处理器从当前代码区跳转到被调用函数的入口处
4. 栈帧调整:
- 保存当前栈帧状态值:已被后面回复本栈帧使用(EBP入栈)
- 将当前栈帧切换到新栈帧(将ESP值装入EBP,更新栈帧底部)
- 给新栈帧分配空间(把ESP减去所需要空间的大小,抬高栈帧)
ASM
push 参数3 ;从右到左依次传参
push 参数2
push 参数1
call 函数地址 ;1.向栈中压入当前指令在内存中的位置,即保存返回地址
;2.跳转到所调用函数的入口地址
push ebp ;保存旧栈帧的底部
mov ebp,esp ;设置新栈帧的底部(栈帧切换)
sub esp,xxx ;设置新栈帧的顶部(抬高栈帧,为新栈帧开辟空间)
函数调用时系统栈发生的变化

函数返回步骤(__stdcall约定)
1. 保存返回值:通常将函数的返回值保存在寄存器EAX(累加寄存器)中
2. 弹出当前栈帧,恢复上一个栈帧
- 在堆栈平衡的基础上,给ESP加上栈帧的大小,降低栈顶,回收当前栈帧的空间
- 将当期栈帧底部保存的前栈帧ESP值弹如EBP寄存器,恢复出上一个栈帧
- 将函数返回地址弹给EIP(指令寄存器)
ASM
add esp,xxx ;降低栈顶,回收当前栈帧
pop ebp ;将上一个栈帧底部位置恢复到ebp
retn ;1.弹出当前栈帧元素,即弹出栈帧中的返回地址,至此栈帧的恢复工作完成
;2.让处理器跳转到弹出的返回地址,恢复到调用前的代码区
0day2安全——笔记3的更多相关文章
- 0day2安全——笔记4(修改临界变量)
第二章 修改临界变量 #include <stdio.h> #include <string.h> #define PASSWORD "1234567" i ...
- 0day2安全——笔记2
第二章 内存的不同用途 windows应用—>编译连接—>PE文件—>进程 进程使用的内存 1.代码区:储存着被装入执行的二进制机器代码,处理器会到这个区域取指和执行 2.数据区:用 ...
- 0day2安全——笔记1
第一章 PE和内存之间的映射 节偏移 文件偏移地址(File Offset Address):数据在PE文件中的地址 装载地址(Image Base):PE装入内存的基地址 虚拟内存地址(Virtua ...
- git-简单流程(学习笔记)
这是阅读廖雪峰的官方网站的笔记,用于自己以后回看 1.进入项目文件夹 初始化一个Git仓库,使用git init命令. 添加文件到Git仓库,分两步: 第一步,使用命令git add <file ...
- js学习笔记:webpack基础入门(一)
之前听说过webpack,今天想正式的接触一下,先跟着webpack的官方用户指南走: 在这里有: 如何安装webpack 如何使用webpack 如何使用loader 如何使用webpack的开发者 ...
- SQL Server技术内幕笔记合集
SQL Server技术内幕笔记合集 发这一篇文章主要是方便大家找到我的笔记入口,方便大家o(∩_∩)o Microsoft SQL Server 6.5 技术内幕 笔记http://www.cnbl ...
- PHP-自定义模板-学习笔记
1. 开始 这几天,看了李炎恢老师的<PHP第二季度视频>中的“章节7:创建TPL自定义模板”,做一个学习笔记,通过绘制架构图.UML类图和思维导图,来对加深理解. 2. 整体架构图 ...
- PHP-会员登录与注册例子解析-学习笔记
1.开始 最近开始学习李炎恢老师的<PHP第二季度视频>中的“章节5:使用OOP注册会员”,做一个学习笔记,通过绘制基本页面流程和UML类图,来对加深理解. 2.基本页面流程 3.通过UM ...
- NET Core-学习笔记(三)
这里将要和大家分享的是学习总结第三篇:首先感慨一下这周跟随netcore官网学习是遇到的一些问题: a.官网的英文版教程使用的部分nuget包和我当时安装的最新包版本不一致,所以没法按照教材上给出的列 ...
随机推荐
- tomcat的jsp页面超过65535,导致500报错
错误信息 org.apache.jasper.JasperException: Unable to compile class for JSP: An error occurred at line: ...
- 一起学SpringMVC之文件上传
概述 在Web系统开发过程中,文件上传是普遍的功能,本文主要以一个简单的小例子,讲解SpringMVC中文件上传的使用方法,仅供学习分享使用,如有不足之处,还请指正. 文件上传依赖包 如下所示,文件上 ...
- Windows CLI命令
目录 Windows CLI命令 1.背景 2.netstat 罗列端口号占用情况 3.telnet 远端IP的某个端口号 Windows CLI命令 1.背景 在Windows操作系统下开发,需要用 ...
- SpringBoot系列随笔 - BootJar的启动方式
前言 写完maven的加密插件后,尝试在boot启动时的类加载过程中编写解密代码时,发现了一个平常没有注意的地方. 那就是boot-jar的启动方式与我们平常编写的可执行jar是存在很大差别的. 所以 ...
- xshell破解
1.下载注册版本 第一步.打开netsarang公司的官方中文网站,https://www.netsarang.com/zh/all-downloads,选择Xshell6下载 第二步.选择试 ...
- ES6 ... 展开&收集运算符
...展开&收集运算符,也就是说他可以干两件事情,展开和收集 一:收集,顾名思义把散列东西收集到一个地方,这个地方ES6规定收集在数组中 例如:下面函数fn将传递的参数收集在arg变量中,打印 ...
- CentOS 安装nginx服务
安装nginx服务 sudo yum install nginx 启动nginx systemctl start nginx 加入启动项 systemctl enable nginx 测试nginx服 ...
- ORA-17627: ORA-12577:关于文件存储满的问题
问题描述:搭建DG的时候,要rman从orcl恢复到orclstd数据库来,dup复制了半天,结果最后报错:ORA-17627: ORA-12577: Message 12577 not found; ...
- Vm虚拟机最小化安装linux并配置NAT网络连接(全图)
- 闲话复数(1) | 不现实的虚数 i 为什么虚?它长成什么样?
原文 | https://mp.weixin.qq.com/s/y-Nb3S508UZuf_0GtRuNaQ 复数的英文是complex number,直译是复杂的数.最早接触复数大概是在高中时期,只 ...