Die Mathe-Redaktion - 15.11.2019 00:41 - Registrieren/Login
Auswahl
ListenpunktHome
ListenpunktAktuell und Interessant ai
ListenpunktArtikelübersicht/-suche
ListenpunktAlle Links / Mathe-Links
ListenpunktFach- & Sachbücher
ListenpunktMitglieder / Karte / Top 15
ListenpunktRegistrieren/Login
ListenpunktArbeitsgruppen
Listenpunkt? im neuen Schwätz
ListenpunktWerde Mathe-Millionär!
ListenpunktFormeleditor fedgeo
Schwarzes Brett
Aktion im Forum
Suche
Stichwortsuche in Artikeln und Links von Matheplanet
Suchen im Forum
Suchtipps

Bücher
Englische Bücher
Software
Suchbegriffe:
Mathematik bei amazon
Naturwissenschaft & Technik
In Partnerschaft mit Amazon.de
Kontakt
Mail an Matroid
[Keine Übungsaufgaben!]
Impressum

Bitte beachten Sie unsere Nutzungsbedingungen, die Distanzierung, unsere Datenschutzerklärung und
die Forumregeln.

Sie können Mitglied werden. Mitglieder können den Matheplanet-Newsletter bestellen, der etwa alle 2 Monate erscheint.

Der Newsletter Okt. 2017

Für Mitglieder
Mathematisch für Anfänger
Wer ist Online
Aktuell sind 664 Gäste und 11 Mitglieder online.

Sie können Mitglied werden:
Klick hier.

Über Matheplanet
 
Zum letzten Themenfilter: Themenfilter:
Matroids Matheplanet Forum Index
Moderiert von matroid
Informatik » Algorithmen / Datenstrukturen » Passwort umgehen in Funktion
Druckversion
Druckversion
Antworten
Antworten
Autor
Universität/Hochschule Passwort umgehen in Funktion
Bfg97
Aktiv Letzter Besuch: in der letzten Woche
Dabei seit: 13.01.2018
Mitteilungen: 101
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Themenstart: 2019-10-22 15:50


Hallo,
Ich soll zum angegebenen Code ein alternatives Passwort konstruieren, das mir Zugang gewährt.

Dies ist der Code:

int main() {
2 char passok = 'F';
3 char password [6];
4 printf (" Passwort: ");
5 gets(password );
6 if (! strcmp(password , "hallo ")) { passok = 'T'; }
7 if (passok == 'T') { printf ("%s", "Willkommen !\n"); }
8 else { printf ("%s", "Falsches Passwort !\n"); }
9 return 0;
10 }


Warum der Code angreifbar ist, ist mir klar, was sich mir aber entzieht ist, wie man einen neuen String finden soll, der einem Zugang gewährt. Ich habe zunächst hallo in Binärcode umgewandelt, was mir letztenendes aber nichts gebracht hat. Wild drauf los raten ist wohl auch nicht die Lösung^^ Eine Vermutung von mir wäre, dass man aufgrund der gets()-Funktion einen Bufferoverflow erreichen kann, der einem dann unter Umständen einen alternativen Code verraten kann.



  Profil  Quote  Link auf diesen Beitrag Link
ligning
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 07.12.2014
Mitteilungen: 2808
Aus: Berlin
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.1, eingetragen 2019-10-22 15:57


Dir ist klar, wieso der Code angreifbar ist? Prima, wieso denn?


-----------------
⊗ ⊗ ⊗



  Profil  Quote  Link auf diesen Beitrag Link
Bfg97
Aktiv Letzter Besuch: in der letzten Woche
Dabei seit: 13.01.2018
Mitteilungen: 101
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.2, vom Themenstarter, eingetragen 2019-10-22 17:24


2019-10-22 15:57 - ligning in Beitrag No. 1 schreibt:
Dir ist klar, wieso der Code angreifbar ist? Prima, wieso denn?

