Hausarbeit: Stack-Overflow erzwingen

Gast #2224538
Lesenswert?

Hallo,

ich studiere Informations- und Elektrotechnik im 4.Semester an der 
Hochschule RheinMain.
Zur Zeit müssen wir eine Hausarbeit im Fach Mikrocomputertechnik 
schreiben.
Als Mikroprozessor steht uns der MC9S12DP256B von Freescale zur 
Verfügung.
Programmiert wird ausschließlich in Assembler Sprache.

Folgende Aufgabe ist gestellt:

In dieser Aufgabe soll das erste eigene Projekt erstellt werden. Dazu 
verwenden Sie als Prozessor den MC9S12DP256B.
Schreiben Sie ein Programm mit dem Sie einen Stack-Overflow erzwingen. 
Das heißt, dass die Ablage des Stacks nicht mehr aus dem Speicher zurück 
gelesen wird, sondern gegen die Speicherstelle $0000 läuft.

Die Art der Realisierung bleibt Ihnen überlassen. Doch sollten 
mindestens drei Schleifendurchgänge realisiert werden.

Dokumentieren Sie die Auswirkungen und halten Sie fest, ab welcher 
Adresse der Stack-
Overflow eintritt.

Meine Frage jetzt, was ist ein Stack-Overflow?? Ist damit einfach 
gemeint, das der Stack-Pointer einfach größer wird als FFFF ?

Vielen Dank
Martin
#2224548
Lesenswert?

Stack Overflow bedeutet man zuviel auf dem Stack. Das koennen 
Ruecksprung Adressen sein, die nicht abgeholt werden, oder Daten.

Zuviel Ruecksprung Adressen bekommt man indem man eine Funktionalitaet 
mit CALL anspringt, und dan nicht mehr mit einem RET, sondern mit einem 
JMP verlaesst.
Zuviel Daten bekommt man, indem man zu oft PUSHs, und zuwenig POPt.
Eine Kombination davon ist eine Rekursion (rekursive Funktion) ohne 
Abbruchkriterium.
Moderator Persönliche Seite #2224556
Lesenswert?

Martin Heinrich schrieb:
> ich studiere Informations- und Elektrotechnik im 4.Semester an der
> Hochschule RheinMain.
> [...}
> Meine Frage jetzt, was ist ein Stack-Overflow?? Ist damit einfach
> gemeint, das der Stack-Pointer einfach größer wird als FFFF ?

Nach 4 Semestern sollte man das eigentlich wissen...

Der Stackpointer läuft von "oben" nach "unten", d.h. er wandert immer 
weiter gegen 0, je mehr auf dem Stack liegt.

Aber das steht sogar in der Aufgabe:

> Das heißt, dass die Ablage des Stacks nicht mehr aus dem Speicher zurück
> gelesen wird, sondern gegen die Speicherstelle $0000 läuft.

Ein Stack-Überlauf ist einfach, das geht in Assembler mit einer Zeile.

Viel Spaß beim Lösen,

Frank
#2224595
Lesenswert?

Beim x86er:

label1: PUSH      ax
        JMP SHORT label1

Oder beim AVR:

label1: PUSH r16
        RJMP label1

Die zwei Zeilen Assembler reichen - sowie das Programm da reinläuft hast 
Du Spaß.

Allerdings wird Dir das bei µCs die Flash-Speicher für das Programm 
nutzen nicht viel bringen weil das Programm nicht überschrieben wird. Du 
kannst also keine Programme einschleusen und diese ausführen, das geht 
nur bei µCs die ihr Programm im RAM ablegen.
Gast #2224606
Lesenswert?

> Das heißt, dass die Ablage des Stacks nicht mehr aus dem Speicher zurück
> gelesen wird, sondern gegen die Speicherstelle $0000 läuft.

Aua.
Das ist keine Erklärung, das ist eine Verunklarung.

Stapelüberlauf (stack overflow) heißt, dass der Stapelzeiger (stack 
pointer) aus dem für diesen Stapel zugewiesenen Speicherbereich 
herausläuft, weil du zu viel auf den Stapel legst (in Assembler z.B. mit 
push).

Dabei können dann verschiedene schlimme Dinge passieren:

- Da sind andere Daten, die werden mit dem Stackinhalt überschrieben

- Beim Schreiben der anderen Daten wird der Stackinhalt überschrieben

- Da ist kein RAM und die Daten auf dem Stack sind futsch (oder es gibt 
eine Exception)

- Da ist I/O on es kann alles mögliche passieren
Persönliche Seite #2224610
Lesenswert?

Martin Heinrich schrieb:
> Meine Frage jetzt, was ist ein Stack-Overflow?? Ist damit einfach
> gemeint, das der Stack-Pointer einfach größer wird als FFFF ?

