Sto cercando di conoscere i bug delle stringhe di formato e ho trovato l'opzione gcc
-Wformat-security
per generare un avviso quando viene trovato un potenziale bug della stringa di formato. Vorrei sapere se c'è un modo per eludere questo controllo e avere ancora un problema di bug di formato. Ad esempio:
#include <stdio.h>
#include <stdlib.h>
int main (int argc, char * argv[])
{
char outbuf[32];
char buffer[32];
if (argc < 2)
{
fprintf (stderr, "Error missing argument!\n");
exit (EXIT_FAILURE);
}
snprintf (buffer, 28, "ERR Wrong command: %8s", argv[1]);
sprintf (outbuf, buffer);
perror(outbuf);
return EXIT_SUCCESS;
}
Se compilato in 32 bit, si bloccherà su %21d
input (non su %20d
, ma su qualsiasi numero superiore a 20). Tuttavia, -Wformat-security
lo rileva e genera un avviso come segue:
$> gcc -m32 -Wall -Wextra -Wformat-security -std=c99 -o fstring fstring.c
fstring.c: In function ‘main’:
fstring.c:19:3: warning: format not a string literal and no format arguments [-Wformat-security]
sprintf (outbuf, buffer);
^
Quindi, c'è un modo per nascondere il bug dall'avviso e avere ancora un possibile sfruttamento?
Modifica : il mio punto non è correggere il bug, ma capire che tipo di bug della stringa di formato non vengono catturati da questo avviso. Aiuta a capire dove cercare se non viene generato alcun avviso ma sono presenti potenziali bug di stringhe di formato.