1,寄存器与函数栈帧
每一个函数独占自己的栈帧空间,当前正在运行的函数的栈帧总是在栈顶,win32系统提供了两个特殊的寄存器用于标识位于系统栈顶端的栈帧。
ESP:栈指针寄存器,其内存放着一个指针,该指针永远指向系统最上面一个栈帧的栈顶。
EBP:基址指针寄存器,其内存放着一个指针,该指针永远指向系统最上面一个栈帧的底部。
EIP:指令寄存器,其内存放着一个指针,该指针永远指向一条等待执行的指令地址。
可以说如果控制了EIP寄存器的内容,就控制了进程,我们让EIP指向哪里,cup就去执行哪里的指令。
函数栈帧:ESP和EBP之间的内存空间为当前栈帧,EBP标识了当前栈帧的底部,ESP标识了当前栈帧的顶部。
调用约定声明 | 参入入栈顺序 | 恢复栈平衡的位置 |
__cdecl | 右------>左 | 母函数 |
__fastcall | 右------>左 | 子函数 |
__stdcall | 右------>左 | 子函数 |
一段溢出的小实例:
#include<iostream>
#include<string.h>
using namespace std;
#define PASSWORD "123456"
int flag_pass(char* password)
{
int flag =0;
char buffer[8];
flag = strcmp(password,PASSWORD);
strcpy(buffer,password);
return flag;
}
int main()
{
char password[100];
int flag = 0;
cout<<"请输入密码:"<<endl;
cin>>password;
flag = flag_pass(password);
if(flag == 0 )
cout<<"congratulation! You have passed the verification"<<endl;
else
cout<<"incorrect password!"<<endl;
return 0;
}