Die Funktion gets() überprüft die Eingabelänge nicht und schreibt darum alles, was zu viel ist in Plätze, die unter Umständen schon belegt sind. Zudem gibt es nur eine Ein-Phasen-Authentifizierung, was ebenfalls nicht sicher ist, genauso wie die Information, das man explizit das Passwort falsch eingegeben hat. Wir sollten den Code im Hinblick auf die in der Vorlesung behandelten Entwurfsprinzipien für sichere Systeme beleuchten und aufgrund derer sagen, weshalb der Code angreifbar ist. Inwiefern das hilft das alternative Passwort zu finden, weiß ich nicht



  Profil  Quote  Link auf diesen Beitrag Link
ligning
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 07.12.2014
Mitteilungen: 2808
Aus: Berlin
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.3, eingetragen 2019-10-22 17:35


Also ist dir nicht klar, wieso der Code angreifbar ist :-/

Um es mal explizit auszusprechen: Das Ziel ist es, die Variable passok mit dem Wert 'T' zu belegen, damit die Willkommensnachricht ausgegeben wird. Wie könnte man das konkret erreichen?



  Profil  Quote  Link auf diesen Beitrag Link
Bfg97
Aktiv Letzter Besuch: in der letzten Woche
Dabei seit: 13.01.2018
Mitteilungen: 101
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.4, vom Themenstarter, eingetragen 2019-10-22 17:59


2019-10-22 17:35 - ligning in Beitrag No. 3 schreibt:
Also ist dir nicht klar, wieso der Code angreifbar ist :-/

Um es mal explizit auszusprechen: Das Ziel ist es, die Variable passok mit dem Wert 'T' zu belegen, damit die Willkommensnachricht ausgegeben wird. Wie könnte man das konkret erreichen?

Man gibt das Passwort ein, einen String, der sich in seiner Beschaffenheit mit hallo deckt oder man weist passok den Wert über Konsolenbefehle zu. Das wären meine Vermutungen



  Profil  Quote  Link auf diesen Beitrag Link
ligning
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 07.12.2014
Mitteilungen: 2808
Aus: Berlin
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.5, eingetragen 2019-10-22 18:11



Die Funktion gets() überprüft die Eingabelänge nicht und schreibt darum alles, was zu viel ist in Plätze, die unter Umständen schon belegt sind.
Wie wärs damit? Kann gets u.U. den Speicherplatz überschreiben, in dem passok liegt?



  Profil  Quote  Link auf diesen Beitrag Link
Bfg97
Aktiv Letzter Besuch: in der letzten Woche
Dabei seit: 13.01.2018
Mitteilungen: 101
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.6, vom Themenstarter, eingetragen 2019-10-22 18:13


2019-10-22 18:11 - ligning in Beitrag No. 5 schreibt:

Die Funktion gets() überprüft die Eingabelänge nicht und schreibt darum alles, was zu viel ist in Plätze, die unter Umständen schon belegt sind.
Wie wärs damit? Kann gets u.U. den Speicherplatz überschreiben, in dem passok liegt?

Schätze schon, aber ich wüsste nicht, wie ich das anstellen soll. Wenn ich ein zu langes Passwort eingebe, weiß ich ja nicht, wo gets das nun hingeschrieben hat



  Profil  Quote  Link auf diesen Beitrag Link
ligning
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 07.12.2014
Mitteilungen: 2808
Aus: Berlin
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.7, eingetragen 2019-10-22 18:17


Deshalb sollst du dir ja, siehe Aufgabenstellung, auch Gedanken über das Speicherlayout machen.



  Profil  Quote  Link auf diesen Beitrag Link
Bfg97
Aktiv Letzter Besuch: in der letzten Woche
Dabei seit: 13.01.2018
Mitteilungen: 101
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.8, vom Themenstarter, eingetragen 2019-10-22 18:28


2019-10-22 18:17 - ligning in Beitrag No. 7 schreibt:
Deshalb sollst du dir ja, siehe Aufgabenstellung, auch Gedanken über das Speicherlayout machen.

Wenn ich diese Aussagen richtig verstanden habe:
- Jeder Datentyp besteht aus Bytes, die alle hintereinander liegen
- Zwei im Codeblock hintereinander definierte Datetypen liegen entgegen der Wachstumsrichtung des Speichers im Speicher

