c Mathematik über Binary
bearbeitet von
Hallo 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
Hallo 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
Hallo 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