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
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.
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
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.
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...
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.
> 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
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**
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.
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. ;-)
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. ;-)
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.
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.
"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!
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.
> 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.
>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
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.
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.
>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
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
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
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ß