Dann müsste password vor passok kommen. Da password ein String ist mit 6 Zeichen, müsste man mit einem siebenstelligen Passwort (wobei das letzte auch der Nullterminator \0 sein kann) den Wert von passok überschreiben. Liege ich mit meiner Vermutung richtig? :)



  Profil  Quote  Link auf diesen Beitrag Link
ligning
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 07.12.2014
Mitteilungen: 2808
Aus: Berlin
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.9, eingetragen 2019-10-22 18:37


1. Ja, Speicher besteht aus Bytes.
2. Ja, aber du meinst die Wachstumsrichtung des Stacks.

Das sind vernünftige Annahmen, die man machen kann.

In der Realität ist das ein bisschen komplizierter, man muss Sachen wie Alignment, Padding, Optimierung usw. beachten. Aber ich glaube hier geht es eher um das Prinzip.


Dann müsste password vor passok kommen. Da password ein String ist mit 6 Zeichen, müsste man mit einem siebenstelligen Passwort (wobei das letzte auch der Nullterminator \0 sein kann) den Wert von passok überschreiben. Liege ich mit meiner Vermutung richtig? :)
Ja. Damit müsstest du jetzt ein konkretes geeignetes "Passwort" angeben können.



  Profil  Quote  Link auf diesen Beitrag Link
Bfg97
Aktiv Letzter Besuch: in der letzten Woche
Dabei seit: 13.01.2018
Mitteilungen: 101
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.10, vom Themenstarter, eingetragen 2019-10-22 18:46


2019-10-22 18:37 - ligning in Beitrag No. 9 schreibt:
1. Ja, Speicher besteht aus Bytes.
2. Ja, aber du meinst die Wachstumsrichtung des Stacks.

Das sind vernünftige Annahmen, die man machen kann.

In der Realität ist das ein bisschen komplizierter, man muss Sachen wie Alignment, Padding, Optimierung usw. beachten. Aber ich glaube hier geht es eher um das Prinzip.


Dann müsste password vor passok kommen. Da password ein String ist mit 6 Zeichen, müsste man mit einem siebenstelligen Passwort (wobei das letzte auch der Nullterminator \0 sein kann) den Wert von passok überschreiben. Liege ich mit meiner Vermutung richtig? :)
Ja. Damit müsstest du jetzt ein konkretes geeignetes "Passwort" angeben können.

Ich habe jetzt einige siebenstellige Passwörter ausprobiert, aber leider bekomme ich trotzdem nicht die gewünschte Meldung. Ich glaube, dass ich irgendwas übersehen oder nicht ganz verstanden habe. Ich kann doch jetzt irgendein Passwort mit 7 Zeichen eingeben und müsste dann Zugang erhalten? Das wäre aber etwas zu einfach und funktioniert ohnehin nicht...leider fällt mir gerade nichts mehr ein



  Profil  Quote  Link auf diesen Beitrag Link
ligning
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 07.12.2014
Mitteilungen: 2808
Aus: Berlin
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.11, eingetragen 2019-10-22 19:56


Du hast irgendwie den Teil überlesen, indem ich gesagt habe, dass das in der Realität komplizierter ist. Ich will nicht behaupten, dass es schwer zu reproduzieren ist, aber wenn du völlig unbedarft einfach den Code durch den Compiler jagst und ausführst bestehen gute Chancen, dass es nicht funktioniert. Wichtiger ist erstmal, dass du das Prinzip verstehst. Was für Passwörter hast du denn so ausprobiert?



  Profil  Quote  Link auf diesen Beitrag Link
Bfg97
Aktiv Letzter Besuch: in der letzten Woche
Dabei seit: 13.01.2018
Mitteilungen: 101
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.12, vom Themenstarter, eingetragen 2019-10-22 20:10


2019-10-22 19:56 - ligning in Beitrag No. 11 schreibt:
Du hast irgendwie den Teil überlesen, indem ich gesagt habe, dass das in der Realität komplizierter ist. Ich will nicht behaupten, dass es schwer zu reproduzieren ist, aber wenn du völlig unbedarft einfach den Code durch den Compiler jagst und ausführst bestehen gute Chancen, dass es nicht funktioniert. Wichtiger ist erstmal, dass du das Prinzip verstehst. Was für Passwörter hast du denn so ausprobiert?

