第二章

函数调用约定

不同的操作系统,语言和编译器调用函数的原理差不多,但是具体的调用约定有差异。

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的更多相关文章

  1. 0day2安全——笔记4(修改临界变量)

    第二章 修改临界变量 #include <stdio.h> #include <string.h> #define PASSWORD "1234567" i ...

  2. 0day2安全——笔记2

    第二章 内存的不同用途 windows应用—>编译连接—>PE文件—>进程 进程使用的内存 1.代码区:储存着被装入执行的二进制机器代码,处理器会到这个区域取指和执行 2.数据区:用 ...

  3. 0day2安全——笔记1

    第一章 PE和内存之间的映射 节偏移 文件偏移地址(File Offset Address):数据在PE文件中的地址 装载地址(Image Base):PE装入内存的基地址 虚拟内存地址(Virtua ...

  4. git-简单流程(学习笔记)

    这是阅读廖雪峰的官方网站的笔记,用于自己以后回看 1.进入项目文件夹 初始化一个Git仓库,使用git init命令. 添加文件到Git仓库,分两步: 第一步,使用命令git add <file ...

  5. js学习笔记:webpack基础入门(一)

    之前听说过webpack,今天想正式的接触一下,先跟着webpack的官方用户指南走: 在这里有: 如何安装webpack 如何使用webpack 如何使用loader 如何使用webpack的开发者 ...

  6. SQL Server技术内幕笔记合集

    SQL Server技术内幕笔记合集 发这一篇文章主要是方便大家找到我的笔记入口,方便大家o(∩_∩)o Microsoft SQL Server 6.5 技术内幕 笔记http://www.cnbl ...

  7. PHP-自定义模板-学习笔记

    1.  开始 这几天,看了李炎恢老师的<PHP第二季度视频>中的“章节7:创建TPL自定义模板”,做一个学习笔记,通过绘制架构图.UML类图和思维导图,来对加深理解. 2.  整体架构图 ...

  8. PHP-会员登录与注册例子解析-学习笔记

    1.开始 最近开始学习李炎恢老师的<PHP第二季度视频>中的“章节5:使用OOP注册会员”,做一个学习笔记,通过绘制基本页面流程和UML类图,来对加深理解. 2.基本页面流程 3.通过UM ...

  9. NET Core-学习笔记(三)

    这里将要和大家分享的是学习总结第三篇:首先感慨一下这周跟随netcore官网学习是遇到的一些问题: a.官网的英文版教程使用的部分nuget包和我当时安装的最新包版本不一致,所以没法按照教材上给出的列 ...

随机推荐

  1. 《Dotnet9》系列之建站-Dotnet9建站20天感悟

    本人站点 https://dotnet9.com,建站20天了,在这给站长朋友讲述个人建站经历,希望对大家能有所帮助. https://dotnet9.com 网站采用 宝塔 + WordPress ...

  2. MySQL的多表联查

    1.内连接        规则:返回两个表的公共记录        语法: -- 语法一 select * from 表1 inner join 表2 on 表1.公共字段=表2.公共字段 -- 语法 ...

  3. ARTS改版啦,在改变中前行

    这次打卡,稍微进行了一次改版,在算法和英文文档上进行了拆分,具体的内容在前两天的文章里已经输出,所以在这篇上针对这两块做了一个汇总. 当然,技巧方面的还是在这里先输出,后续再考虑整改吧.循序渐进地上升 ...

  4. SSH框架之Spring第二篇

    1.1 基于注解的IOC配置 既注解配置和xml配置要实现的功能都是一样的,都是要降低程序间的耦合.只是配置的形式不一样. 1.2 环境搭建 1.2.1 第一步:拷贝必备的jar包 需要多拷贝一个sp ...

  5. 从0系统学Android--3.5 最常用和最难用的控件---ListView

    从0系统学Android-- 3.5 最常用和最难用的控件---ListView 本系列文章目录:更多精品文章分类 本系列持续更新中.... 3.5 最常用和最难用的控件---ListView Lis ...

  6. android sdk tools里找不到draw9patch.bat 如何制作.9.png 格式图片

    1.什么是.9.png格式 .9.png格式的图片可以在安卓平台指定拉伸区域,防止图片失真,一般用作背景图. 2.前提 最近项目中要用到.9.png格式图片,想着这个简单使用draw9patch.ba ...

  7. Redis中的Scan命令的使用

    Redis中有一个经典的问题,在巨大的数据量的情况下,做类似于查找符合某种规则的Key的信息,这里就有两种方式,一是keys命令,简单粗暴,由于Redis单线程这一特性,keys命令是以阻塞的方式执行 ...

  8. Windows自动执行应用程序或脚本(可以通过写bat文件定时关机等)

    1. Windows每天定时执行某个应用程序 1.1 右键我的电脑选择管理,并选择任务计划程序,如下 演示 --- 1.2 创建基本任务 演示 1.3 Windows每天定时关机设置参数 演示 1. ...

  9. Samba安装及配置

    samba 可以实现Windows对Windows . Windows对Linux.Linux对Linux的文件传输 在centos7安装samba yum install samba 启动samba ...

  10. js中获取当前url路径

    可以使用 window.location 获取当前页面url.以下是一些简单应用. <script> $(function(){ // 返回 web 主机的域名,如:http://127. ...