Canaries

Benutzeravatar
misafir
Windoof-User
Windoof-User
Beiträge: 26
Registriert: 19. Okt 2008 05:13

Canaries

Beitrag von misafir »

In der Vorlesung "Security Engineering(Practical part)" wird ein Verfahren vorgestellt, dass vor einem Buffer Overflow Angriff schützen soll -> Canaries.
Meine Frage richtet sich bzgl. des terminierenden Zeichens "\0\n"..

Sagen wir mal wir haben ein Stack folgendermaßen Aufgebaut
----------------
|.RIP.........|
----------------
|.Canary.....|
----------------
|.BUF.........|
----------------

Der Puffer ist ein 4 Byte Puffer. In dem Canary ist folgendes drin: "\0\0\0\0" oder "\n\n\n\n".
Das Programm fragt mich nach einer Eingabe, welches in den Puffer reinkopiert wird mittels einer ungeschützten.

Ich kann somit folglich mittels Perl ( perl -e '{ printf "1234\n\n\n\n"; printf $neueRuecksprungAdresse; }' ) trotzdem die Rücksprungadresse überschreiben ohne den Canary zu verändern bzw. mit anderen Werten zu befüllen sodass ein Alarm ausgelößt wird. Das Programm wird somit normal ausgeführt und zum Schluss wird der Benutzer zu der von mir eingeschleusten Rücksprungadresse befördert.

Oder nicht?

Somit wäre das kein Schutz für zum Beispiel die Rücksprungadresse wie es gesagt wurde.

Korrigiert mich :roll:

tanne
Endlosschleifenbastler
Endlosschleifenbastler
Beiträge: 162
Registriert: 30. Sep 2008 16:05

Re: Canaries

Beitrag von tanne »

ja aber dazu musst du wissen was genau in dem canary steht, der ist in der regel ja nicht so einfach aufgebaut.

Benutzeravatar
DominikSchreiber
Windoof-User
Windoof-User
Beiträge: 37
Registriert: 28. Sep 2009 16:03

Re: Canaries

Beitrag von DominikSchreiber »

Der Canary den du da beschreibst richtet sich ja explizit gegen strcpy, weil das abbricht, wenn es ein 0 / '\n' findet. Damit funktionert dein Perl-Code nicht, weil er garnicht ganz eingelesen wird (sondern nur der Teil vor dem Canary - denn danach terminiert strcpy wegen dem Terminator). Natürlich nur, wenn wirklich strcpy verwendet wird.

Als Alternative schreibt man random in den Canary und vergleicht dann. Dadurch hast dus noch wesentlich schwerer, weil du halt dieses random genau treffen musst.

Insofern sind Canaries nicht so sinnfrei wie zunächst vermutet, helfen aber wie gesagt nur gegen stackbasierte Angriffe, lokale Variablen kannst du ja trotzdem überschreiben wie du lustig bist.
Wer im Schlachthaus sitzt, sollte nicht mit Schweinen werfen.

Benutzeravatar
misafir
Windoof-User
Windoof-User
Beiträge: 26
Registriert: 19. Okt 2008 05:13

Re: Canaries

Beitrag von misafir »

Dann würde es zu der Befüllung mit Random Zahlen keinen Unterschied machen. Mir kommt es aber vor als meinte Lukas Kalabis in genau der Vorlesung wo es behandelt wird, dass die Terminatoren ( so nenn ichs mal ) schon etwas anderes bewirken.

Hat das Befüllen des Canary Bereichs mit Terminatoren einen weitere Wirkung als das Befüllen mittels Random Zahlen? Diesen Punkt habe ich nicht so richtig verstanden.


Update:

Hab das Posting von Dominik Schreiber nach diesem Beitrag gelesen weil ich vermutlich langsam getippt und er derweil schon ne Antwort geschrieben hatte.
Danke @ Dominik. Bei strcpy würde es Sinn machen, dass der dann genau an dem Terminator stoppt. Bei dem Einlesen mittels gets hast du immernoch das Problem, dass er auch Terminatoren einliest und in den Stack schreibt ohne abzubrechen. Somit kann man trotzdem die RIP überschreiben, falls es ein gets gibt.

Update 2:
Also der Pearl Code würde wie auch oben erwähnt nicht funktionieren. Die Benutzereingabe mittels Strg+2 (^@) welches auch einen Terminator (0) erzeugt könnte man bei der Aufforderung einer Eingabe dem Programm übergeben und mittels eines Pufferüberlaufs die Canary überschreiben und danach die Rücksprungadresse modifizieren.

Antworten

Zurück zu „Archiv“