简单栈溢出漏洞问题求解(黑防2015第4期)

发布于 2022-09-01 13:04:21 字数 1670 浏览 25 评论 0

看了黑防杂志的一段栈溢出漏洞代码,很简单的原理,输入长度大于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的字符串后,就会溢出,密码直接验证通过:

clipboard.png

clipboard.png

但是我实际的运行结果是这样的:

clipboard.png

我输入了12个长度的字符后才溢出,输入8个字符长度不会溢出。

然后我输出了栈内的两个地址,发现相差12.。为啥不是相差8.。。

clipboard.png

---------------------------------更深的困惑----------------------------
同学用她的MAC运行我的代码 ,输入8个字节密码成功验证,但是我在另一台windows7
上运行依旧是12个字节密码才成功。

若能指点一二,万分感激。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

盛装女皇 2022-09-08 13:04:21

编译器实现不同。你同学MAC运行的是win7还是OSX?

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文