栈是一种LIFO的数据结构,栈支持两种基本操作push和pop,push就是将数据压入栈中,pop就是将栈中的数据弹出并且储存到寄存器或者是内存中
栈的生长是从高地址到低地址的,及从上往下输入数据
pop弹出后,栈中的数据并没有被清空 只是无法直接访问(但是仍然可以访问)
栈帧也是一种栈,(stack frame),他是用来存储调用函数过程中的一些参数,返回值等,栈底的地址最高,用ebp来表示(extended base pointer)栈顶的地址最低 用esp来表示,在栈顶与栈底之间就是栈帧,每次调用一个函数就会形成一个栈帧,调用者叫caller,被调用者叫callee,我们需要在被调用者返回后ebp和esp的值与调用前一致,我们要用栈来保存这些数据
函数的调用:调用者的栈帧有两个,先是将被调用的函数参数压入栈中,接着是将返回地址压入栈中。 被调用的栈帧:首先push一下调用者的ebp,将esp指向ebp,然后move ebp,esp(就是将esp的值赋给ebp,ebp的值就刷新了),
sub esp,0x12:给esp分配空间,
往后赋值即可
函数的返回和调用相反,他是把ebp的值给了esp,然后再释放ebp(开始存的地址是什么pop后就去了哪里),最后 leave ret就是pop+jump,主打一个恢复原状!ebp跑到了最上面 就是调用函数的开头!然后esp会下移以为,因为地址从高到低,所以后移就是上移,这样esp就到了主函数的最下面!
寄存器
安装wmtools:
在虚拟机上打开ubuntu系统,在桌面打开压缩包,在终端解压,进入压缩包,安装 一直回车即可
换源:找一个离自己近的,这样下载速度会比较快