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; }