Informationssicherheit, 4. Übung


Aufgabe 1, 5 Punkte, Gruppe

Löst in unserer CTF-Plattform
die Challenge Überlauf. Erstellt dazu einen Container, mit dem Ihr
Euch per SSH verbindet. Ihr findet dort das ausführbare Programm
buf, das Ihr mittels ./buf starten könnt.

Das Programm erwartet eine Eingabe. Dokumentiert, was passiert, wenn
die Länge Eurer Eingaben nach und nach immer größer wird. Erstellt
sinnvoll Screenshots.

Erklärt dazu jeweils im Einzelnen, was intern (im Speicher)
passiert
--- wieso verhält sich das Programm so wie beobachtet? Wie
sieht der (C++-)Code des Programms wahrscheinlich aus?

Bei bestimmten Eingaben kommt eine Einbruchswarnung. Welcher
Schutzmechanismus wurde dafür wahrscheinlich verwendet? Wie
funktioniert er?

Legt Euch zum Testen des Programms am besten Eingabedateien mit
verschieden langen Zeilen zurecht oder erzeugt den Input per
Kommandozeile wie in

ruby -e 'puts "x"*3' | ./buf  

Aufgabe 2, 3 Punkte, Gruppe

Was müsste man ändern, damit die Probleme in Aufgabe 1 nicht mehr
auftreten? Erstellt ein minimales C++-Programm, das ein Passwort
einliest, ohne dass ein Überlauf auftreten kann. Nennt mindestens eine
Quelle, die Euch dabei geholfen hat.

Testet Euer Programm sinnvoll mit verschiedenen Eingabewerten
(Dokumentation nicht vergessen).

Bindet Euren Programmcode in Eure Aufgabenlösung ein und gebt Euren
Programmcode sowie ein Makefile mit ab. Programme, die nicht
kompiliert und ausgeführt werden können, werden nicht gewertet.

Referenzplattformen sind der Rechner x03 im Fachbereichsnetz sowie
die aus unseren VM-Images erstellten virtuellen Maschinen.


Abgabe

bis 2024-11-14 23:59 UTC, digital in Stud.IP als zip-Archiv mit einer
Markdown-Datei, einem gerenderten PDF dieser Markdown-Datei und allen
Dateien, die die Markdown-Datei zum Rendern braucht. Als Dateinamen
verwendet Ihr isec24_ueb04_grpYY.(md|pdf|zip) (Das YY mit Eurer
Gruppennummer ersetzen). Dabei bitte in der Datei alle
Gruppenmitglieder namentlich nennen. Ebenso die Nummer Eurer Gruppe in
Stud.IP.

Bitte steckt die Energie ins Denken und Schreiben, nicht in eine
wunderschöne Formatierung — lesbar darf es allerdings sein. Die
Lösungswege sollten nachvollziehbar sein.

Wenn Ihr Euch irgendwelcher Quellen bedient (Anleitungen, Howtos,
andere Gruppe, etc.), gebt diese bitte an (Quellen aus dem Netz bitte
gleich als URI).

Carsten Bormann, Karsten Sohr, Stefanie Gerdes, Jan-Frederik
Rieckers, Finn Ewers, Andreas Benischke ·
isec@tzi.org
, WS 2024/25

Übung

Von cat
Erster Teil: 7e;:24b5,2e0<+4g6
Zweite Teil von cat: -`cf5(330af23bf4f6

111111111111111111111111
Erster Teil von programm: 7d9961d5-0f49-4f49

104 Eingabeversuche mit
1111111111111111111111111111111111111111h
Zweite Teil von programm: -aae1-531ce66df5d5
flag{7d9961d5-0f49-4f49-aae1-531ce66df5d5}

For Name

aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa_____
1111111111111111111111111111111111111111111111111111111111111111111111111

Hab Gruppe 20 geholfen

scp -P20658 isecuser@ctf.informatik.uni-bremen.de:buf .

objdump -d buf

Decompiler Explorer

IndexVariableTypInitial
0 - 8s1Input
9 - 24v28str”GreennfClam2yW”
25 - 34v29str”GBuynDusj”
35 - 40v30str”Herr”
41 - 44v31Int6
main() {  
	char input[9]   = "[NULL]"  
	char a[16]      = "Green[NULL]nfClam2yW[NULL]"  
	char b[10]      = "GBuynDusj[NULL]"  
	char c[5]       = "Herr[NULL]"  
	unsigned int tries = 6  
	  
	while ( tries ) {  
		print("Guten Tag {c} {a}. Bitte gib Dein Passwort ein. Du hast noch {tries} Versuche.")  
		  
		input = readInput();  
		if ( tries == 104 )  
		{  
			token = decrypt("-`cf5(330af23bf4f6")  
			print("\n**** Der zweite Teil der Flag ist {token}. ****")  
			exit(1);  
		}  
		  
		if ( input[0..9] != a[6..16] )  
		{  
			print("{input} nicht korrekt. Versuch es noch einmal.\n")  
		}  
		else if ( b[0..9] == "GBuynDusj")  
		{  
			token = decrypt("7e;:24b5,2e0<+4g6:")  
			print("**** Der erste Teil der Flag ist {token}. ****")  
		}  
		else  
		{  
			print("!!!!Einbruchsversuch entdeckt! Login verhindert!!!!")  
			v29 = "GBuynDusj"  
			&a[6] = "nfClam2yW"  
			a = "Green"  
			continue;  
		}  
		tries--;  
	}  
}  
return 0;