Finde die Sicherheitslücke ;)

Schnelle objektorientierte, kompilierende Programmiersprache.
nufan
Wiki-Moderator
Beiträge: 2558
Registriert: Sa Jul 05, 2008 3:21 pm

Finde die Sicherheitslücke ;)

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 :)

Benutzeravatar
cloidnerux
Moderator
Beiträge: 3125
Registriert: Fr Sep 26, 2008 4:37 pm
Wohnort: Ram (Gibts wirklich)

Re: Finde die Sicherheitslücke ;)

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

Re: Finde die Sicherheitslücke ;)

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.

Benutzeravatar
naums
Beiträge: 740
Registriert: Sa Jan 02, 2010 10:40 pm
Kontaktdaten:

Re: Finde die Sicherheitslücke ;)

Beitrag von naums » Mi Jan 16, 2013 9:58 am

Ich stelle mal 2 Fragen:

Code: Alles auswählen

strlen ( string);
zählt das das Nullbyte mit?

Code: Alles auswählen

  --passwordLength;
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

Benutzeravatar
Yoghurt
Beiträge: 79
Registriert: Fr Nov 16, 2012 8:01 am
Wohnort: Niederbayern

Re: Finde die Sicherheitslücke ;)

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

Re: Finde die Sicherheitslücke ;)

Beitrag von nufan » Mi Jan 16, 2013 10:18 am

naums hat geschrieben:

Code: Alles auswählen

strlen ( string);
zählt das das Nullbyte mit?
Nein. Das hättest du aber auch in der Referenz finden können ^^
naums hat geschrieben:

Code: Alles auswählen

  --passwordLength;
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... ^^

Benutzeravatar
naums
Beiträge: 740
Registriert: Sa Jan 02, 2010 10:40 pm
Kontaktdaten:

Re: Finde die Sicherheitslücke ;)

Beitrag von naums » Mi Jan 16, 2013 10:23 am

okay, ich benutze meistens:

Code: Alles auswählen

i--; // anstelle von --i;
Deshalb war mir der og. Umstand nicht bewusst.
.globl truth
truth:
mov r0, #42
mov pc, lr

Benutzeravatar
Yoghurt
Beiträge: 79
Registriert: Fr Nov 16, 2012 8:01 am
Wohnort: Niederbayern

Re: Finde die Sicherheitslücke ;)

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."

Benutzeravatar
Kerli
Beiträge: 1456
Registriert: So Jul 06, 2008 10:17 am
Wohnort: Österreich
Kontaktdaten:

Re: Finde die Sicherheitslücke ;)

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

Re: Finde die Sicherheitslücke ;)

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.
^^

Antworten