可能无法识别的缓冲区溢出

Ale*_*ini 0 c powershell buffer overflow

我正在开发一个函数,该函数执行特定的 powershell 命令,然后返回输出(如果与 EOF 不同)。该函数第一次正确执行,但第二次输出很奇怪,表明我的代码的某些部分存在缓冲区溢出。我找不到它。否则,我无法为这种行为找出其他可能的解决方案。

\n

这是代码:

\n
char* buffer_reset(char* buffer);\nbool jobsreader (const char* printer_name, char* buffer);\n\nint main (int argc, char *argv[]) {\n    char buffer[1000];\n    char* pbuffer = buffer;\n    jobsreader("Microsoft Print to PDF", pbuffer);\n    pbuffer = buffer_reset(pbuffer);\n    jobsreader("Microsoft Print to PDF", pbuffer);\n    return 0;\n}\n\nchar* buffer_reset(char* buffer) {\n    char* memory_reset = &buffer[0];\n    char* start = memory_reset;\n    while (*memory_reset != '\\0') {\n        *memory_reset = '\\0';\n        memory_reset++;\n    }\n    buffer = start;\n    return buffer;\n}\n\nbool jobsreader (const char* printer_name, char* buffer) {\n    FILE *output;\n    const char* cmd = "powershell -Command Get-PrintJob '";\n    int dim = (strlen(cmd)+1+strlen(printer_name)+1+2);\n    char powershell[dim]; // + 1 per carattere \\0 + 1 per carattere \\0 + 2 per stringa "'\\0"\n    strcat(powershell, cmd);\n    strcat(powershell, printer_name);\n    strcat(powershell, "'");\n\n    fflush(stdout);\n    printf("%s\\n", powershell);\n\n    output = popen(powershell, "r"); // Esegue il comando shell e restituisce un puntatore a FILE\n    if (output == NULL) {\n        printf("Error in executing the command: are you sure this printer exists?\\n");\n        pclose(output); // Chiude il file\n        return false;\n    } else {\n        char c;\n        // Se c'\xc3\xa8 un processo in corso (quindi output della shell diverso da EOF)\n        while ((c = getc(output)) != EOF) {\n            *buffer = c;\n            printf("%c", c); // Stampa a video del processo in corso\n            buffer++;\n        }\n        printf("\\n");\n\n        *buffer = '\\0';\n        pclose(output); // Chiude il file\n        return true;\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n

输出 1:powershell -Command Get-PrintJob 'Microsoft Print to PDF'(正常)\n输出 2,3,4 ...:powershe@powershell -Command Get-PrintJob 'Microsoft Print to PDF'(错误)

\n

有人可以帮助我吗?

\n

我想输出并执行以下 powershell 命令:Get-PrintJob <printer_name>

\n

Som*_*ude 6

问题是这两行:

char powershell[dim];
strcat(powershell, cmd);
Run Code Online (Sandbox Code Playgroud)

该数组未初始化,其内容不确定

更具体地说,它不能用作空终止字符串,这是所strcat期望的。因此,您将出现未定义的行为

您必须从调用开始strcpy

strcpy(powershell, cmd);
Run Code Online (Sandbox Code Playgroud)

或者,您可以使用snprintf而不是多个strcpyandstrcat调用:

snprintf(powershell, dim, "powershell -Command Get-PrintJob '%s'", printer_name);
Run Code Online (Sandbox Code Playgroud)