Forum: PC-Programmierung Unterschied Heap und Stacksmashing?


von Antonow B. (antonow)


Lesenswert?

Was ist der Unterschied?

Ich versuche es mal: Buffer Overflow passiert, wenn einer Variablen eine 
größere Datenmenge zugewiesen wird, als für sie reserviert ist (also 
größer als ihr buffer) und das nicht vernünftig abgefangen wird. Diese 
Verwundbarkeit kann man ausnutzen.

Es gibt hauptsächlich (?) zwei Arten von Buffer Overflow Attacken: Stack 
Smashing und Heap Smashing. Auf dem Programmstack liegen lokale 
Variablen und ganz unten die Rücksprungadresse zur aufrufenden Funktion. 
Man kann also mit einem Buffer Overflow einer lokalen Variable den Wert 
einer anderen Variable ändern (indem die 'überschüssige' Datenmenge auf 
den nächsten Adressen im Stack landet (und den Stack damit kaputt 
machen)). Wenn man das geschickt anstellt, kann man die 
Rücksprung-Adresse am Ende des Stacks ändern zu der Startadresse einer 
anderen Funktion oder Shellcode einfügen um eine root-shell zu bekommen.

von DPA (Gast)


Lesenswert?

Was man damit machen kann, ist sehr vom konkreten Fall abhängig. 
Webassembly z.B. hat einen nativen stack, der nicht im Speicher des wasm 
Programms / nicht direkt Addressierbar ist. Da sind unter anderem 
Rücksprungadressen und anderes zeug drauf, aber auf die kann man nicht 
direkt zugreifen. Deshalb braucht es für gewisse dinge noch einen stack 
parallel dazu. Aber Rücksprungadressen überschreiben geht da nicht 
einfach so, höchstens manchmal indirekt, und stark Eingeschränkt, 
vielleicht.

von Irgend W. (Firma: egal) (irgendwer)


Lesenswert?

Antonow B. schrieb:
> Wenn man das geschickt anstellt, kann man die
> Rücksprung-Adresse am Ende des Stacks ändern zu der Startadresse einer
> anderen Funktion oder Shellcode einfügen um eine root-shell zu bekommen.

Dazu musst du es aber erstmal schaffen ausführbaren Code irgendwo zu 
hinterlegen den du dann versuchen kannst aufzurufen. Um das zu 
erschweren gibt es z.B. sowas.:
- https://en.wikipedia.org/wiki/Executable_space_protection
- https://en.wikipedia.org/wiki/Address_space_layout_randomization
- https://en.wikipedia.org/wiki/Memory_protection

Und wenn du das nach all dem geschaft hast läuft dein "neuer" 
Maschinencode erstmal mit der ursprünglichen Berechtigung. Einfach mal 
zu sagen "führe mir eine Shell mit root-rechten aus" ist da noch lange 
nicht.

- https://en.wikipedia.org/wiki/CPU_modes
- https://en.wikipedia.org/wiki/User_space

In der heutigen Praxis benötigst du da eine ganze Kette von 
Schwachstellen die du alle nacheinander gezielt ausnutzen musst um an 
dein Ziel zu kommen. Und ja, es kommt immer wieder mal vor das solche 
Ketten gefunden werden.
Aber mittlerweile greif man da viel lieber die Applikationen an. Diese 
sind meist sehr viel anfälliger als die mittlerweile über Jahrzehnte 
gehärteten OS.

von 🐧 DPA 🐧 (Gast)


Lesenswert?

Irgend W. schrieb:
> Dazu musst du es aber erstmal schaffen ausführbaren Code irgendwo zu
> hinterlegen

Nicht unbedingt: 
https://en.wikipedia.org/wiki/Return-oriented_programming

von Antonow B. (antonow)


Lesenswert?

was ist Heap-smashing?

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.