istream的tellg/seekg无法被保护免受堆栈溢出攻击(使用g++)?

4

我正在编写一个程序,需要计算文件大小。我使用iostream的tellg和seekg函数来计算文件大小,但这会导致-Wstack-protector警告。以下代码重现了这个“问题”:

#include <iostream>

std::streamsize get_file_size(std::ifstream& ifs) { // line 12 (in warning, below)
  const std::streamsize start = ifs.tellg();
  ifs.seekg(0,std::ios::end);
  const std::streamsize end = ifs.tellg();
  ifs.seekg(start);
  return (end-start);
}

g++(标志:-fstack-protector -Wstack-protector,编译器版本:4.4.3(Ubuntu 4.4.3-4ubuntu5),系统:Ubuntu 10.04 x86_64)会发出警告:

f.cc:在函数‘std::streamsize get_file_size(std::ifstream&)’中:
f.cc:12:警告:未保护函数:没有至少8字节长的缓冲区

(当我使用直接从GNU下载和编译的GCC 4.5.2时,我得到相同的结果。)

这是否符合堆栈破坏保护的工作方式(一般或由GCC实现),以及ifstream和seekg/tellg的工作方式的预期?如果是这样,这个警告可以被忽略吗,还是有更好的方法可以做到这一点?

编辑

实际上,上面的一些代码是多余的。只是为了澄清正在发生什么:

#include <iostream>

void f1(std::ifstream& ifs) { // line 6
    ifs.tellg();
}

void f2(std::ifstream& ifs) { // line 10
    // call seekg(std::streampos)
    ifs.seekg(0);
}

void f3(std::ifstream& ifs) {
    // call seekg(std::streamoff, std::ios_base::seekdir)
    ifs.seekg(0,std::ios::beg);
}

导致 g++ (与上述相同规格) 发出警告:

main.cc: 在函数 ‘void f1(std::ifstream&)’ 中:
main.cc:6: 警告:未保护函数:缓冲区长度不足 8 字节
main.cc: 在函数 ‘void f2(std::ifstream&)’ 中:
main.cc:10: 警告:未保护函数:缓冲区长度不足 8 字节

有趣的是,f3 没有触发警告。

1个回答

1

你可能想要查看这个。

总的建议是你真的不应该在意,特别是在你的情况下,因为你没有分配任何内部缓冲区,可以用来执行缓冲区溢出攻击。


谢谢提供链接(尽管我认为是阅读那个页面让我在程序构建中包含了-Wstack-protector!)。我没有在get_file_size中放置可以被利用的缓冲区,这就是我问这个问题的原因:为什么会出现警告?即使我可以在实践中忽略它,但我仍然希望了解发生了什么,以便受益。 - Zorawar
@Zorawar 嗯,我不太擅长实际的缓冲区溢出技术,所以我想我们必须等待一个具有特定技能的人来解释这个问题是否可以被利用。 - Yippie-Ki-Yay
1
也许我应该提到我是在一个名为“NSA项目X人形语言翻译器”的文件中找到这段代码的,以便更容易地参与?(开玩笑的NSA!它是来自MI6...) - Zorawar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接