函数调用栈-知识点纠错和补充
前言看完王爽的《汇编语言》后,以及上学期的c语言学习之后,再次深入学习函数调用栈原理时,发现自己的笔记有很多错误和疏漏,所以在此进行纠正和补充。也为了更深入更清晰的学习pwn的基础知识,毕竟pwn追求一个深度,对这些知识点不清晰明了是学不好的。下面的知识都用x86(32位)来进行举例在理解这些的基础上,我们要有几个概念:1:栈这个概念是人来定义的,cpu和内存不知道有“栈”这个概念,cpu只知道一步一步地执行指令2:栈不是一个固定的空间,我们定义栈在哪儿(通过修改ebp、esp的值),有多大(但需要在一开始申请内存,不能超出这个内存,否则覆盖了某些重要的数据/代码,就会让程序崩溃,实际上申请的空间也是很小一块),栈就是怎样的3:栈的模式是从高地址往低地址增长,也可以说压栈是把数据先压入栈(我们用ebp和esp定义的内存范围)这个空间里最高地址的内存单元中,并且遵守小端序的规则
理解几个名词栈帧:函数调用栈在内存中创造出来的临时空间,一个函数调用一个栈帧,函数调用完毕后栈帧自动销毁ebp:寄存器,存放函数栈底的地址的值(永远指向栈底)esp:寄存器,存放函数栈顶的地址的值(永远指向栈顶) ...