简单栈溢出漏洞问题求解(黑防2015第4期)
看了黑防杂志的一段栈溢出漏洞代码,很简单的原理,输入长度大于8的密码后,由于原定义数组长度为8,因此溢出至返回值:
#include<stdio.h>
#include<string.h>
#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个字节密码才成功。
若能指点一二,万分感激。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
编译器实现不同。你同学MAC运行的是win7还是OSX?