Security 为什么这段代码容易受到缓冲区溢出的攻击?
为什么这段代码容易受到缓冲区溢出的攻击?我想这和“strcpy”部分有关,但我不确定Security 为什么这段代码容易受到缓冲区溢出的攻击?,security,stack,buffer-overflow,Security,Stack,Buffer Overflow,为什么这段代码容易受到缓冲区溢出的攻击?我想这和“strcpy”部分有关,但我不确定 有什么想法吗?我认为您使用字符数组,因为没有运算符来标记数组的结尾。我认为您使用字符数组,因为没有运算符来标记数组的结尾。问题在于fprint,它不知道字符串何时结束。它应该以“\0”结尾。因此,如果在数组中写入设置了所有1024字节的内容。fprint命令将从内存中读取数据,以检查是否存在“\0”。。。它将继续读取,直到找到结束标记。问题在于fprint,它不知道字符串何时结束。它应该以“\0”结尾。因此,如
有什么想法吗?我认为您使用字符数组,因为没有运算符来标记数组的结尾。我认为您使用字符数组,因为没有运算符来标记数组的结尾。问题在于fprint,它不知道字符串何时结束。它应该以“\0”结尾。因此,如果在数组中写入设置了所有1024字节的内容。fprint命令将从内存中读取数据,以检查是否存在“\0”。。。它将继续读取,直到找到结束标记。问题在于fprint,它不知道字符串何时结束。它应该以“\0”结尾。因此,如果在数组中写入设置了所有1024字节的内容。fprint命令将从内存中读取数据,以检查是否存在“\0”。。。它将继续读取,直到找到结束标记。短篇小说:
strcpy
上的参数被切换
说来话长:strcpy
将第二个参数复制到第一个参数
让我们快速分析一下。在main
中,代码检查argv[1]
的长度是否最多为1023+1(NUL字节)个字符argv[1]
然后作为第一个也是唯一一个参数传递给cpy
,并作为b
提供
在cpy
中,还有一个名为values
的未初始化字符数组,该数组被分配为1024个字符长
现在,strcpy
被指示从值
复制到b
。我们知道,b
是从argv[1]
获得的指针,因此最多有1024个字符的空间<代码>值保留1024个字符,但未初始化。因此,它可能包含也可能不包含1024个字符中的NUL字节
如果在到达argv[1]
的边界之前,它恰好包含一个NUL字节,则一切正常。否则,可能会发生两件事:
- 如果
的长度正好是1023个字符(+终止NUL字节),则会发生越界读取(在argv[1]
值上)和写入(在
上)argv[1]
- 如果
长度小于1023个字符,则会发生argv[1]
上的越界写入,并且如果程序在越界写入后仍能生存,则扩展后也可能发生argv[1]
值上的越界读取
根据fprint是什么(我的系统上没有它的手册页),代码中可能还有其他问题 短篇故事:
strcpy
上的参数被切换
说来话长:strcpy
将第二个参数复制到第一个参数
让我们快速分析一下。在main
中,代码检查argv[1]
的长度是否最多为1023+1(NUL字节)个字符argv[1]
然后作为第一个也是唯一一个参数传递给cpy
,并作为b
提供
在cpy
中,还有一个名为values
的未初始化字符数组,该数组被分配为1024个字符长
现在,strcpy
被指示从值
复制到b
。我们知道,b
是从argv[1]
获得的指针,因此最多有1024个字符的空间<代码>值保留1024个字符,但未初始化。因此,它可能包含也可能不包含1024个字符中的NUL字节
如果在到达argv[1]
的边界之前,它恰好包含一个NUL字节,则一切正常。否则,可能会发生两件事:
- 如果
的长度正好是1023个字符(+终止NUL字节),则会发生越界读取(在argv[1]
值上)和写入(在
上)argv[1]
- 如果
长度小于1023个字符,则会发生argv[1]
上的越界写入,并且如果程序在越界写入后仍能生存,则扩展后也可能发生argv[1]
值上的越界读取
根据fprint是什么(我的系统上没有它的手册页),代码中可能还有其他问题 我不确定把你的家庭作业问题发布在这个网站上是不是最好的办法。如果你一点也不懂这些材料,但你的家庭作业却神秘地得了“A”,你将如何解释期末考试最终的“F”呢?我不确定在这个网站上发布你的家庭作业问题是不是最好的办法。如果你一点也不懂这些材料,但你的家庭作业却神秘地得了“A”,你将如何解释期末考试最终的“F”呢?哦,我明白了。所以数组“值”应该总是用比“b”多的一个位置初始化?还是有更好的选择?完全取决于你想要实现什么。目前的代码在这两方面都没有多大意义。也许你可以解释一下代码应该做什么。哦,我明白了。所以数组“值”应该总是用比“b”多的一个位置初始化?还是有更好的选择?完全取决于你想要实现什么。目前的代码在这两方面都没有多大意义。也许你可以解释一下代码应该做什么。
void cpy(char* b) {
char values[1024];
strcpy(b, values);
fprint(values);
}
int main(int argc, char** argv){
if(argc == 1 || strlen(argv[1]) > 1024) {
fprint("Nope!\n");
return 1;
}
cpy(argv[1]);
return 0;
}