【问题标题】:Why is there a buffer overflow in this code?为什么这段代码会出现缓冲区溢出?
【发布时间】:2014-05-25 17:28:52
【问题描述】:

作为问题的一部分,我有一个包含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';
}

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

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

【问题讨论】:

  • @newboyhun: sizeof(char) 根据定义为 1。
  • 上述片段中存在三个错误。唯一没有错误的行是}
  • 最后一条语句写到缓冲区的末尾。
  • 因为你写的超出了缓冲区的末尾。
  • 1) strncpy() 总是错误的。 2)> 比较是错误的(减一),currentItem.filename[sizeof(currentItem.filename)] = '\0'; 也是错误的(减一)

标签: c buffer-overflow


【解决方案1】:

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

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

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

要解决这个问题,请写

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

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

希望这会有所帮助!

【讨论】:

    猜你喜欢
    • 2020-02-09
    • 2010-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多