strcpy的字符串溢出真的很可怕
如图:
按代码逻辑,程序员的想法是校验传⼊的str字符串密码,是不是"123",如果是的话就打印“Check password succeed!”,
反之则打印“Check password failed!”。所以当⼀个⼈不知道字符串密码的时候,它任意传⼊⼀串字符串,就如图中的
,好家伙,⼀眼看过去,按代码逻辑来,你是不是觉得校验失败了,然后打印“Check password failed!”?
然⽽,最终的结果却是:校验成功了“Check password succeed!”
字符串拷贝函数strcpy作用
等你再回头想⼀下,如果这种类似代码因为代码评审不注意,或者历史原因存留在企业的软件产品中,这是何等级别的隐患?
是不是不知道密码的⼈也可以传⼊⼀个超长字符串来破解访问你的软件产品?(当然现在的登录校验啥的有很多加密,⾮常复杂,此处不要较真)
为什么会打印出与代码逻辑预期的相反呢?
原因:strcpy这个函数,字符串溢出了,代码中有两个局部变量,checkResult(bool类型),checkCode(字符数组),⼤家都知道局部变量是
存放在栈空间上的,并且栈上的空间是有⾼地址向低地址⽣长的,所以你定义的过程类似于压栈,你先压进去的checkResult存放在⾼地址,
checkCode存放在了低地址。当你调⽤strcpy的时候,由于checkCode的内存只占⽤了4个字节,你拷贝进去了远⼤于4字节的字符串,然⽽
strcpy函数⼜不会帮你截断,那字符串多出来的字节存放在哪⾥?写内存的时候是从低地址往⾼地址写,所以它会继续寻址,往后⾯写,写到
checkResult这个局部变量⾥。所以此时checkResult已经不在程序员想要的结果下被篡改了,此时的值不在是false了,所以最终的结果也就背道⽽驰。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论