| Vorheriges Thema anzeigen :: Nächstes Thema anzeigen | 
	
	
		| Autor | Nachricht | 
	
		| Cherry 
 
 
 Anmeldungsdatum: 20.06.2007
 Beiträge: 249
 
 
 | 
			
				|  Verfasst am: 27.07.2012, 02:52    Titel: CrackMe |   |  
				| 
 |  
				| Ich habe heute dieses Programm von AndT gefunden: http://www.freebasic.net/forum/viewtopic.php?f=7&t=17488 
 Ich hab jetzt was ähnliches gemacht, es ist allerdings noch trickreicher.
 
 Es ist auch ein Hacking-Spiel. Ziel ist es hier, den Server zu crashen (d.h. zur "FATAL EXCEPTION"-Ausgabe zu kommen).
 
 Regeln:
 1) Code lesen ist erlaubt. (Ansonsten würdet ihr es wohl nie schaffen.)
 2) Code modifizieren ist verboten.
 3) Die EXE zu hacken ist verboten (also nicht per Debugger Code umschreiben oder im Speicher was ändern.)
 Code einfach "as-is" verwenden.
 
 Wenn ihr es schafft, posted wie ihr es geschafft habt!
 
 
  	  | Code: |  	  | Enum Boolean TRUE = -1
 FALSE
 End Enum
 
 Enum EPrivilegeLevel
 PRIV_NONE = 0
 PRIV_USER = 32
 PRIV_ADMIN = 64
 End Enum
 
 Type TUser
 Name As ZString * 16
 Password As ZString * 16
 PrivilegeLevel As EPrivilegeLevel
 End Type
 
 Dim Shared Users(...) As TUser = { _
 ("guest", "", PRIV_USER), _
 ("bob", "dha72", PRIV_USER), _
 ("ronald", "hhs6fsd", PRIV_USER), _
 ("macgyver", "tehbest", PRIV_ADMIN), _
 ("t_rex", "91kfds4", PRIV_ADMIN) _
 }
 
 Function IsRemoteAccess() As Boolean
 ' Since we are simulating remote access, this function always returns TRUE
 Return TRUE
 End Function
 
 Sub Console(User As TUser)
 ' Normally, here would be a nice console
 ' For this simulation, it's enough to output the privilege level
 Print
 Print "Welcome, " & User.Name & "!"
 Select Case User.PrivilegeLevel
 Case PRIV_NONE
 Print "An internal error occured!"
 Beep()
 Case PRIV_USER
 Print "You have user privileges."
 ' A little simulation of user input.
 Print "~ $ ";
 Sleep(500, 1)
 Print "echo Yeah, here is a console! (Or would be.)"
 Sleep(500, 1)
 Print "Yeah, here is a console! (Or would be.)"
 Print "~ $ ";
 Sleep(500, 1)
 Print "killall -9 init"
 Sleep(500, 1)
 Print "Access denied"
 Print "~ $ ";
 Sleep(500, 1)
 Print "logout"
 Sleep(500, 1)
 Print "You have been logged out."
 Case PRIV_ADMIN
 Print "You have admin privileges."
 ' A little simulation of user input.
 Print "~ # ";
 Sleep(500, 1)
 Print "echo Yeah, here is a console! (Or would be.)"
 Sleep(500, 1)
 Print "Yeah, here is a console! (Or would be.)"
 Print "~ # ";
 Sleep(500, 1)
 Print "killall -9 init"
 Sleep(500, 1)
 Print "FATAL EXCEPTION: init process was killed!"
 Beep()
 Sleep
 End(0)
 End Select
 End Sub
 
 Sub AskForCredentials(ByRef Username As ZString, ByRef Password As ZString)
 Print
 Input "Enter username: ", Username
 Input "Enter password: ", Password
 End Sub
 
 Sub Main()
 Print "Welcome to Cherry Networks!"
 If IsRemoteAccess() Then
 Print "*** You are using remote login. Only guests and normal users are allowed. ***"
 EndIf
 Print
 
 Do
 Dim CurrentUser As TUser
 AskForCredentials(CurrentUser.Name, CurrentUser.Password)
 
 For i As Integer = LBound(Users) To UBound(Users)
 If Users(i).Name = CurrentUser.Name AndAlso Users(i).Password = CurrentUser.Password Then
 If Users(i).PrivilegeLevel = PRIV_ADMIN AndAlso IsRemoteAccess() Then
 Print "Remote access for administrators not allowed!"
 Print "(This has been enabled to prevent script kiddies from doing any damage"
 Print "on the server.)"
 Else
 CurrentUser.PrivilegeLevel = Users(i).PrivilegeLevel
 EndIf
 EndIf
 Next
 
 If CurrentUser.PrivilegeLevel = PRIV_NONE Then
 Print "Login failed! Please try again!"
 Beep()
 Else
 Console(CurrentUser)
 EndIf
 Loop
 End Sub
 
 Main()
 | 
 
 Ich habe da keine Konsole eingebaut, nur eine kleine "Konsolensimulation".
 
 Es ist wirklich möglich, es zu hacken, auch wenn es am Anfang unmöglich aussieht.
 
 Viel Spaß!
 Cherry
 |  | 
	
		| Nach oben |  | 
	
		|  | 
	
		| Westbeam 
 
  
 Anmeldungsdatum: 22.12.2009
 Beiträge: 760
 
 
 | 
			
				|  Verfasst am: 27.07.2012, 10:28    Titel: |   |  
				| 
 |  
				| Schon schwierig. Wenn ich mich als Admin anmelden will, dann sagt er mir "Remote access for administrators not allowed!".   
 Liegt die Lösung dadrin, dem Programm irgendwie zu sagen, dass man sich nicht über RemoteAccess einloggt?
 |  | 
	
		| Nach oben |  | 
	
		|  | 
	
		| Cherry 
 
 
 Anmeldungsdatum: 20.06.2007
 Beiträge: 249
 
 
 | 
			
				|  Verfasst am: 27.07.2012, 12:32    Titel: |   |  
				| 
 |  
				| Nein. Wenn du den Code ändern dürftest, wäre das der einfachste Anhaltspunkt, aber das geht ja nicht! 
 Tip: Der Admin hat wohl versucht, die Script Kiddies abzuwehren, aber dabei einen Bug am System selbst übersehen, der noch schlimmer ist...
 |  | 
	
		| Nach oben |  | 
	
		|  | 
	
		| Westbeam 
 
  
 Anmeldungsdatum: 22.12.2009
 Beiträge: 760
 
 
 | 
			
				|  Verfasst am: 27.07.2012, 12:51    Titel: |   |  
				| 
 |  
				| Ich nehme an, der Bug ist in diesem kleinen Codefetzen drin? 
  	  | Code: |  	  | If Users(i).PrivilegeLevel = PRIV_ADMIN AndAlso IsRemoteAccess() Then Print "Remote access for administrators not allowed!"
 Print "(This has been enabled to prevent script kiddies from doing any damage"
 Print "on the server.)"
 Else
 CurrentUser.PrivilegeLevel = Users(i).PrivilegeLevel 'Genauer gesagt hier?
 EndIf
 | 
 Dummerweise sehe ich da kein Schlupfloch, um dann doch noch Adminrechte zu bekommen.
  |  | 
	
		| Nach oben |  | 
	
		|  | 
	
		| Cherry 
 
 
 Anmeldungsdatum: 20.06.2007
 Beiträge: 249
 
 
 | 
			
				|  Verfasst am: 27.07.2012, 12:56    Titel: |   |  
				| 
 |  
				| Genaugenommen kann man den Bug NICHT ausnutzen, wenn man die von dir markierte Zeile erreicht - es muss ein anderer Codepfad genommen werden. 
 Der Bug ist aber viel subtiler.
 
 Ein Tip: Der Bug kann das Programm auch abstürzen lassen, wenn er auf die falsche Weise ausgelöst wird.
 |  | 
	
		| Nach oben |  | 
	
		|  | 
	
		| Westbeam 
 
  
 Anmeldungsdatum: 22.12.2009
 Beiträge: 760
 
 
 | 
			
				|  Verfasst am: 27.07.2012, 13:12    Titel: |   |  
				| 
 |  
				| Verdammt, das ist nicht einfach. Ich komme aber auch nicht drauf. Soweit ich das verstanden habe, hat man nur 6 Möglichkeiten am Anfang. Die ersten 5 sind die 5 möglichen Nutzernamen, von denen 3 nicht zum Ziel führen und die anderen beiden nicht verfügbar sind. Der sechste Fall ist ein falscher Login, der einen aber unweigerlich wieder zum Anfang bringt.  |  | 
	
		| Nach oben |  | 
	
		|  | 
	
		| Cherry 
 
 
 Anmeldungsdatum: 20.06.2007
 Beiträge: 249
 
 
 | 
			
				|  Verfasst am: 27.07.2012, 13:14    Titel: |   |  
				| 
 |  
				| WeitereTips gebe ich jetzt per PM, um nicht selber alles zu spoiler. |  | 
	
		| Nach oben |  | 
	
		|  | 
	
		| Jojo alter Rang
 
  
 Anmeldungsdatum: 12.02.2005
 Beiträge: 9736
 Wohnort: Neben der Festplatte
 
 | 
			
				|  Verfasst am: 27.07.2012, 13:47    Titel: |   |  
				| 
 |  
				| Ich würde spontan die Eingabe macgyver
 tehbest\0@@@@@@@@@
 probieren.
   (Habe aber kein FB installiert und kann es somit nicht verifizieren. Escaping-Bugs könnt ihr behalten).
 _________________
 » Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
 
  |  | 
	
		| Nach oben |  | 
	
		|  | 
	
		| Cherry 
 
 
 Anmeldungsdatum: 20.06.2007
 Beiträge: 249
 
 
 | 
			
				|  Verfasst am: 27.07.2012, 13:54    Titel: |   |  
				| 
 |  
				| Jojo ist auf der richtigen Spur, die Antwort stimmt aber noch nicht. |  | 
	
		| Nach oben |  | 
	
		|  | 
	
		| Jojo alter Rang
 
  
 Anmeldungsdatum: 12.02.2005
 Beiträge: 9736
 Wohnort: Neben der Festplatte
 
 | 
			
				|  Verfasst am: 27.07.2012, 13:57    Titel: |   |  
				| 
 |  
				| Da haste recht, ich hab zu kompliziert gedacht. Es genügt die Eingabe:
 @@@@@@@@@@@@@@@
 @@@@@@@@@@@@@@@@@
 
 
  	  | Zitat: |  	  | Genaugenommen kann man den Bug NICHT ausnutzen, wenn man die von dir markierte Zeile erreicht - es muss ein anderer Codepfad genommen werden. | 
 Nicht zwingendermaßen, wenn man die Rücksprungadresse überschreibt, ist das völlig egal. Aber diese Variante wäre natürlich auch wesentlich aufwendiger.
 _________________
 » Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
 
  |  | 
	
		| Nach oben |  | 
	
		|  | 
	
		| Cherry 
 
 
 Anmeldungsdatum: 20.06.2007
 Beiträge: 249
 
 
 | 
			
				|  Verfasst am: 27.07.2012, 14:09    Titel: |   |  
				| 
 |  
				| Nein, stimmt so auch noch nicht. 
 Tipp: Enums sind normalerweise Integer.
 
 Returnadresse überschreiben geht zwar auch, aber wirklich viel komplizierter, noch dazu wo Input keine Steuerzeichen mag.
 
 EDIT: Doch, es stimmt, hatte mich nur verschaut.
 
 Zuletzt bearbeitet von Cherry am 27.07.2012, 14:32, insgesamt einmal bearbeitet
 |  | 
	
		| Nach oben |  | 
	
		|  | 
	
		| Jojo alter Rang
 
  
 Anmeldungsdatum: 12.02.2005
 Beiträge: 9736
 Wohnort: Neben der Festplatte
 
 | 
			
				|  Verfasst am: 27.07.2012, 14:13    Titel: |   |  
				| 
 |  
				| Warum sollte das nicht genügen? Meines Wissens nach nullt FreeBASIC den Type bei der Initialisierung, d.h. ich überschreibe die ersten beiden Bytes von PrivilegeLevel mit 0x40 0x00, insgesamt also 0x40 0x00 0x00 0x00, d.h. 64. 
 Edit: Grade eine alte Installation von FBC gefunden und getestet: Funktioniert. A winner is me.
   
 
  	  | Code: |  	  | Welcome to Cherry Networks! *** You are using remote login. Only guests and normal users are allowed. ***
 
 
 Enter username: @@@@@@@@@@@@@@@
 Enter password: @@@@@@@@@@@@@@@@@
 
 Welcome, @@@@@@@@@@@@@@@!
 You have admin privileges.
 ~ # echo Yeah, here is a console! (Or would be.)
 Yeah, here is a console! (Or would be.)
 ~ # killall -9 init
 FATAL EXCEPTION: init process was killed!
 | 
 _________________
 » Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
 
  |  | 
	
		| Nach oben |  | 
	
		|  | 
	
		| Cherry 
 
 
 Anmeldungsdatum: 20.06.2007
 Beiträge: 249
 
 
 | 
			
				|  Verfasst am: 27.07.2012, 14:23    Titel: |   |  
				| 
 |  
				| Ja, stimmt. Ich hatte das vorher am Handy gelesen und da hat es so ausgesehen als hätte das Handy die @s umgebrochen und ich dachte du willst alle Zeichen als Passwort eingeben, was ja zu lang ist und den PrivilegeLevel dann ja auf &h40404040 gesetzt hätte. 
 (Genaugenommen sind Name und PW ja sogar vollkommen egal, solange das PW 17 Zeichen lang ist und mit @ endet.)
 
 Zuletzt bearbeitet von Cherry am 27.07.2012, 14:32, insgesamt einmal bearbeitet
 |  | 
	
		| Nach oben |  | 
	
		|  | 
	
		| nemored 
 
  
 Anmeldungsdatum: 22.02.2007
 Beiträge: 4710
 Wohnort: ~/
 
 | 
			
				|  Verfasst am: 27.07.2012, 14:30    Titel: |   |  
				| 
 |  
				| Draufgekommen wäre ich da jetzt nicht von allein - ist aber ziemlich cool.  _________________
 Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1.
 |  | 
	
		| Nach oben |  | 
	
		|  | 
	
		| Flo aka kleiner_hacker
 
 
 Anmeldungsdatum: 23.06.2006
 Beiträge: 1210
 
 
 | 
			
				|  Verfasst am: 27.07.2012, 17:56    Titel: |   |  
				| 
 |  
				| lalala, array- oder stringgrenzen überprüfen ist ja auch für spießer  _________________
 MFG
 Flo
 
 Satoru Iwata: Wer Spaß am Spielen hat, fragt nicht nach Grafik.
 
 zum korrekten Verstaendnis meiner Beitraege ist die regelmaessige Wartung des Ironiedetektors unerlaesslich.
 |  | 
	
		| Nach oben |  | 
	
		|  | 
	
		| MilkFreeze 
 
  
 Anmeldungsdatum: 22.04.2011
 Beiträge: 116
 
 
 | 
			
				|  Verfasst am: 28.07.2012, 23:19    Titel: |   |  
				| 
 |  
				| Habs auch raus. Ohne Jojo   
 Allerdings musste ich eine Ascii-tabelle hernehmen.
 
 Übrigens: Der HackIt wären interessanter, wenn die Passwörter der User alle 15-Stellig wären. Dann muss man zumindest daran denken, dass der input zumindest eine Abweichung zum Passwort haben muss. Und eventuell denkt da nicht jeder dran, sondern kopiert lustig das Passwort und hängt ein "@" dran.
 
 Mehr bitte.
 _________________
 Milch ftw
  |  | 
	
		| Nach oben |  | 
	
		|  | 
	
		| nemored 
 
  
 Anmeldungsdatum: 22.02.2007
 Beiträge: 4710
 Wohnort: ~/
 
 | 
			
				|  Verfasst am: 29.07.2012, 12:42    Titel: |   |  
				| 
 |  
				| Mit InputUsing wäre sowas ja nicht passiert.  _________________
 Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1.
 |  | 
	
		| Nach oben |  | 
	
		|  | 
	
		|  |