简单栈溢出漏洞问题求解(黑防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的字符串后,就会溢出,密码直接验证通过:

clipboard.png

clipboard.png

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

clipboard.png

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

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

clipboard.png

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

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

windows windows-7 c 漏洞

假装o不在 10 years, 2 months ago

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

东方萃妄想 answered 10 years, 2 months ago

Your Answer