为什么此代码中存在缓冲区溢出?

时间:2014-05-25 17:28:53

标签: c buffer-overflow

作为问题的一部分,我有一个包含char isGoodchar filename[32]

的结构

有一个函数可以检查文件是否包含字符串I'm a virus并返回isGood中的值。

然后是以下代码:

strncpy(currentItem.filename, argv[i], sizeof(currentItem.filename));
if (strlen(argv[i]) > sizeof(currentItem.filename)) {
    currentItem.filename[sizeof(currentItem.filename)] = '\0';
}

此代码导致错误,即即使文件包含字符串I'm a virus,名称大于32个字符的文件也将始终返回“OK”。

为什么会这样?为什么更改currentItem.filename会更改currentItem.isGood的值?它似乎与strncpy有关,因为我必须回答的下一个问题是“结束用strncpy复制的字符串的正确方法是什么?”

1 个答案:

答案 0 :(得分:2)

这行代码就是你的缓冲区溢出:

currentItem.filename[sizeof(currentItem.filename)] = '\0';

sizeof(currentItem.filename)的值是缓冲区的长度。如果你在那个索引处写字,你就会在数组末尾写一个点,导致溢出。

要解决此问题,请写

currentItem.filename[sizeof(currentItem.filename) - 1] = '\0';

更一般地说,您可能希望使用strncpy,而不是使用strlcpy,这是大多数编译器支持的编译器扩展。它与strncpy类似,只是它总是放入一个空终止符。这意味着您永远不必担心添加自己的终结符。

希望这有帮助!