实验代码
#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
3.但是这次实验的目的是让程序跳出指定窗口,因此选择在读取的txt中插入机器码,这段机器码的作用就是让程序弹出一个窗口。
通过Depend找一个带图形界面的程序进行读取,获取到MassageBox的函数地址,以便在机器码中能成功引用该函数
通过移动EIP指针至这段机器码的开头处程序就直接会把这段当成汇编代码读了。
5.成功弹出窗口
实验思考
这个比较函数的原理就是如果相同就会清零,不同就错位相减,使该位为1。之后通过比较该值进行判断。因此能通过00截断来使这个判断失效。
PS:第二天打卡