So finden Sie Ort der buffer overflow und memory corruptions?
valgrind nicht finden können, was nützlich ist. Ich bin verwirrt.
Symptome:
- meine Daten beschädigt werden, indem eine malloc () - Aufruf
- return-Adresse der Funktion wird ersetzt durch etwas falsch
PS: code NICHT segfault
Derzeit habe ich einige Fortschritte über ersetzen alle meine malloc() via mmap()
+mprotect()
vielleicht könnte man zumindest einige Zeilen code? ansonsten, niemand wird in der Lage sein, um Ihnen zu helfen.
Korrigieren Sie alle Fehler, und das sollte es lösen. [/Sarkasmus]
Bitte geben Sie zumindest etwas - Informationen. Was ist das symptom, das Sie sehen? Ein segmentation fault? Daten-Korruption? Was haben Sie versucht? Was waren die Ergebnisse? Wenn Sie nicht setzen einige Mühe in Ihr die Frage, wie Sie das von uns erwarten, Sie zu beantworten?
Korrigieren Sie alle Fehler, und das sollte es lösen. [/Sarkasmus]
Bitte geben Sie zumindest etwas - Informationen. Was ist das symptom, das Sie sehen? Ein segmentation fault? Daten-Korruption? Was haben Sie versucht? Was waren die Ergebnisse? Wenn Sie nicht setzen einige Mühe in Ihr die Frage, wie Sie das von uns erwarten, Sie zu beantworten?
InformationsquelleAutor vitaly.v.ch | 2011-02-21
Du musst angemeldet sein, um einen Kommentar abzugeben.
Könnten Sie überschreiben den stack, oder Sie überschreiben den heap.
Können Sie versuchen die Flagge
-fstack-protector-all
auf Ihr GCC-Befehlszeile-Optionen zu Fragen, für einige stack-smashing Berichterstattung ins Programm integriert. Dies könnte verursachen früher.Andere Möglichkeit ist der Blick auf die Adresse gemeldet in
dmesg
Ausgabe und sehen Sie, wenn Sie nicht die Spur der Funktion/Speicher, wird zerschlagen:readelf -s
dumpt das symbol Tabelle, können wir sehen für die Funktion, die löst das problem:Den
main
routine ist, die man ausführt, wenn die schlechten Zeiger benutzt:Wenn
main
versucht, um zurück zu der C-Bibliothek zu beenden, verwendet es eine schlechte Zeiger auf dem stack gespeichert Rahmen. Also schauen Sie sich die Funktionen genannt, die vonmain
, und (es ist ziemlich leicht, in diesem trivialen Fall)f
ist offensichtlich der Kerl, kritzelte alle über den stack-frame.Wenn Sie überschreiben den heap, dann vielleicht könnten Sie versuchen,electric fence. Die Nachteile sind ziemlich steil (große Speicher zu verwenden), aber es könnte genau das sein, was Sie brauchen, um das problem zu finden.
Ich war auch enttäuscht. StackGuard fangen konnte, dass einer, der ProPolice-patch, dass das GCC-team schließlich vorbehalten war ziemlich clever über die Routinen "Schutz"; ich hoffte, dass die
-all
Variante würde das beheben...wenn legte ich einen bugreport über
-fstack-protect-all
mit Ubuntu, es war markiertes Duplikat von bug, die erwähnt den patch in der Natty-version von gcc-4.4:debian/patches/gcc-default-ssp.patch
. Hoffe, dies hilft Ihnen, eine Feste version der GCC auf Ihrer Straffen.Je nach Ausgang der Härten-prüfen Sie, mein gcc dos nicht dieser Fehler.
InformationsquelleAutor sarnold
Valgrind memcheck ist nicht sehr gut bei der Erkennung von buffer overruns. Aber Sie könnten versuchen, ein patch könnte.
InformationsquelleAutor onemasse
überläufe
sind Sie wirklich benötigt
finden Sie unter folgendem link:: Was C/C++ - tools eine überprüfung auf buffer overflows?
Seinen alles Recht Liebe.
InformationsquelleAutor Manish Trivedi
Könnte man auch versuchen die Testversion von IBM Rational Purify - ein ziemlich gutes Werkzeug, um zu erkennen, Pufferüberläufe, Speicherlecks und andere Speicher-Fehler. Folgen Sie diesem link zum download http://www-01.ibm.com/software/awdtools/purify/unix/
InformationsquelleAutor Subbu
Welcher Umgebung sind Sie zu entwickeln?
Wenn Ihr die Entwicklung auf Windows, versuchen Sie, diese Artikel http://msdn.microsoft.com/en-us/library/cc500347.aspx
Ich habe nicht geschrieben, native-code auf Linux, aber ich weiß, dass der häufigste string-Funktionen sind veraltet aufgrund von Buffer Overflow-Attacken. Sie sollten überprüfen, um zu sehen, ob Ihre Sichere Versionen der gewünschten Zeichenfolgen, die Sie verwenden möchten, wenn keine vorhanden sind, können Sie schreiben Ihre eigene version. Indem Sie einfach den Ziel-Puffer und es überprüft, um größer zu sein, als die Quelle-Puffer.
Ich verwende keine string-Funktionen
InformationsquelleAutor Nocturnal
Kann dir nicht helfen, auf Linux. Aber Sie sagen, dass Sie nicht mit beliebigen string-Funktionen, die schlägt vor, Ihre Anwendung möglicherweise ziemlich tragbar. Scheitert es unter Windows?
Wenn es gilt, unsere CheckPointer tool ist in der Lage, das problem zu finden. Es führt eine viel sorgfältiger prüfen, wie Sie die vom Programm verwendete Pointer als Valgrind tun können, weil es sehen können, die Struktur und die Erklärungen im code, und es versteht, die verschiedenen Arten von Speicher verwendet (stack-frames vs. heap). Valgrind nur sieht die Maschine Anweisungen, und Sie können nicht sagen, wenn stack-frames außerhalb des Bereichs.
InformationsquelleAutor Ira Baxter