使用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 的方法)。