现在的位置: 首页 > 综合 > 正文

缓冲区溢出(笔记)

2013年01月26日 ⁄ 综合 ⁄ 共 811字 ⁄ 字号 评论关闭

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

抱歉!评论已关闭.