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?
'% p% p% P' lahm ist, versuchen Sie'% n% n% n% n ' – Jasen
diese zusätzlichen Räume aussehen schrecklich.sie machen es * schwerer * zu lesen, was passiert –
Nun, Sie haben den verwundbaren Teil komplett entfernt, zum einen. – user2357112