热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

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

看了黑防杂志的一段栈溢出漏洞代码,很简单的原理,输入长度大于8的密码后,由于原定义数组长度为8,因此溢出至返回值:

看了黑防杂志的一段栈溢出漏洞代码,很简单的原理,输入长度大于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个字节密码才成功。

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


推荐阅读
author-avatar
c72586051
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有