Security 为什么这段代码容易受到缓冲区溢出的攻击?

Security 为什么这段代码容易受到缓冲区溢出的攻击?,security,stack,buffer-overflow,Security,Stack,Buffer Overflow,为什么这段代码容易受到缓冲区溢出的攻击?我想这和“strcpy”部分有关,但我不确定 有什么想法吗?我认为您使用字符数组,因为没有运算符来标记数组的结尾。我认为您使用字符数组,因为没有运算符来标记数组的结尾。问题在于fprint,它不知道字符串何时结束。它应该以“\0”结尾。因此,如果在数组中写入设置了所有1024字节的内容。fprint命令将从内存中读取数据,以检查是否存在“\0”。。。它将继续读取,直到找到结束标记。问题在于fprint,它不知道字符串何时结束。它应该以“\0”结尾。因此,如

为什么这段代码容易受到缓冲区溢出的攻击?我想这和“strcpy”部分有关,但我不确定


有什么想法吗?

我认为您使用字符数组,因为没有运算符来标记数组的结尾。

我认为您使用字符数组,因为没有运算符来标记数组的结尾。

问题在于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字节,则一切正常。否则,可能会发生两件事:

  • 如果
    argv[1]
    的长度正好是1023个字符(+终止NUL字节),则会发生越界读取(在
    值上)和写入(在
    argv[1]
    上)

  • 如果
    argv[1]
    长度小于1023个字符,则会发生
    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字节,则一切正常。否则,可能会发生两件事:

  • 如果
    argv[1]
    的长度正好是1023个字符(+终止NUL字节),则会发生越界读取(在
    值上)和写入(在
    argv[1]
    上)

  • 如果
    argv[1]
    长度小于1023个字符,则会发生
    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;
}