博客网址:www.shicoder.top
微信:18223081347
欢迎加群聊天 :452380935
这个分栏我们开始学习PWN,当然PWN也是自己的兴趣爱好,所以可能博客更新较慢,不好意思啦
前置知识
每个函数都有自己的栈帧,栈底用ebp
,栈顶用esp
,还有一个eip
,表示即将执行的指令的地址,下面是栈的图示,是从高地址向低地址增长
函数的栈帧包括
- 函数的返回地址和参数
- 本地变量
- 调用前后上下文
因此比如一个main
函数执行时候,ebp
指向其栈帧底部,然后在函数运行时候随时push
和pop
,导致其esp
不断变化,当要调用子函数func
时候,会先push
子函数所需要的参数,然后进入func
之后,首先push ebp
,因为此时的ebp
是main
函数的,为了在func
函数结束后,找到main
函数的ebp
,所以先保留,然后mov ebp,esp
,这时候ebp
就会被赋予新的值,这个值就是func
函数栈帧的底部,然后就是一些func
函数自己的操作,当要使用传进来的参数时候,就去当时在main
调用func
前push
的参数去取,当执行func
函数之后,需要返回到main
,此时分两种情况
func
中没有使用过局部变量,则进入func
之后,ebp
和esp
始终是一样的,所以直接pop ebp
,此时ebp
中就存放了call
调用前,main
的ebp
func
中使用过局部变量,则进入func