Ich versuche, eine C-Funktion mit OpenSSL / libcrypto zu schreiben, um die SHA256-Summe einer Datei zu berechnen. Ich stütze meinen Code auf Adam Lamer's C ++ Beispiel hier .
Hier ist mein Code:
%Vor%Das Problem ist das ... Sehen Sie sich die berechneten Summen für eine Beispieldatei an:
%Vor%Ich bekomme auch * stack smashing detected * wenn der Code fertig ausgeführt ist.
Sieht jemand, was ich falsch mache?
Danke!
Sieht so aus, als ob es viele '0xff' Blöcke in Ihrer Ausgabe gibt, und die entsprechenden Blöcke in der guten Zeichenfolge haben das hohe Bit gesetzt ... vielleicht ein Zeichenerweiterungsproblem irgendwo.
Macht Making:
%Vor%unsigniert, wie:
%Vor% Hilfe? (Vor allem in der Signatur von sha256_hash_string
.)
Sie geben ein signiertes char
als ganze Zahl aus. Wenn das Byte negativ ist, wird es in ein signed int
(das Standardargument promotions im Aufruf von sprintf
) konvertiert und dann in ein unsigned int
konvertiert (über das %x
Formatbezeichner) und ausgedruckt.
Also ist das Byte A0
-96 als ein vorzeichenbehaftetes Byte, das in -96 als signed int
konvertiert wird, was 0xFFFFFFA0 in hex ist, so dass es als FFFFFFA0 ausgedruckt wird.
Um dies zu beheben, wird jedes Byte vor dem Drucken an ein unsigned char
übergeben:
Sie erhalten die Warnung über das Abstürzen von Stacks, da sich ein signiertes Byte nahe dem Ende des Hashs befindet. Daher schreiben Sie die 8 Bytes FFFFFFB7 bei Offset 58, wenn Sie nur 2 Bytes schreiben wollten. Dies führt zu einem Pufferüberlauf , der zufällig hier gefunden wird, weil der Compiler wahrscheinlich a eingefügt hat Guard-Bereich oder Sicherheits-Cookie im Stack vor dem Rückgabewert, und es wurde festgestellt, dass dieser Guard-Bereich versehentlich geändert wurde.
Tags und Links c cryptography openssl sha256