Ich würde sagen, du schaust dir zuallererst an, was ein Stack ist und 
wie er funktioniert.

Danach, was ein Heap ist und wie er funktioniert.

Danach, was es für Modelle gibt, um Stack und Heap aufzusetzen.

In deinem Projekt wird der Heap wohl NULL sein.

---
Der Stack läuft dann über, wenn zu viele Elemente draufliegen :-)
Das kann z.B. dadurch passieren, dass per PUSH zu viel auf den Stack 
geschoben wird, oder eine Rekursion zu tief ist, gemessen an ihren 
Daten.

---
Frage: Willst / Studierst du Automatisierung im Hauptstudium? Oder ist 
das wo was in der Art? **grins**
#2224623
Lesenswert?

Sorry, aber für mich macht ein Stack-Overflow bei nem µC(z.B. AVR) nur 
Sinn, wenn er von außen, z.B. über RS232 erzeugt wird. In meinem eigenen 
ASM-Programm in diesem Fall wohl eher nicht.

Man kann zwar keinen eigenen Code in den Flash des µC einschleusen, aber 
ein Programmabbruch (oder was auch immer passiert) wäre ein Ergebnis.

Es gibt genügend Literatur über getch() und co.

Eine interessante Diskussion wäre doch, ob man nicht über ein Interface 
in den Bootloader springen kann.
#2224643
Lesenswert?

Ben _ schrieb:
> Ein Stack Overflow macht eigentlich niemals Sinn. Außer beim
> Einschleusen von Schadprogrammen, aber da möchte ich nicht von Sinn
> sprechen!

Äh, das Einschleusen von Code kann auch zu deinem Nutzen sein. Es soll 
ja vorkommen, dass man Geräte entgegen ihrer vom Hersteller vorgesehenen 
Funktion verwenden möchte, z.B., weil du auf dem Smartphone deines 
Vertrauens dein eigenes OS benutzen willst und dich ein restriktiver 
Bootloader daran hintern soll.
Pufferüberläufe passieren einfach, und man kann sie auch für seinen 
Zweck nutzen. Punkt.

Aber wie schön, wenn es für Andere so eine klare Unterteilung in Gut und 
Böse gibt. ;-)
#2224939
Lesenswert?

Derek schrieb:
> Dennis S. schrieb:
>> weil du auf dem Smartphone deines
>> Vertrauens dein eigenes OS benutzen willst
>
> Du schreibst dein eigenes OS für Smartphones?
> Wohl kaum.

„dein selbst kompiliertes OS“ oder „ein OS, dessen Bestandteile du 
selbst zusammengestellt hast“ wäre wohl die genauere Formulierung 
gewesen.
Oder kurz: Irgendwas, das nicht vom Telefonhersteller signiert wurde.
#2224944
Lesenswert?

"Das heißt, dass die Ablage des Stacks nicht mehr aus dem Speicher 
zurück
gelesen wird, sondern gegen die Speicherstelle $0000 läuft."

Also die Aufgabenstellung ist ja interessant... An sich tritt der 
Stackoverflow schon deutlich früher auf, und zwar wenn der Stack die 
erste Variable erreicht. Der muss nicht mal bis $0000 kommen, $0100 
reicht auch, wenn dort deine Variablen liegen. Gibt auch genügend Fälle 
wo das so ist und er nicht bis ganz runter läuft!
Gast #2224950
Lesenswert?

Johannes O. schrieb:
> Der muss nicht mal bis $0000 kommen, $0100
> reicht auch, wenn dort deine Variablen liegen. Gibt auch genügend Fälle
> wo das so ist und er nicht bis ganz runter läuft!

Ich denke mal deshalb auch:

>Die Art der Realisierung bleibt Ihnen überlassen. Doch sollten
>mindestens drei Schleifendurchgänge realisiert werden.
>Dokumentieren Sie die Auswirkungen und halten Sie fest, ab welcher
>Adresse der Stack-Overflow eintritt.
Gast #2224965
Lesenswert?

> Die Art der Realisierung bleibt Ihnen überlassen. Doch sollten
> mindestens drei Schleifendurchgänge realisiert werden.

Fachhochschule is echt wie Schule früher: erhitzen Sie wasser und 
notieren sie was passiert. die art der realisierung ist vorgegeben. es 
dauerte über 90 minuten bis es gekocht hat.

genauso spannend.
Gast #2224987
Lesenswert?

>Meine Frage jetzt, was ist ein Stack-Overflow?? Ist damit einfach
>gemeint, das der Stack-Pointer einfach größer wird als FFFF ?

