c Mathematik über Binary
bearbeitet von Rolf BHallo pl,
sorry, aber das musste ich editieren und rot anpinseln. Dieser Code überschreibt fremden Stackspeicher. An deiner Sensibilität für Buffer-Overflows musst Du noch arbeiten.
`char w[4];` reserviert 4 Bytes auf dem Stack. Gültige Indexe für den Zugriff auf w[] sind also 0, 1, 2 und 3. Der Zugriff `w[4]` geht auf das fünfte Byte und würde demnach das überschreiben, war "darüber" auf dem Stack liegt. Es könnte der Wert von h sein, aber auch ein geretteter Registerwert oder die Returnadresse zum Aufrufer. Das hängt vom Stackframe-Layout des Compilers und vom ABI des Betriebssystems ab.
Und wenn h z.B. den Wert 0x41420017 enthält, wird unvollständig kopiert. Eigentlich müsste man also memcpy nehmen. Aber ich denke, das ist Dir klar und darum ging's hier nicht.
So ist's richtig:
~~~c
uint32_t h = 1145258561;
char w[5]; // neuer Speicherplatz mit Platz für das Terminierungsbyte
strncpy(w, (char*)&h, 4); // Kopie
w[4] = 0; // Terminierung
printf("%s\n", w); // ABCD
~~~
Oder etwas generischer:
~~~c
uint32_t h = 1145258561;
char w[sizeof(h)+1]; // neuer Speicherplatz mit Platz für das Terminierungsbyte
strncpy(w, (char*)&h, sizeof(h)); // Kopie
w[sizeof(h)] = 0; // Terminierung
printf("%s\n", w); // ABCD
~~~
_Rolf_
--
sumpsi - posui - clusi
c Mathematik über Binary
bearbeitet von Rolf BHallo pl,
sorry, aber das musste ich editieren und rot anpinseln. Dieser Code überschreibt fremden Stackspeicher. An deiner Sensibilität für Buffer-Overflows musst Du noch arbeiten.
`char w[4];` reserviert 4 Bytes auf dem Stack. Der Zugriff `w[4]` geht aber auf das fünfte Byte und würde demnach das überschreiben, war "darüber" auf dem Stack liegt. Es könnte der Wert von h sein, aber auch ein geretteter Registerwert oder die Returnadresse zum Aufrufer. Das hängt vom Stackframe-Layout des Compilers und vom ABI des Betriebssystems ab.
Und wenn h z.B. den Wert 0x41420017 enthält, wird unvollständig kopiert. Eigentlich müsste man also memcpy nehmen. Aber ich denke, das ist Dir klar und darum ging's hier nicht.
So ist's richtig:
~~~c
uint32_t h = 1145258561;
char w[5]; // neuer Speicherplatz mit Platz für das Terminierungsbyte
strncpy(w, (char*)&h, 4); // Kopie
w[4] = 0; // Terminierung
printf("%s\n", w); // ABCD
~~~
Oder etwas generischer:
~~~c
uint32_t h = 1145258561;
char w[sizeof(h)+1]; // neuer Speicherplatz mit Platz für das Terminierungsbyte
strncpy(w, (char*)&h, sizeof(h)); // Kopie
w[sizeof(h)] = 0; // Terminierung
printf("%s\n", w); // ABCD
~~~
_Rolf_
--
sumpsi - posui - clusi
c Mathematik über Binary
bearbeitet von Rolf BHallo pl,
sorry, aber das musste ich editieren und rot anpinseln. Dieser Code enthält einen buffer overflow und überschreibt Stackspeicher. An deiner Sensibilität für Buffer-Overflows musst Du noch arbeiten.
Und wenn h z.B. den Wert 0x41420017 enthält, wird unvollständig kopiert. Eigentlich müsste man also memcpy nehmen. Aber ich denke, das ist Dir klar und darum ging's hier nicht.
So ist's richtig:
~~~c
uint32_t h = 1145258561;
char w[5]; // neuer Speicherplatz mit Platz für das Terminierungsbyte
strncpy(w, (char*)&h, 4); // Kopie
w[4] = 0; // Terminierung
printf("%s\n", w); // ABCD
~~~
oder etwas generischer:
~~~c
uint32_t h = 1145258561;
char w[sizeof(h)+1]; // neuer Speicherplatz mit Platz für das Terminierungsbyte
strncpy(w, (char*)&h, sizeof(h)); // Kopie
w[sizeof(h)] = 0; // Terminierung
printf("%s\n", w); // ABCD
~~~
_Rolf_
--
sumpsi - posui - clusi