2017-08-25 4 views
-3

Angenommen ich folgendes Programm:Format-String-Schwachstelle und Eingabezeichenfolgen

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

int main (int argc, char **argv) 
{ 
    char buf [100]; 
    snprintf (buf, sizeof buf, argv [1]) ; 
    buf [ sizeof buf -1 ] = 0; 
    printf ("%s \n" , buf) ; 
    return 0 ; 
} 

Wenn ich kompilieren und ausführen:

gcc test.c -o test 
./test %p%p%p 
(nil)0x4006d00x7f67e05b7ab0 

ich die Stapel Werte sehen können, was bedeutet, dass es durch folgende Faktoren beeinträchtigt wird die Formatzeichenfolge-Schwachstelle.

Nun lassen Sie uns ein wenig den obigen Code ändern:

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

int main (int argc, char **argv) 
{ 
    char buf [100]; 
    printf ("%s \n" , argv[1]) ; 
    return 0 ; 
} 

Wenn ich es neu kompilieren und starten Sie es, die Sicherheitslücke ist weg:

gcc test.c -o test 
./test %p%p%p 
%p%p%p 

Warum ist das passiert, was vom ersten Beispiel geändert?

, auch im ersten Beispiel soll nicht die % s im printf betrachten buf als String? Warum ist ein solcher Code immer noch von der Formatzeichenfolgenanfälligkeit betroffen?

+0

'% p% p% P' lahm ist, versuchen Sie'% n% n% n% n ' – Jasen

+0

diese zusätzlichen Räume aussehen schrecklich.sie machen es * schwerer * zu lesen, was passiert –

+0

Nun, Sie haben den verwundbaren Teil komplett entfernt, zum einen. – user2357112

Antwort

0
snprintf (buf, sizeof buf, argv [1]) ; 

Sie nur missbraucht snprintf haben, wie Sie die Parameter, die nicht bestanden haben %p%p%p Ihre Format-String übereinstimmen.

Sie haben also nur ein UB.

Sie sollten zum Beispiel (mit dem gleichen Format-String)

snprintf (buf, sizeof buf, argv [1], argv[0], buff, "Hello, Show where string literals are stored") ; 
1

Wenn Sie die Ausgabe des ersten Schnipsel wollen, die zweite passen dann einfach die gleiche Spezifikations Formatierung verwenden Sie für printf verwendet, dh :

snprintf (buf, sizeof buf, "%s", argv [1]); 
          ^^^^ 

In diesem Fall wird die argv[1] Zeichenfolge nicht als Formatierungsvorlage für einige andere Argumente behandelt wird und man einfach erhalten %p%p%p zu buf geschrieben.

Haben Sie vielleicht beabsichtigen, die Zeichenfolge stattdessen kopieren? Ich frage, weil snprintf automatisch den Puffer beendet, Sie nicht über den Nullabschluss manuell einstellen müssen (und dies ist usually done when using strncpy):

strncpy (buf, argv [1], sizeof buf); 
buf [ sizeof buf - 1 ] = 0; 
1

Sie fragt über Format-String-Schwachstelle. Die Formatstring-Sicherheitsanfälligkeit tritt auf, wenn eine benutzerdefinierte Zeichenfolge als Format für *scanf oder *printf-Funktion verwendet wird.

Im ersten Fragment ist die Schwachstelle mit snprintf. Im zweiten Fragment hat Ihre printf die Formatzeichenkette "%s". Es wurde vom Benutzer nicht angegeben, daher keine Sicherheitsanfälligkeit. Versuchen

printf(buf); 
Verwandte Themen