栈溢出 代码植入

实验代码

#include<stdio.h>
#include<windows.h>
#define PASSWORD "1234567"
int verify_password(char *password)
{
    
    
	int authenticated;
	char buffer[44];
	authenticated = strcmp(password,PASSWORD);
	strcpy(buffer,password);//overflowed
	return authenticated;
}
void main()
{
    
    
	int valid_flag=0;
	char password[1024];
	FILE *fp;
	LoadLibrary("user32.dll");
	if(!(fp = fopen("C:\\Documents and Settings\\Administrator\\桌面\\cpp2\\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!\n");
	}
	fclose(fp);
}

实验目的

简单利用栈溢出漏洞使程序能弹出指定窗口

实验准备

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

实验过程

1.前面跟上一个实验一样,先找到字符串拷进去的位置位于12FAF0。观察12FB1C的值,函数的判断结果就存放在里面,如果相同则为NULL。我们可以先用字符串00截断的特点使其为0,来起到使该结果为NULL的效果。
在这里插入图片描述
2.可以发现通过字符串00截断的特点可以使12FB1C为0,来使函数错误判断
字符串的00截断会自动在后面加上00
字符串的00截断会自动在后面加上00

在这里插入图片描述
3.但是这次实验的目的是让程序跳出指定窗口,因此选择在读取的txt中插入机器码,这段机器码的作用就是让程序弹出一个窗口。
在这里插入图片描述
通过Depend找一个带图形界面的程序进行读取,获取到MassageBox的函数地址,以便在机器码中能成功引用该函数


通过移动EIP指针至这段机器码的开头处程序就直接会把这段当成汇编代码读了。

在这里插入图片描述
5.成功弹出窗口
在这里插入图片描述

实验思考

在这里插入图片描述
这个比较函数的原理就是如果相同就会清零,不同就错位相减,使该位为1。之后通过比较该值进行判断。因此能通过00截断来使这个判断失效。

PS:第二天打卡

猜你喜欢

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