Schnelle objektorientierte, kompilierende Programmiersprache.
-
nufan
- Wiki-Moderator
- Beiträge: 2558
- Registriert: Sa Jul 05, 2008 3:21 pm
Beitrag
von nufan » Mi Jan 16, 2013 3:54 am
Hier ein Stückchen C-Code, das eine Sicherheitslücke beinhaltet:
Code: Alles auswählen
#include <stdio.h>
#include <string.h>
#define MAX_LEN 1024
int main( int argc, char *argv[] )
{
char password[MAX_LEN] = {0};
char input[MAX_LEN] = {0};
int inputLength;
int passwordLength;
printf( "----- Vulnerable Screen Locker -----\n" );
printf( "Enter password: " );
fflush( stdout );
fgets( password, sizeof( password ), stdin );
passwordLength = strlen( password );
password[passwordLength - 1] = '\0';
--passwordLength;
printf( "\nScreen locked\n" );
while( 1 )
{
printf( "\n\nEnter password to unlock: " );
fflush( stdout );
fgets( input, sizeof( input ), stdin );
inputLength = strlen( input );
input[inputLength - 1] = '\0';
--inputLength;
if( passwordLength == inputLength && strcmp( input, password ) == 0 )
{
printf( "Screen unlocked\n" );
return 0;
}
printf( "Incorrect password. This incident will be reported. Password tried: " );
printf( input );
fflush( stdout );
}
return 0;
}
Wer findet den Fehler?

Zugegeben, es ist nicht ganz trivial, aber doch schaffbar

-
cloidnerux
- Moderator
- Beiträge: 3125
- Registriert: Fr Sep 26, 2008 4:37 pm
- Wohnort: Ram (Gibts wirklich)
Beitrag
von cloidnerux » Mi Jan 16, 2013 8:59 am
Muss ich das Programm nicht einfach nur zum Crashen bringen indem ich entweder kein oder ein sehr langes Passwort eingebe, sodass der Buffer überläuft?
Redundanz macht wiederholen unnötig.
quod erat expectandum
-
nufan
- Wiki-Moderator
- Beiträge: 2558
- Registriert: Sa Jul 05, 2008 3:21 pm
Beitrag
von nufan » Mi Jan 16, 2013 9:30 am
cloidnerux hat geschrieben:Muss ich das Programm nicht einfach nur zum Crashen bringen indem ich entweder kein oder ein sehr langes Passwort eingebe, sodass der Buffer überläuft?
Wie genau willst du das machen? Ich verwende zum Einlesen fgets() mit einer Zeichenbegrenzung.
Ok, ich muss zugeben meine Aufgabenbeschreibung war etwas knapp. Das von mir geschriebene Programm ist natürlich stark vereinfacht. Es soll angenommen werden, dass das zuerst eingegebene Passwort nicht bekannt ist und nicht am Bildschirm steht. Trotzdem soll man ins if mit der Ausgabe "Screen unlocked\n" und dem return kommen.
-
naums
- Beiträge: 740
- Registriert: Sa Jan 02, 2010 10:40 pm
-
Kontaktdaten:
Beitrag
von naums » Mi Jan 16, 2013 9:58 am
Ich stelle mal 2 Fragen:
zählt das das Nullbyte mit?
warum ziehst du passwordLength eins ab und weist den Wert nirgendwohin zu? genau das gleiche mit inputLength. Theoretisch sollten die beiden Formulierungen keinen Zweck haben, weil der neu berechnete Wert keiner Variablen zugewiesen wird.
MFG
.globl truth
truth:
mov r0, #42
mov pc, lr
-
Yoghurt
- Beiträge: 79
- Registriert: Fr Nov 16, 2012 8:01 am
- Wohnort: Niederbayern
Beitrag
von Yoghurt » Mi Jan 16, 2013 10:13 am
--passwordLength
<=> passwordLength -= 1
<=> passwordLength = passwordLength - 1
"Theory is when you know something, but it doesn't work.
Practice is when something works, but you don't know why.
Programmers combine theory and practice: Nothing works and they don't know why."
-
nufan
- Wiki-Moderator
- Beiträge: 2558
- Registriert: Sa Jul 05, 2008 3:21 pm
Beitrag
von nufan » Mi Jan 16, 2013 10:18 am
naums hat geschrieben:
zählt das das Nullbyte mit?
Nein. Das hättest du aber auch in der Referenz finden können ^^
naums hat geschrieben:
warum ziehst du passwordLength eins ab und weist den Wert nirgendwohin zu? genau das gleiche mit inputLength. Theoretisch sollten die beiden Formulierungen keinen Zweck haben, weil der neu berechnete Wert keiner Variablen zugewiesen wird.
Weil fgets() das Newline (\n) an den String dranhängt. Das will ich aber nicht. Ich überschreibe das \n einfach mit \0 und es ist weg. Natürlich ist mein String danach um 1 Zeichen kürzer, deswegen dekrementiere ich passwordLength bzw. inputLength.
Kaum sagt man etwas von einer Sicherheitslücke suchen alle nach Bufferoverflows in der Eingabe... ^^
-
naums
- Beiträge: 740
- Registriert: Sa Jan 02, 2010 10:40 pm
-
Kontaktdaten:
Beitrag
von naums » Mi Jan 16, 2013 10:23 am
okay, ich benutze meistens:
Deshalb war mir der og. Umstand nicht bewusst.
.globl truth
truth:
mov r0, #42
mov pc, lr
-
Yoghurt
- Beiträge: 79
- Registriert: Fr Nov 16, 2012 8:01 am
- Wohnort: Niederbayern
Beitrag
von Yoghurt » Mi Jan 16, 2013 11:11 am
Wenn die Dekrementierung (bzw. Inkrementierung) allein steht macht es keinen Unterschied ob die Postfix- oder Präfix-Schreibweise verwendet wird.
Hier würde es einen Unterschied machen:
Code: Alles auswählen
int a, b;
a = 3;
b = --a;
//b = a--;
if(a == b) { printf("gleich\n"); } else { printf("ungleich\n"); }
Je nachdem ob du die Dekrementierung als Präfix oder als Postfix schreibst wird sie vor (prä) oder nach (post) der Verwendung der Variablen ausgeführt.
"Theory is when you know something, but it doesn't work.
Practice is when something works, but you don't know why.
Programmers combine theory and practice: Nothing works and they don't know why."
-
Kerli
- Beiträge: 1456
- Registriert: So Jul 06, 2008 10:17 am
- Wohnort: Österreich
-
Kontaktdaten:
Beitrag
von Kerli » Mi Jan 16, 2013 11:23 am
Ich würde einfach raufscrollen und schauen was dort für ein Passwort steht

"Make it idiot-proof and someone will invent an even better idiot." (programmers wisdom)
OpenGL Tutorials und vieles mehr rund ums Programmieren:
http://www.tomprogs.at
-
nufan
- Wiki-Moderator
- Beiträge: 2558
- Registriert: Sa Jul 05, 2008 3:21 pm
Beitrag
von nufan » Mi Jan 16, 2013 11:29 am
Kerli hat geschrieben:Ich würde einfach raufscrollen und schauen was dort für ein Passwort steht

Joa... aber wie bereits erwähnt:
dani93 hat geschrieben:Ok, ich muss zugeben meine Aufgabenbeschreibung war etwas knapp. Das von mir geschriebene Programm ist natürlich stark vereinfacht. Es soll angenommen werden, dass das zuerst eingegebene Passwort nicht bekannt ist und nicht am Bildschirm steht. Trotzdem soll man ins if mit der Ausgabe "Screen unlocked\n" und dem return kommen.
^^