int func(char* str)
{
   char buffer[100];
   unsigned short len = strlen(str);

   if(len >= 100)
   {
        return (-1);
   }

   strncpy(buffer,str,strlen(str));
   return 0;
}

此代码容易受到缓冲区溢出攻击,我正在try 找出原因.我认为这与len分被宣布为short分有关,而不是int分,但我不太确定.

Any ideas?

推荐答案

在大多数编译器上,unsigned short的最大值是65535.

任何高于该值的值都会被绕回,因此65536变为0,65600变为65.

这意味着正确长度的长字符串(例如65600)将通过判断,并使缓冲区溢出.


使用size_t存储strlen()的结果,而不是unsigned short,并将len与直接编码buffer大小的表达式进行比较.例如:

char buffer[100];
size_t len = strlen(str);
if (len >= sizeof(buffer) / sizeof(buffer[0]))  return -1;
memcpy(buffer, str, len + 1);

C++相关问答推荐

如何在C中通过转换为char * 来访问float的字节表示?

C:gcc返回多个错误定义,但msvc—不""'

是否所有C编译器在将浮点数转换为整型数时都会隐式删除小数?

带有sigLongjMP中断I/O的异常处理程序

如何将字符串传递给函数并返回在C中更改的相同字符串?

C++中矢量类型定义和数据保护的高效解决方案

每个 struct 变量在C中都有自己的命名空间吗?

获取每个循环迭代结束时的当前时间

如何将另一个数组添加到集合中,特别是字符串?

编译器如何处理具有更复杂值的枚举?

Go和C中的数据 struct 对齐差异

STM32 FATFS用户手册(Um1721)中的代码正确吗?

在C中使用无符号整数模拟有符号整数

生成一个半RNG,结果用C表示(无随机/随机)

C struct 中的冒泡排序

使用 strtok 多次分割一个字符串会导致意外行为

函数的typedef是标准 C 语法吗?它与函数指针的typedef有何不同?

C Makefile - 如何避免重复提及文件名

是什么阻止编译器优化手写的 memcmp()?

clion.我无法理解 Clion 中发生的 scanf 错误