0day2安全——笔记2
第二章
内存的不同用途
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的更多相关文章
- 0day2安全——笔记4(修改临界变量)
		第二章 修改临界变量 #include <stdio.h> #include <string.h> #define PASSWORD "1234567" i ... 
- 0day2安全——笔记3
		第二章 函数调用约定 不同的操作系统,语言和编译器调用函数的原理差不多,但是具体的调用约定有差异. C语言VC++编译的函数传参顺序如下图所示(默认使用__stdcall调用约定) 函数调用步骤(__ ... 
- 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包和我当时安装的最新包版本不一致,所以没法按照教材上给出的列 ... 
随机推荐
- Analyze Data 分析数据
			In this lesson, you will learn how to add the Analysis functionality to your application. For this p ... 
- spring4 学习4 spring MVC+mybatis+Mysql
			在前面搭建的基础上,引入新的jar包如下: aopalliance-1.0.jaraspectjweaver-1.8.8.jarmybatis-3.3.0.jarmybatis-spring-1.2. ... 
- Missing associated label more...
			1.加上placeholder,可以为空 2.放在label标签中 
- English: Class Speed
			Xx_Introduce https://www.jianshu.com/p/d1c1b84d89e8 Please protection,respect,love,"China's Int ... 
- Go交叉编译(Go语言Mac/Linux/Windows下交叉编译)
			Go交叉编译(Go语言Mac/Linux/Windows下交叉编译) 2019/11/21 Chenxin 在很多时候,由于开发的方便,会有这样的场景出现,使用Mac开发或使用Windows开发,需要 ... 
- 获取Tekla属性方式
			XmlTextWriter xmlTextWriter = new XmlTextWriter((TextWriter) stringWriter); xmlTextWriter.Formatting ... 
- [PHP] 接口增加recaptcha行为验证
			需要先翻墙创建一个谷歌账户和创建recaptcha验证的网站域名,获取到两个secrecthttps://www.google.com/recaptcha/admin 前端增加html和js代码,例如 ... 
- MySQL常用DDL、DML、DCL语言整理
			DDL ----Data Definition Language 数据库定义语言 如 create procedure之类 创建数据库 CREATE DATABASE [IF NOT EXISTS] ... 
- 【bzoj4671】异或图(容斥+斯特林反演+线性基)
			传送门 题意: 给出\(s,s\leq 60\)张图,每张图都有\(n,n\leq 10\)个点. 现在问有多少个图的子集,满足这些图的边"异或"起来后,这张图为连通图. 思路: ... 
- Java基础 - volatile
			volatile的作用:对与volatile修饰的变量, 1,保证该变量对所有线程的可见性. 2,禁止指令重排序. Java内存模型(JMM) 原子性 i = 2; 把i加载到工作内存副本i,副本i= ... 
