提问人:Alessandro Argentini 提问时间:11/16/2023 最后编辑:MofiAlessandro Argentini 更新时间:11/16/2023 访问量:51
可能无法识别的缓冲区溢出
Probable unrecognized buffer overflow
问:
我正在开发一个函数,该函数执行特定的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>
答:
6赞
Some programmer dude
11/16/2023
#1
问题出在这两行:
char powershell[dim];
strcat(powershell, cmd);
数组未初始化,其内容不确定。
更具体地说,它不能用作以 null 结尾的字符串,这是预期的。因此,您将具有未定义的行为。strcat
您必须改为从呼叫开始:strcpy
strcpy(powershell, cmd);
或者,您可以使用以下命令来代替多个 和 调用:snprintf
strcpy
strcat
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 个值中的任何一个)int
c
int
getc()
0
255
char
EOF
由于只允许 256 个值,因此不可能全部拥有它们,而保证没有多余的值。 returns,因此必须声明,而不是char
EOF
getc()
int
c
int c;
char c; /* bad */
评论
error: unknown type name 'FILE' FILE *output;