为什么这段代码易受缓冲区溢出的影响?

时间:2016-07-13 15:16:51

标签: security stack buffer-overflow

[statistics] connecting to socket on port 4080
[statistics] connected
[statistics] disconnected
Job job_test ended 07/13/2016 at 15:34. [Exit code = 0]

为什么这段代码容易受到缓冲区溢出的影响?我认为它与" strcpy"有关。部分但我不确定......

有什么想法吗?

3 个答案:

答案 0 :(得分:2)

短篇小说:关于strcpy的论点被转换。

长篇小说:strcpy从第二个参数复制到第一个。

让我们快速分析一下。在main中,代码检查argv[1]长度最多为1023 + 1(NUL字节)字符。然后argv[1]作为第一个也是唯一的参数传递给cpy,并在b处可用。

cpy中,还有一个名为values的未初始化的char数组,它被分配为1024个字符长。

现在,strcpy被指示从values复制到b。我们知道,b是从argv[1]获得的指针,因此最多有1024个字符的空格。 values保留为1024个字符,但未初始化。因此,它可能包含或不包含1024个字符的NUL字节。

如果在达到argv[1]的界限之前恰好包含NUL字节,一切都很好。如果没有,可能会发生两件事:

  • 如果argv[1]长度正好为1023个字符(+终止NUL字节),则会发生超出范围的读取(在values上)和写入(在argv[1]上)。< / p>

  • 如果argv[1]长度小于1023个字符,则argv[1]上的界限写入将会发生,并且通过扩展,可能还会发生values以外的边界读取,如果程序幸存下来,那么超出范围的写入。

根据fprint的不同(我的系统上没有联机帮助页),代码中可能还有其他问题。

答案 1 :(得分:0)

我认为你使用了一个char数组,因为没有运算符来标记数组的结尾。

答案 2 :(得分:0)

问题是fprint,它不知道你的字符串何时结束。它应该以'\ 0'结尾。因此,如果您在数组中写入设置了所有1024个字节的内容。 fprint命令将从内存中读出以检查是否存在'\ 0'...它将继续读取,直到找到结束标记。