第二章

内存的不同用途

windows应用—>编译连接—>PE文件—>进程

进程使用的内存

1.代码区:储存着被装入执行的二进制机器代码,处理器会到这个区域取指和执行

2.数据区:用于储存全局变量等。

3.堆区:进程可以在堆区动态请求一定大小的内存空间,用完之后还给堆区。动态分配和回收是堆区的特点。

4.栈区:用于动态的存储函数直接的调用关系,以保证被调用函数在返回时恢复到母函数中继续执行。

栈和系统栈

栈:(后进先出表)

栈的操作:POP(出栈),PUSH(入栈)

标识栈的属性:TOP(栈顶),BASE(栈低)

系统栈(运行栈,调用栈):内存中的栈就是系统栈,系统栈由系统自动维护。

以下代码流程图如表1-1所示:

intfunc_B(int arg_B1)
{
return arg_B1+;
} intfunc_A(int arg_A1)
{
int var_A;
var_A=func_B(arg_A1)+
return var_A;
} int main()
{
int var_main;
var_main=intfunc_A();
}

  代码空间 系统栈空间
1 程序装载进代码空间,在main函数依次取指执行 系统栈站顶为当前执行的main函数
2 执行到main函数的call指令时,跳转到fun_A函数的代码区继续执行 系统栈开辟新的栈帧给fun_A函数使用并压入,此时系统栈栈顶为func_A函数
3 func_A函数执行到call指令时,跳转到fun_B函数的代码区继续执行 系统栈开辟新的栈帧给fun_A函数使用并压入,此时系统栈栈顶为func_B函数
4 func_B函数执行完毕后弹出func_B函数的栈帧,并从中获取到返回值,进入到fun_A函数代码区中继续执行 系统栈弹出func_B的栈帧,系统栈栈顶指针为func_A函数栈帧
5 func_A函数执行完毕后弹出func_A函数的栈帧,并从中获取到返回值,进入到main函数代码区中继续执行 系统栈弹出func_A的栈帧,系统栈栈顶指针此时为main函数栈帧

表1-1 函数调用时系统栈和代码空间的变化

寄存器与函数栈帧

ESP:栈指针寄存器(extended stack pointer),其内存放着一个指针,该指针永远指向系统栈第一个栈帧的栈顶

EBP:基指针寄存器(extended base pointer),其内存放着一个指针,该指针永远指向系统栈第一个栈帧的栈底

EIP  :指令寄存器(extended instruction pointer),其内存放着一个指针,该指针永远指向下一条等待执行的指令地址

函数栈帧:函数栈帧是执行到call指令时开辟的属于函数的栈帧。ESP和EBP之间的内存空间为当前的栈帧,ESP标识了栈帧的栈顶,EBP标识了栈帧的栈底

函数栈帧内容:

  • 局部变量:为函数局部变量开辟的内存空间
  • 函数的返回地址:保存当前函数调用前的“断点”信息——函数调用前的指令位置,以便函数在返回时能恢复到函数调用前的指令位置,并继续执行指令
  • 栈帧状态值:保存前栈帧(前栈帧指的是栈底向下的栈帧)的顶部和底部(实际只保存前栈帧的底部,前栈帧的顶部可以通过对战平衡得到),用于当前栈帧被弹出后恢复上一个栈帧

0day2安全——笔记2的更多相关文章

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

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

  2. 0day2安全——笔记3

    第二章 函数调用约定 不同的操作系统,语言和编译器调用函数的原理差不多,但是具体的调用约定有差异. C语言VC++编译的函数传参顺序如下图所示(默认使用__stdcall调用约定) 函数调用步骤(__ ...

  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. SpringCloud Zuul2.X网关实现服务熔断降级(复制即用)

    版本: <properties> <spring-boot.version>.RELEASE</spring-boot.version> <spring-cl ...

  2. C# 结合 PInvoke 对接 IP 摄像头的笔记

    最近做项目的时候,需要对接厂商提供的 IP 摄像头.但是他们只提供了 C++ 的 SDK,没办法,只能开始撸 C# 的 SDK Helper 类.本篇文章主要记录了对接 C++ DLL 需要注意的几个 ...

  3. Java实现抢红包功能

    采用多线程模拟多人同时抢红包.服务端将玩家发出的红包保存在一个队列里,然后用Job定时将红包信息推送给玩家.每一批玩家的抢红包请求,其实操作的都是从队列中弹出的第一个红包元素,但当前的红包数量为空的时 ...

  4. RESTful 架构风格

    在移动互联网的大潮下,『微服务』的概念也越来越被大家接受并应用于实践,日益增多的web service逐渐统一于RESTful 架构风格,如果开发者对RESTful 架构风格不甚了解,则开发出的所谓R ...

  5. Vue 中的keep-alive 什么用处?

    keep-alive keep-alive是Vue提供的一个抽象组件,用来对组件进行缓存,从而节省性能,由于是一个抽象组件,所以在v页面渲染完毕后不会被渲染成一个DOM元素 <keep-aliv ...

  6. subprocess 的 Popen用法

    使用Popen方法时,需要获取输出内容时可以按如下方法获取: # -*- coding:utf-8 -*- import subprocess cmd = r"ping www.baidu. ...

  7. python实现fibonacci数列的三种方法

    第一种:递归法 def fibo(n): if n < 3: return 1 return fibo(n-1) + fibo(n-2) print(fibo(6)) 第二种:循环 def fi ...

  8. java之List接口(单列集合)

    List接口概述 查询API我们可知:java.util.List 接口继承自 Collection 接口,是单列集合的一个重要分支,习惯性地会将实现了 List 接口的对 象称为List集合.在Li ...

  9. 图解SynchronousQueue原理-公平模式

    SynchronousQueue原理详解-公平模式 一.介绍 SynchronousQueue是一个双栈双队列算法,无空间的队列或栈,任何一个对SynchronousQueue写需要等到一个对Sync ...

  10. Vue小练习 03

    """ 1.有以下广告数据(实际数据命名可以略做调整) ad_data = { tv: [ {img: 'img/tv/tv1.jpg', title: 'tv1'}, ...