作者:c72586051 | 来源:互联网 | 2023-09-14 09:45
看了黑防杂志的一段栈溢出漏洞代码,很简单的原理,输入长度大于8的密码后,由于原定义数组长度为8,因此溢出至返回值:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
| #include
#include
#define PASSWORD "1234567"
int verify_password(char* password)
{
int authenticated;
char buffer[8];//定义一个大小为8字节的数组,控制没溢出的字符串长度,(超出这个长度就会溢出)
authenticated = strcmp(password,PASSWORD);
strcpy(buffer,password);//这句话直接导致溢出的发生
return authenticated;
}
int main()
{
int valid_flag = 0;
char password[1024];
while(1)
{
printf("请输入密码:");
scanf("%s",password);
valid_flag = verify_password(password);
if(valid_flag)
{
printf("密码错误。请重试\n\n\n");
}
else
{
printf("验证通过:)");
break;
}
}
system("pause");
return 0;
} |
理论上的运行结果是输入长度为8的字符串后,就会溢出,密码直接验证通过:
但是我实际的运行结果是这样的:
我输入了12个长度的字符后才溢出,输入8个字符长度不会溢出。
然后我输出了栈内的两个地址,发现相差12.。为啥不是相差8.。。
---------------------------------更深的困惑----------------------------
同学用她的MAC运行我的代码 ,输入8个字节密码成功验证,但是我在另一台windows7
上运行依旧是12个字节密码才成功。
若能指点一二,万分感激。