栈溢出 控制程序的执行流程

实验代码

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define PASSWORD "1234567"
int verify_password (char *password)
{
    
    
	int authenticated;
	char buffer[8];
	authenticated=strcmp(password,PASSWORD);
	strcpy(buffer,password);//overflowed
	return authenticated;
}
void main()
{
    
    
	int valid_flag=0;
	char password[1024];
	FILE *fp;
	if(!(fp=fopen("C:\\Documents and Settings\\Administrator\\桌面\\Debug\\password.txt","rw+")))
	{
    
    
		exit(0);
	}
	fscanf(fp, "%s",password);
	valid_flag = verify_password(password);
	if(valid_flag)
	{
    
    
		printf("incorrect password!\n");
	}
	else
	{
    
    
		printf("Congratulation!You have passed the verification");

	}
	fclose(fp);
}


实验目的

简单利用栈溢出漏洞使程序能跳过验证

实验准备

环境:windows xp
编译器:vc++
调试器:OD

实验过程

1.首先把程序拖到OD中,通过查找字符串找到关键对比的函数Cpp1.00401005,还得知了输出正确函数的地址。
在这里插入图片描述
2.发现栈中明显存在着一个溢出点,使用strcpy时未限制长度,因此我们的目标就是覆盖掉位于12FB20的函数返回地址,使函数直接跳到正确的选项。这段代码的验证方式是通过读取文件中的字符串来进行,所以我们可以直接加长文件中字符串的长度来使其覆盖掉该函数的返回地址。在这里插入图片描述
3.修改文件中字符串的长度使其能够把返回地址直接替换成为输出正确的函数的地址

在这里插入图片描述
4.可以看到右下角的栈中12FB24的位置已经替换成输出正确的函数的地址了
在这里插入图片描述
5.然后程序就能成功输出正确结果,但是直接修改没有考虑栈平衡这些东西,因此输出了就直接崩溃了。
在这里插入图片描述

PS:最近在看0day安全:软件漏洞分析技术,准备把上面的洞都复现一遍,有什么错误欢迎指出。

猜你喜欢

转载自blog.csdn.net/Misaka10046/article/details/108591278