Hallo Leute,
fuer Mikrocontroller gibt es in der Regel Linkerscripte, in denen z.B.
die Startadresse und die Groesse des Stacks, usw. festgelegt werden.
Kann man sowas auch fuer ein eigenes Linuxprogramm machen?
Hintergrund der Frage:
Ich studiere IT-Sicherheit und wir haben gestern einen Versuch zu
Bufferoverflows gemacht. Typisches Problem:
Es werden in einem C-Programm Daten eingelesen, aber es wird nicht
ueberprueft, ob die Daten laenger als das angedachte feste char-Array
sind => Bufferoverflow, Ruecksprungadresse ueberschrieben, alles schick.
Versuch geglueckt, Patient tot.
Das passiert aber alles auf dem Stack.
Nutzt man C++ statt C, und std::string (oder einen anderen dynamischen
Container) anstelle eines festen char-Arrays, so funktioniert das nicht
mehr, da der dynamisch allokierte (oder heisst es 'allozierte'?)
Speicher ja auf dem Heap liegt.
Jetzt muesste es doch aber moeglich sein, den Heap in den Stack wachsen
zu lassen, und so ebenfalls den Stack und Ruecksprungadressen zu
ueberschreiben. An der Stelle kommt aber natuerlich das OS und die
Speicherverwaltung ins Spiel (und ganz viele andere Sachen wie
Stack-Protection vom Compiler, etc.).
Ein kleines C++-Testprogramm:
1 | #include <stdlib.h>
|
2 | #include <stdint.h>
|
3 | #include <stdio.h>
|
4 |
|
5 | #include <new>
|
6 |
|
7 | int main()
|
8 | {
|
9 | uint8_t a = 0;
|
10 | uint8_t *b = (uint8_t*) malloc(1);
|
11 | uint8_t *c = new uint8_t;
|
12 |
|
13 | printf("\nAddr. of &a: %p\n", &a);
|
14 | printf("Addr. of &b: %p\n", &b);
|
15 | printf("Addr. of &c: %p\n", &c);
|
16 | printf("\nAddr. b points: %p\n", b);
|
17 | printf("Addr. c points: %p\n", c);
|
18 |
|
19 | free(b);
|
20 | delete c;
|
21 |
|
22 | return 0;
|
23 | }
|
1 | Addr. of &a: 0x7ffea353e617
|
2 | Addr. of &b: 0x7ffea353e618
|
3 | Addr. of &c: 0x7ffea353e620
|
4 |
|
5 | Addr. b points: 0x55c7664fae70
|
6 | Addr. c points: 0x55c7664fae90
|
--------------------------------------
Anmerkung:
Es sind malloc und new drin, da an einigen Stellen auf Stackoverflow
darauf hingewiesen wird, das malloc und new wohl unterschiedliche
Speicherbereiche nutzen: malloc => heap; new => 'free memory'
--------------------------------------
So, wie die Ausgabe zeigt gibt es nun aber eine ziemlich grosse Luecke
zwischen den Variablen auf dem Stack und dem allokierten Speicher.
Jetzt zu meiner eigentlichen Frage:
Kann man dem GCC/Linker/OS nun irgendwie mitteilen, dass das Programm x
Byte an RAM bekommen soll, der Stack auf der einen Seite und der Heap
auf der anderen Seite beginnt, so dass ich den Heap in den Stack wachsen
lassen kann, oder geht das (aus einer viel Zahl von Gruenden) einfach
nicht?
Gruesse