c-Array – Warnung: Format kein String-Literal

Lesezeit: 4 Minuten

[*]
Großes Ich

Ich versuche C zu lernen und bin bereits auf ein Problem gestoßen. Ich nehme an, es ist trivial, aber ich muss es wissen. Ich habe geschrieben:

#include <stdio.h>
#include <string.h>

int main() 
{
    char str_a[20];

    strcpy(str_a, "Hello, world!\n");
    printf(str_a);
}

Sobald ich versuche, es zu kompilieren mit: gcc -g -o char_array2 char_array2.c erhalte ich eine Fehlermeldung, die besagt:

char_array2.c: In function ‘main’:
char_array2.c:9:2: warning: format not a string literal and no format arguments [-Wformat-security]

Kann jemand bitte helfen?

  • Mögliches Duplikat von warning: format not a string literal and no format arguments

    – Ciro Santilli OurBigBook.com

    10. Dezember 2015 um 1:05 Uhr

Benutzeravatar von MByD
MByD

Beim Benutzen printfist der Format-String besser als String-Literal als als Variable:

printf("%s", str_a);

  • Besser oder erforderlich? Wieso den?

    – Ciro Santilli OurBigBook.com

    10. Dezember 2015 um 1:05 Uhr

  • @CiroSantilli六四事件法轮功包卓轩 – nicht erforderlich, da die API selbst die Übergabe variabler Zeichenfolgen zulässt, aber es ist viel, viel besser, ein Zeichenfolgenliteral zu verwenden, da die Verwendung einer variablen Zeichenfolge, die zufällig Formatbezeichner hat, Fehler verursacht (hauptsächlich Speicher Beschädigungen) und aus Sicherheitssicht ist dies eine klare und einfache Schwachstelle (wenn ein Angreifer die Eingabe kontrollieren kann).

    – MByD

    10. Dezember 2015 um 7:07 Uhr

  • @MByD “wird Fehler verursachen (hauptsächlich Speicherbeschädigungen)” Ich denke, es ist wichtig darauf hinzuweisen, dass dies unter nominellen Umständen niemals vorkommen wird – nur wenn die Zeichenfolge entweder von einem Angreifer oder durch schlechte Programmierung manipuliert wird. Nichts bewirkt, dass printf ein Literal anders behandelt als a const char *.

    – Benjamin Crawford Strg-Alt-Tut

    3. Oktober 2019 um 19:58 Uhr


  • @BenjaminCrawfordCtrl-Alt-Tut – Ich neige dazu, “könnte” als “wird” zu betrachten, weil ich auf die harte Tour gelernt habe, dass es irgendwann so sein wird. Schlechte Programmierung ist nicht “nominale Umstände”, sondern genau dies zu tun. printf() ist es vielleicht egal, woher der String stammt, aber es ist viel zu mächtig, um diese Vorsichtsmaßnahme zu verwerfen.

    – MByD

    10. Oktober 2019 um 7:48 Uhr

Benutzeravatar von BlackBear
Schwarzbär

Nur um etwas zu anderen Antworten hinzuzufügen, tun Sie dies besser, weil die Leute vor (langer?) Zeit so printf geschrieben haben und Hacker einen Weg gefunden haben, aus dem Stapel zu lesen und in ihn zu schreiben, mehr hier.
Zum Beispiel ein einfaches Programm wie dieses:

blackbear@blackbear-laptop:~$ cat format_vul.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(int argc, char *argv[])
{
    char text[1024];
    static int test_var = -1;

    if(argc < 2) {
        printf("Use: %s <input>\n", argv[0]);
        exit(-1);
    }

    strcpy(text, argv[1]);

    printf("The correct way:\n");
    printf("%s", text);

    printf("\nThe wrong way:\n");
    printf(text);

    printf("\n[*]: test_var @ %8p = %d ( 0x%x )\n", &test_var, test_var, test_var);
}
blackbear@blackbear-laptop:~$ ./format_vul AAAA
The correct way:
AAAA
The wrong way:
AAAA
[*]: test_var @ 0x804a024 = -1 ( 0xffffffff )

Kann verwendet werden, um den Wert von test_var von 0xffffff auf etwas anderes zu ändern, z. B. 0xaabbccdd:

blackbear@blackbear-laptop:~$ ./format_vul $(printf "\x24\xa0\x04\x08JUNK\x2
5\xa0\x04\x08JUNK\x26\xa0\x04\x08JUNK\x27\xa0\x04\x08").%8x.%8x.%8x.%8x.%8x.
%8x.%8x.%8x.%8x.%110x.%n%239x%n%239x%n%239x%n
The correct way:
$�JUNK%�JUNK&�JUNK'�.%8x.%8x.%8x.%8x.%8x.%8x.%8x.%8x.%8x.%110x.%n%239x%n%239
x%n%239x%n
The wrong way:
$�JUNK%�JUNK&�JUNK'�.bfffefec.  154d7c.  155d7c.  155d7c.      f0.      f0.b
ffff4a4.       4.       4.                                                  
                                                     174.                   


                                                50415243                    


                                               50415243                     


                                              50415243
[*]: test_var @ 0x804a024 = -1430532899 ( 0xaabbccdd )

Benutzeravatar von Marlon
Marlon

Die Warnung wird dadurch verursacht, dass der Compiler das erste Argument von haben möchte printf ein String-Literal sein. Es möchte, dass Sie Folgendes schreiben:

printf("%s\n", str_a);

Dies liegt daran, dass der erste Parameter von printf ist der Formatstring. Danach werden die Formatargumente übergeben.

Hinweis: Sie können zwar eine Variable als Formatzeichenfolge verwenden, sollten dies aber wahrscheinlich nicht tun. Deshalb gibt der Compiler eine Warnung und keinen Fehler aus.

printf() erwartet, dass sein Format ein String-Literal ist, kein dynamisch erstellter String. Versuchen Sie Folgendes, um das Problem zu beheben:

printf("%s", str_a); // %s denotes a string

Oder verwenden puts

puts(str_a);

Bitte lesen Sie die Warnung ‘keine Formatargumente’ – dh kein % im String.

Versuchen printf("%s", str_a);

Der Fehler kommt von printf(str_a);. Ihr Code sollte sein printf("%s",str_a);
Werfen Sie einen Blick auf den folgenden Link, um weitere Informationen zu printf zu erhalten. http://www.cprogramming.com/tutorial/printf-format-strings.html

1414020cookie-checkc-Array – Warnung: Format kein String-Literal

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy