C语言调用stdlib.h的system()运行java jar时无法读取argv[2]求助
问题根因分析
- 核心问题1:非法修改
argv指向的字符串,导致argv[2]被截断
C语言中main函数的argv数组指向的字符串是操作系统传入的只读内容,且在内存中是连续存储的。你调用strcat(option, space)时,option是argv[1]的指针,strcat会在argv[1]原字符串的末尾\0位置写入空格,再新增一个\0,这个新增的\0刚好覆盖了argv[2]字符串的首个字符,导致读取argv[2]时直接识别为空字符串,这就是arg2缺失的直接原因。 - 核心问题2:
command数组缓冲区溢出,存在未定义行为
你定义char command[] = "java -jar lans.jar ";时,数组的长度刚好等于初始字符串的长度+1(末尾\0),没有预留任何拼接其他参数的空间,后续调用strcat拼接内容会直接越界写入,属于典型的缓冲区溢出漏洞,会导致不可预期的程序行为。
额外隐患:直接使用printf(command)也存在格式化字符串注入风险,如果参数中包含%类占位符会导致程序崩溃。
修复方案
- 禁止修改
argv指向的字符串,所有参数拼接操作都在专门申请的缓冲区内完成 - 给
command缓冲区分配足够的空间,优先使用更安全的snprintf做字符串拼接,避免手动操作strcat容易出现的边界错误 - 修复后示例代码:
#include <stdio.h> #include <string.h> #include <stdlib.h> int main(int argc, char* argv[]) { // 分配1024字节的缓冲区,足够容纳普通传参 char command[1024] = "java -jar lans.jar "; int cmd_len = strlen(command); if (argc == 2) { snprintf(command + cmd_len, sizeof(command) - cmd_len, "%s", argv[1]); printf("%s\n", command); system(command); } else if (argc == 4) { snprintf(command + cmd_len, sizeof(command) - cmd_len, "%s %s %s", argv[1], argv[2], argv[3]); printf("%s\n", command); system(command); } else { printf("wrong args\n"); system(command); } return 0; }
内容的提问来源于stack exchange,提问作者Yousef Ali
相关产品推荐
相关产品推荐

