首页 > 解决方案 > 以 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]设置为的程序?NULLargv[0]

标签: cargv

解决方案


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

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

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


推荐阅读