[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"有关。部分但我不确定......
有什么想法吗?
答案 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'...它将继续读取,直到找到结束标记。