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的参数?我假设没有,但我很好奇,为什么它出现在溢出的例子中,而在现实中它从未被使用过?也许是因为纯理论.
在过去,IIRC argv 及其内容不能保证在所有平台上可写且稳定。C89 / C90 / ANSI-C 标准化了一些现有的做法。与 envp[] 类似。复制例程也可能是受到旧平台(例如 MS-DOS)上缺乏内存保护的启发。通常(现在)操作系统和/或 CRT 负责将参数从调用者的内存复制到进程的私有内存区域。