Forum: Mikrocontroller und Digitale Elektronik Hausarbeit: Stack-Overflow erzwingen


von Martin Heinrich (Gast)


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

von Pegel (Gast)


Lesenswert?

Schon mal das Internet bemüht?
Da gibt es zur Erklärung sogar Beispiele:
http://de.wikipedia.org/wiki/Puffer%C3%BCberlauf
http://en.wikipedia.org/wiki/Stack_overflow

von Purzel H. (hacky)


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.

von Nils S. (kruemeltee) Benutzerseite


Lesenswert?

SP = letzte_mögliche_adresse
jump_to_subroutine

subroutine:
jump_back

von Frank M. (ukw) (Moderator) Benutzerseite


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

von Hirse (Gast)


Lesenswert?

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.

von Pegel (Gast)


Lesenswert?

Hirse schrieb:
> Ich sags ja immer: FHs haben keine Daseinsberechtigung. Die Leute sind
> nach vier Semestern noch nicht schlauer als vorher.

An Verallgemeinerung nicht zu übertreffen.
Warten wir mal ab ob er in 1-2 Semestern noch da ist...

von Ben _. (burning_silicon)


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.

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

Ben _ schrieb:
> Oder beim AVR:
> label1: PUSH r16
>
>         RJMP label1
Es genügt bereits eine Zeile:
1
bad_label: rcall bad_label

von Juergen (Gast)


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

von Hagen R. (hagen)


Lesenswert?

Danke Läubi, sonst hät ichs gepostet ;)
1
bad_label: 
2
  push offset bad_label
3
  ret

von Random .. (thorstendb) Benutzerseite


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**

von Alexander L. (lippi2000)


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.

von Mark B. (markbrandis)


Lesenswert?

Hirse schrieb:
> Ich sags ja immer: FHs haben keine Daseinsberechtigung. Die Leute sind
> nach vier Semestern noch nicht schlauer als vorher.

Zumindest lernt man an den FH, dass Statistik mit N=1 nicht funktoniert, 
was man an der Uni anscheinend immer noch nicht begriffen hat. ;-)

von Ben _. (burning_silicon)


Lesenswert?

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

von Random .. (thorstendb) Benutzerseite


Lesenswert?

Sinnvolles / lehrreiches Beispiel wäre meiner Meinung nach eine 
Rekursion.

von Ben _. (burning_silicon)


Lesenswert?

Da kriegt man zumindest auch einen stack overflow hin wenn der nicht 
groß genug für die rekursionstiefe ist...

von Dennis S. (bzzzt)


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. ;-)

von Derek (Gast)


Lesenswert?

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.

von Dennis S. (bzzzt)


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.

von Johannes O. (jojo_2)


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!

von Pegel (Gast)


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.

von Wasserkoch (Gast)


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.

von Jonas Biensack (Gast)


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

von Uwe (Gast)


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.

von MWS (Gast)


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.

von berliner (Gast)


Lesenswert?

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

ja, dann schreibt der Processor in den imaginären Raum

von Klaus W. (mfgkw)


Lesenswert?

eher an einer unerwünschten Stelle in den realen Raum.

von oldmax (Gast)


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

von spess53 (Gast)


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

von Maik W. (werner01)


Lesenswert?

Hallo hat der Prozie auch einen Stackcounter den man beeinflussen kann?

mfg

von Wegstaben V. (wegstabenverbuchsler)


Lesenswert?

wer ist Prozie?

von Sesk K. (zeborok)


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ß

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.