Rolf B: c Mathematik über Binary

Beitrag lesen

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. Oder Du hast mich soeben breit grinsend und erfolgreich auf die Rolle genommen 😂.

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:

  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:

  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