Beispielsweise abcdefT, abcde\0, gotoliN



  Profil  Quote  Link auf diesen Beitrag Link
ligning
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 07.12.2014
Mitteilungen: 2808
Aus: Berlin
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.13, eingetragen 2019-10-22 20:15


Das erste ist gut. Warum hast du die anderen ausprobiert? Nochmal: Das Ziel ist, den Inhalt von passok mit 'T' zu überschreiben. Dazu musst du ein T eingeben, und gets muss dieses T in den Speicherplatz, der zu passok gehört, schreiben. Die Eingabe abcdefT funktioniert unter der Voraussetzung, dass im Speicher die Variable passok unmittelbar an das Array password anschließt. Ob das in der Praxis auch so ist, hängt wie gesagt vom Compiler, insbesondere von den Compilereinstellungen ab.



  Profil  Quote  Link auf diesen Beitrag Link
Bfg97
Aktiv Letzter Besuch: in der letzten Woche
Dabei seit: 13.01.2018
Mitteilungen: 101
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.14, vom Themenstarter, eingetragen 2019-10-22 21:00


2019-10-22 20:15 - ligning in Beitrag No. 13 schreibt:
Das erste ist gut. Warum hast du die anderen ausprobiert? Nochmal: Das Ziel ist, den Inhalt von passok mit 'T' zu überschreiben. Dazu musst du ein T eingeben, und gets muss dieses T in den Speicherplatz, der zu passok gehört, schreiben. Die Eingabe abcdefT funktioniert unter der Voraussetzung, dass im Speicher die Variable passok unmittelbar an das Array password anschließt. Ob das in der Praxis auch so ist, hängt wie gesagt vom Compiler, insbesondere von den Compilereinstellungen ab.

Welche Möglichkeit habe ich dies zu überprüfen? Ich habe das Programm innerhalb einer VM in Ubuntu geschrieben und nutze als Compiler clang

P.S. Es hat jetzt funktioniert. Vielen Dank für Ihre Hilfe und einen schönen Abend :)



  Profil  Quote  Link auf diesen Beitrag Link
ligning
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 07.12.2014
Mitteilungen: 2808
Aus: Berlin
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.15, eingetragen 2019-10-22 22:27


Wenn ich das bei mir probiere:
$ ./a.out 
 Passwort: xxxxxxT
Falsches Passwort !
*** stack smashing detected ***: <unknown> terminated

Der Grund dafür ist erstens, dass der Compiler (gcc 7.4.0) die Variablen im Stackframe so anordnet, dass passok vor password kommt (egal wierum sie deklariert werden), und zweitens, dass er besonderen Code zur Prüfung, ob man über das Array hinausgeschrieben hat, generiert. (Interessanterweise versagt diese Prüfung bei der Eingabe des korrekten Passwortes, _obwohl_ die Arraygrenze auch dort überschrieben wird! Nämlich mit dem abschließenden Nullbyte, aber da stand anscheinend auch vorher eine Null ...)



  Profil  Quote  Link auf diesen Beitrag Link
Bfg97 hat die Antworten auf ihre/seine Frage gesehen.
Bfg97 hatte hier bereits selbst das Ok-Häkchen gesetzt.
Bfg97 wird per Mail über neue Antworten informiert.
Neues Thema [Neues Thema] Antworten [Antworten]    Druckversion [Druckversion]

 


Wechsel in ein anderes Forum:
 Suchen    
 
All logos and trademarks in this site are property of their respective owner. The comments are property of their posters, all the rest © 2001-2019 by Matroids Matheplanet
This web site was made with PHP-Nuke, a web portal system written in PHP. PHP-Nuke is Free Software released under the GNU/GPL license.
Ich distanziere mich von rechtswidrigen oder anstößigen Inhalten, die sich trotz aufmerksamer Prüfung hinter hier verwendeten Links verbergen mögen.
Lesen Sie die Nutzungsbedingungen, die Distanzierung, die Datenschutzerklärung und das Impressum.
[Seitenanfang]