C - 为什么有人要将argv字符串复制到缓冲区?

Mir*_*res 5 c buffer-overflow argv

我今天正在学习缓冲区溢出,我遇到了许多易受攻击的程序示例.令我好奇的是,如果有任何理由使用这样的程序参数:

int main(int argc, char *argv[])
{
    char argument_buffer[100];
    strcpy(argument_buffer, argv[1]);

    if(strcmp(argument_buffer, "testArg") == 0)
    {
        printf("Hello!\n");
    }
    // ...
}
Run Code Online (Sandbox Code Playgroud)

而不是简单地:

int main(int argc, char *argv[])
{
    if(strcmp(argv[1], "testArg") == 0)
    {
        printf("Hello!\n");
    }
}
Run Code Online (Sandbox Code Playgroud)

请注意我知道strcpy等等的缺点- 这只是一个例子.我的问题是 - 是否有任何真正的理由使用临时缓冲区来存储来自argv的参数?我假设没有,但我很好奇,为什么它出现在溢出的例子中,而在现实中它从未被使用过?也许是因为纯理论.

wil*_*ser 1

在过去,IIRC argv 及其内容不能保证在所有平台上可写且稳定。C89 / C90 / ANSI-C 标准化了一些现有的做法。与 envp[] 类似。复制例程也可能是受到旧平台(例如 MS-DOS)上缺乏内存保护的启发。通常(现在)操作系统和/或 CRT 负责将参数从调用者的内存复制到进程的私有内存区域。