当前位置:  开发笔记 > 编程语言 > 正文

为什么这个Overflow Occuring?

如何解决《为什么这个OverflowOccuring?》经验,为你挑选了1个好方法。

在以下代码中:

#include 
#include 
#include 

int check_authentication(char *password) {  
    char password_buffer[16];   
    int auth_flag = 0;

    strcpy(password_buffer, password);

    if(strcmp(password_buffer, "brillig") == 0)
        auth_flag = 1;
    if(strcmp(password_buffer, "outgrabe") == 0)
    auth_flag = 1;

    return auth_flag;
}

int  main (int argc, char *argv[]){
    if(argc < 2){
         printf("Usage: %s \n", argv[0]);
        exit(0);    
    }

        if(check_authentication(argv[1])){
        printf("\n-=-=-=-=-=-=-==-=-=-\n");
        printf("  Access Granted\n");
        printf("-=-=-=-=-=-=-==-=-=-\n");
    }
    else {
        printf("Access Denied\n");
    }       
}

如果我运行诸如"AAAAAAAAAAAAAAAAAAAA"之类的东西,某些东西会溢出并导致程序在授予访问权限时运行.我很困惑,因为当我运行gdb调试器时,auth_flag在内存中的password_buffer之前,它从未溢出.

编辑:我知道文本不适合缓冲区,但我正在试验缓冲区溢出以及如何以受控方式利用它们.是的,我们可以让阵列更大,但这不是重点

我想知道是否有人能够告诉我为什么会发生这种情况/什么是溢出导致这种情况.



1> Jorgel..:

AAAAAAAAAAAAAAAAAAAA的大小为20.您将使用strcpy它将其复制到大小为16的字符数组.尝试增加password_buffer大小.

为避免溢出,目标指向的数组大小应足够长,以包含与源相同的C字符串(包括终止空字符),并且不应在内存中与源重叠.

http://www.cplusplus.com/reference/cstring/strcpy/


@ yasgur99溢出缓冲区会导致未定义的行为.在那种情况下,一切都可能发生
推荐阅读
谢谢巷议
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有