小心使用strcpy函数时越界

本文著作权声明:请务必阅读本人的个人介绍!

strcpy()函数应该是我们用的比较常用的一个函数,基本功能是将一个字符串拷贝到我指定的内存空间。但是要复制的字符串长度超过这段内存空间的话,结果可能是未知的。

比如以下的程序:

#include <stdio.h>   
#include <string.h>  
   
int main(int argc, char *argv[])  
{  
    int flag = 0;  
    char password[5] = {'\0'};  
   
    strcpy(password, argv[1]);   
   
    if(0 == strcmp("root", password))   
    {   
        flag = 1;   
    }   
   
    if(flag)   
    {   
        printf("密码被破解了\n");   
    }   
    else   
    {   
        printf("密码破解失败\n");   
   
    }   
    return 0;   
}   

上述程序的功能是一个简单的密码破解功能,也就是判断用户输入的密码是不是”root“,如果是,则输出密码被破解了,否则提示用户密码破解失败!字符串数组argv[1]的内容已经事先设定为”123456789“。运行结果如下:


image.png

程序输出密码被破解了,说明if(0 == strcmp("root", password)) 这个语句判断通过了,将flag设为1了。但是我们的疑问是,”root“明明和”123456789“不一样啊,为什么if判断会通过呢?我们使用VC 6.0来调试下,如下:


image.png

从调试中可以看到,在执行到” if(0 == strcmp("root", password)) “时,flag的值已经变成57了,是不是很奇怪?
仔细看调试过程,password[0]这个字符的地址是”0x0012ff74“,password[1]这个字符的地址是”0x0012ff75“,以此类推,到了flag的地址是”0x0012ff7c“。也就是说,从password[0]开始,到flag,这是一段连续的内存区域,这段内存区域一共是0x0012ff7c - 0x0012ff75 = 9个字节大小,password数组占去了5个字节大小,也就是从地址”0x0012ff74“到地址”0x0012ff78“存放的都是password的字符。而argv[1]有”123456789“一共9个字符,将前5个字符给了password数组后,剩余的”6789“这4个字符,就存放在地址”0x0012ff79“到”0x0012ff7c“这端内存区域中。而flag的地址是”0x0012ff7c“,所以flag就存放了字符”9“,而字符”9“的ASCII码值是57,所以flag最终的值就是57。这样的话,即使用户输入的密码不是”root“,但是程序密码也被破解了,这就是使用strcpy函数的一个陷阱,即strcpy函数不会去检查第一个参数的存储区域是否容得下第二个参数的存储容量。

本例子是在VC6.0上调试的,flag变量跟password数组在内存上连续存放,但是也有不是连续存放的情况,这可能取决于编译器。也许用GCC编译的话,就不会连续存放了,gcc编译可能flag还是0。但是不管怎么,strcpy不检查数组越界,这个始终是需要注意的。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 一、Python简介和环境搭建以及pip的安装 4课时实验课主要内容 【Python简介】: Python 是一个...
    _小老虎_阅读 6,275评论 0 10
  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,550评论 1 32
  • 暖心热饮快手版☞第八篇 桃胶红枣银耳羹 工具:沙煲 配方:银耳10g 桃胶60g 红枣60g 水1300毫升 百合...
    Sophia_293d阅读 377评论 0 1
  • 于凤至 张学良的妻子 美丽端庄,聪颖大气 黛玉身段,宝钗情致 体贴丈夫,忠贞不渝 尊从四德,包容一荻 保全夫权,主...
    旖旎i阅读 970评论 17 16
  • 榆枫一叶,建筑大四狗,大一开始练习钢笔画至今,水平有限,只是希望和热爱手绘的同学分享一下学习经验。 如今各类手绘...
    榆枫一叶阅读 6,369评论 66 122

友情链接更多精彩内容