使用argv[0]作为NULL调用C程序

以下内容来自一本关于安全 C 编码的书:

当分配的空间不足以复制程序输入(例如命令行参数)时,就会出现漏洞。尽管 argv[0] 按照约定包含程序名称,但攻击者可以通过提供超过 128 字节的字符串来控制 argv[0] 的内容,从而在以下程序中造成漏洞。此外,攻击者可以将 argv[0] 设置为 NULL 来调用此程序:

int main(int argc, char *argv[]) {
   /* ... */
   char prog_name[128];
   strcpy(prog_name, argv[0]);
   /* ... */
}

请问攻击者如何调用argv[0]set为的程序NULL,如果argv[0]是程序名?

回答

通过使用 a 函数execlp()来启动程序,而不是从 shell 运行程序。所有exec函数都要求调用者argv显式提供元素,并且它们很容易违反约定。

execlp("program_name", (char *)NULL);

请注意,此能力实际上有一些用途。不是特别的 argv[0] == NULL,而是argv[0]与程序名称不同的选项。还有另一个约定是登录 shell-作为第一个字符运行argv[0](因为传统的登录过程不提供将参数传递给 shell 的方法)。


以上是使用argv[0]作为NULL调用C程序的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>