Nebuchadnezar
Erfahrenes Mitglied
HI ich hoffe ich bin hier im richtigen Forum da die Frage etwas Themenübergreifend ist.
Ich beschäftige mich gerade mit Pufferüberläufen (keine Sorge habe nichts böses damit vor) und in Linux ist mir bezüglich der Speicherreservierung für variablen eine Kuriosität aufgefallen.
Normalerweise wird ein Pufferüberlauf bei char Variablen bzw. die Funktionen dafür ausgenutzt, wenn keine Grenzen überprüft werden. Chars werden immer um ein vielfaches von 32bit reserviert (leichter zum adressieren für die CPU).
also bsp:
intern wird dieser Puffer auf 20 erweitert (5x4 = 20)
-> wenn ich in diesen Puffer 28 mal a hinschreibe, wird die Rücksprungadresse überschrieben (eip = 0x61616161)
(4 byte ebp + 4 byte eip)
So funktioniert das bei der X86 Architektur - steht in jedem Tutorial und ich konnte das in Windows einwandfrei beobachten.
Jedoch wird bei mir mit Suse 9.0 viel mehr Speicher reserviert
(im Gegensatz zu den Linux Tutorials bezüglich Pufferüberläufen)
selbes beispiel wie oben:
18 -> 0x12
0x12 wird auf 0x20 erweitert + 8 byte
-> 18 = 0x12 -> 0x20 -> 0x28 = 40 byte
oder:
33 = 0x21 -> 0x30 -> 0x38 = 56 byte
Daraus schloss ich: wenn ich in ein char buf[18] 48 mal
"a" reinschreibe wird der eip mit 0x61616161 überschrieben. Diese Schlussfolgerung war richtig, jedoch möchte ich gern wissen wieso das bei Suse 9.0/ 9.2 so ist. (Diese Beobachtung konnte ich im Internet mit keinem Tutorial bestätigen.)
Hat jemand ähnliche Erfahrungen gemacht?
Bye.
Ich beschäftige mich gerade mit Pufferüberläufen (keine Sorge habe nichts böses damit vor) und in Linux ist mir bezüglich der Speicherreservierung für variablen eine Kuriosität aufgefallen.
Normalerweise wird ein Pufferüberlauf bei char Variablen bzw. die Funktionen dafür ausgenutzt, wenn keine Grenzen überprüft werden. Chars werden immer um ein vielfaches von 32bit reserviert (leichter zum adressieren für die CPU).
also bsp:
Code:
char buf[18];
-> wenn ich in diesen Puffer 28 mal a hinschreibe, wird die Rücksprungadresse überschrieben (eip = 0x61616161)
(4 byte ebp + 4 byte eip)
So funktioniert das bei der X86 Architektur - steht in jedem Tutorial und ich konnte das in Windows einwandfrei beobachten.
Jedoch wird bei mir mit Suse 9.0 viel mehr Speicher reserviert
(im Gegensatz zu den Linux Tutorials bezüglich Pufferüberläufen)
selbes beispiel wie oben:
18 -> 0x12
0x12 wird auf 0x20 erweitert + 8 byte
-> 18 = 0x12 -> 0x20 -> 0x28 = 40 byte
oder:
33 = 0x21 -> 0x30 -> 0x38 = 56 byte
Daraus schloss ich: wenn ich in ein char buf[18] 48 mal
"a" reinschreibe wird der eip mit 0x61616161 überschrieben. Diese Schlussfolgerung war richtig, jedoch möchte ich gern wissen wieso das bei Suse 9.0/ 9.2 so ist. (Diese Beobachtung konnte ich im Internet mit keinem Tutorial bestätigen.)
Hat jemand ähnliche Erfahrungen gemacht?
Bye.