Tausend Antworten, aber was ein Stack ist weißt du nun auch nicht? 
Richtig?
Also, in einem Programm gibt es immer wieder Dinge die sich 
wiederhohlen. Um den Code nicht immer wieder neu tippen zu müssen, haben 
viele Programmiersprachen eine Methodik entwickelt diesen Code in 
Funktionen zu fassen die man dann einfach aufrufen kann. Bei jedem 
Aufruf einer solchen Funktion verlässt der Mc seinen aktuellen 
Programmpfad. Wenn die Funktion beendet wird muss der Mc ja wissen, 
wohin er wieder zurückspringen muss, um an der richtigen Stelle im 
vorherigen Programmpfad fortzusetzen. So und diese Adressen werden auf 
dem Stack gespeichert. Wenn also eine Funktion aufgerufen wird (in 
Assembler ein jump, rjmp etc.) wird vorher auf dem Stack die 
Rücksprungadresse gespeichert. Der Stack hat ja eine endliche Größe, 
d.h.:

Bei einem solchen Konstrukt

labelToOverlflow: rjmp labelToOverlflow

Wird also ständig eine weitere Rücksprungaddresse auf dem Stack 
gespeichert. Man kann leicht erkennen, dass er wohl überlaufen wird...

gruß jonas
Gast #2225046
Lesenswert?

Die Rücksprungadresse wird auf dem Stack gespeichert und lokale 
Variablen bzw. Register. Bei einem Stack overflow können ganz lustige 
sachen passieren, da normalerweise auch Globale Variablen bzw. alles 
mögliche am Anfang des Speichers steht (also 0x0000). Wenn nun der 
Stackpointer von Oben kommt (also 0x0FFF oder so je nach RAM) und viel 
zu viele sachen in den RAM packt und dann irgendwann die Globalen 
Variable und so mit irgendwelchen Rücksprungadressen und Variablenwerte 
überschreibt kann alles mögliche passieren.
Gast #2225087
Lesenswert?

Jonas Biensack schrieb:
> Wenn also eine Funktion aufgerufen wird (in
> Assembler ein jump, rjmp etc.) wird vorher auf dem Stack die
> Rücksprungadresse gespeichert. Der Stack hat ja eine endliche Größe,
> d.h.:
>
> Bei einem solchen Konstrukt
>
> labelToOverlflow: rjmp labelToOverlflow
>
> Wird also ständig eine weitere Rücksprungaddresse auf dem Stack
> gespeichert. Man kann leicht erkennen, dass er wohl überlaufen wird...

Nein, da wird nix überlaufen, aber man kann leicht erkennen daß da noch 
erheblicher Lernbedarf besteht.

In diesem Fall läuft der µC auf der Stelle und der Stack ist nicht 
betroffen.
Gast #2225659
Lesenswert?

Hi
Vielleicht hat's keiner gemerkt, aber der "Urheber" hat sich bisher 
nicht an der Diskussion weiter beteiligt, wohl aus gutem Grund. Es macht 
auch keinen Sinn, "Stacküberläufe" zu studiern .... egal, ob 
selbstgeschriebenes/ zusammengestelltes OS  oder sonstwas. Ein 
Stacküberlauf ist in Folge ein unkontrollierter Programmablauf. Und das 
beginnt schon, wenn der erste Befehl ein "Ret" ist.....
Gruß oldmax
Gast #2225666
Lesenswert?

Hi

>Es macht auch keinen Sinn, "Stacküberläufe" zu studiern ....

Erster Post:

>Folgende Aufgabe ist gestellt:
>...
>Schreiben Sie ein Programm mit dem Sie einen Stack-Overflow erzwingen.
>...

Was gibt es da noch über Sinnhaftigkeit zu diskutieren?

>Vielleicht hat's keiner gemerkt, aber der "Urheber" hat sich bisher
>nicht an der Diskussion weiter beteiligt,

Ist doch kein Wunder bei dem Rumgesülze.

MfG Spess
#2225696
Lesenswert?

Hirse schrieb:
> Martin Heinrich schrieb:
>> ich studiere Informations- und Elektrotechnik im 4.Semester an der
>> Hochschule RheinMain.
>
>> Meine Frage jetzt, was ist ein Stack-Overflow??
>
> Ich sags ja immer: FHs haben keine Daseinsberechtigung. Die Leute sind
> nach vier Semestern noch nicht schlauer als vorher.

Das ist eine absolute Verallgemeinerung! Ich studiere selbst an einer 
FH. Was ich hier von der Uni mitbekomme ist eigentlich von den 
Durchfallquoten und dem Wissen her nicht wirklich anders, bei gleichem 
Studiengang.
Es kommt vielmehr darauf an, was man selbst! daraus macht. Gute Leute 
gibts an der Uni wie an der FH. Gegenbeispiele eben auch, aber das 
betrifft nun wirklich nicht nur die FH.
Mag sein, dass Ich hier an einer sehr guten FH bin, gerade bzgl. meines 
Studiengangs. Dennoch ist in meinen Augen mit das wichtigste, was man 
selbst daraus macht.

Gruß

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren