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

Probable unrecognized buffer overflow

提问人:Alessandro Argentini 提问时间:11/16/2023 最后编辑:MofiAlessandro Argentini 更新时间:11/16/2023 访问量:51

问:

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

代码如下:

char* buffer_reset(char* buffer);
bool jobsreader (const char* printer_name, char* buffer);

int main (int argc, char *argv[]) {
    char buffer[1000];
    char* pbuffer = buffer;
    jobsreader("Microsoft Print to PDF", pbuffer);
    pbuffer = buffer_reset(pbuffer);
    jobsreader("Microsoft Print to PDF", pbuffer);
    return 0;
}

char* buffer_reset(char* buffer) {
    char* memory_reset = &buffer[0];
    char* start = memory_reset;
    while (*memory_reset != '\0') {
        *memory_reset = '\0';
        memory_reset++;
    }
    buffer = start;
    return buffer;
}

bool jobsreader (const char* printer_name, char* buffer) {
    FILE *output;
    const char* cmd = "powershell -Command Get-PrintJob '";
    int dim = (strlen(cmd)+1+strlen(printer_name)+1+2);
    char powershell[dim]; // + 1 per carattere \0 + 1 per carattere \0 + 2 per stringa "'\0"
    strcat(powershell, cmd);
    strcat(powershell, printer_name);
    strcat(powershell, "'");

    fflush(stdout);
    printf("%s\n", powershell);

    output = popen(powershell, "r"); // Esegue il comando shell e restituisce un puntatore a FILE
    if (output == NULL) {
        printf("Error in executing the command: are you sure this printer exists?\n");
        pclose(output); // Chiude il file
        return false;
    } else {
        char c;
        // Se c'è un processo in corso (quindi output della shell diverso da EOF)
        while ((c = getc(output)) != EOF) {
            *buffer = c;
            printf("%c", c); // Stampa a video del processo in corso
            buffer++;
        }
        printf("\n");

        *buffer = '\0';
        pclose(output); // Chiude il file
        return true;
    }
}

输出 1:powershell -命令 Get-PrintJob 'Microsoft Print to PDF' (OK) 输出 2,3,4 ...: powershe@powershell -command get-printJob 'Microsoft Print to PDF' (错误)

有人可以帮我吗?

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

C PowerShell 缓冲区 溢出

评论

0赞 273K 11/16/2023
无法编译您的代码:请发布一个最小的可重现示例error: unknown type name 'FILE' FILE *output;

答:

6赞 Some programmer dude 11/16/2023 #1

问题出在这两行:

char powershell[dim];
strcat(powershell, cmd);

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

更具体地说,它不能用作以 null 结尾的字符串,这是预期的。因此,您将具有未定义的行为strcat

您必须改为从呼叫开始:strcpy

strcpy(powershell, cmd);

或者,您可以使用以下命令来代替多个 和 调用:snprintfstrcpystrcat

snprintf(powershell, dim, "powershell -Command Get-PrintJob '%s'", printer_name);
0赞 Luis Colorado 11/25/2023 #2

总是一样的。所有 C 书籍都解释了这一点,这是一个基本问题:

        char c;
        // Se c'è un processo in corso (quindi output della shell diverso da EOF)
        while ((c = getc(output)) != EOF) {

EOF是一个常量,必须声明。原因是每个输入的返回值和额外值(保证不是其他 256 个值中的任何一个)intcintgetc()0255charEOF

由于只允许 256 个值,因此不可能全部拥有它们,而保证没有多余的值。 returns,因此必须声明,而不是charEOFgetc()intcint c;char c; /* bad */