Was ist Stack-Smashing?? Es kann behoben werden?

Inhalt

Ball brechender Haufen Münzen

Jede Minute Produktionsausfall kostet das Unternehmen in der Regel Geld. Wenn Ihre Anwendung ein ernsthaftes Hindernis aufweist, das zum Bruch der Batterie führt, ist auf Reisen. Erfahren Sie vorab, was Akkuschreddern ist und was man dagegen tun kann!!

Was ist es Stapelzertrümmerung?

Tätigkeit als Qualitätssicherungsingenieur, früher oder später wird man auf den Begriff stoßen Haufen zerquetschen. Als ein Entwickler, dieser Begriff wird wahrscheinlich noch früher entdeckt, insbesondere wenn im Code ein Fehler eingegeben wurde, was verursacht eine kaputte batterie. Es ist relativ einfach (wie in 'etwas Leichtes’) dass ein Entwickler einen Fehler macht, der zu einem Batteriebruch führt. Als Benutzer, wenn ich lerne, Batterien zu zerbrechen, der Schaden ist wahrscheinlich schon angerichtet.

Batteriebruch kann unbeabsichtigt auftreten, als Beispiel, als der Entwickler einen Fehler einführte, der zum Absturz des Stack führte, oder böswillig, ein Angreifer, der irgendwie versucht, den Stack eines Programms zu überlaufen oder zu beschädigen.

Stack Smashing ist eine Definition mit einer etwas vagen Definition, die auf verschiedene Probleme hinweisen kann und aus einer Reihe von Quellen stammen kann. Die zwei wichtigsten Probleme, die zum Brechen der Batterie führen können, sind; 1) schreiben / zu viele Daten in einem bestimmten Teil des Stapels überzuordnen, überschreibt damit einen anderen Teil des Stapels, und 2) wo eine externe Quelle (bösartig oder nicht) den Stack eines anderen Programms überschrieben, auch wenn das viel seltener vorkommt .

Dann, Was ist ein Stapel?? Dies ist auch eine lose definierte Definition. Allgemein gesagt, ein Stack bezieht sich auf einen Programmverarbeitungs-Stack, ein Stapel von Funktionen, die in einem Programm definiert sind / gegebener Softwarecode.

Stellen Sie sich zunächst einen Stapel gestapelter Badezimmerfliesen vor, bereit für den Fliesenleger. Dies ist eine ziemlich gute Darstellung eines Stapels von Computern., mit einigen Modifikationen. Wenn jedes Mosaik ein wenig vom vorherigen verschoben wäre, es wäre ein besseres bild, und bald werden wir sehen warum.

Stellen Sie sich vor, dass jede gestapelte Kachel eine Funktion im Computerprogramm ist. Die grundlegendste Funktion befindet sich ganz unten und könnte sein, als Beispiel, das main() Funktion in einem C- oder C-Programm ++. C und C ++ sind zwei Programmiersprachen, die den Stack ausgiebig nutzen.

Jede dieser Funktionen im Programm C / C ++ hat einen Namen und wahrscheinlich eine Reihe von ein- und ausgehenden Variablen. Vereinfacht ausgedrückt, Stellen Sie sich vor, eine dieser Variablen hätte eine Länge von 10 Zeichen und eine andere Funktion versehentlich eingegeben 100 Zeichen in dieser Variablen. Dies kann den gesamten Stapel beschädigen..

In Bezug auf das Fliesenbeispiel oben, Stellen Sie sich vor, jemand schlägt mit einem Hammer zu hart auf die erste Fliese und zerbricht so alle anderen Fliesen. da gehst du; Stapel brechen 😉

Die Analogie funktioniert, weil, so wie in unserem fiktiven Erinnerungsbild jetzt alle Kacheln zerbrochen sind, eine kaputte Batterie führt zu 'Defekte Funktionen’ Wenn du so tust. Jeder Kachelversatz ist eine tiefer verschachtelte Funktion; mehr zu defekten Funktionen im nächsten Abschnitt.

Ausscheidung Batterie (S) zerschlagen

Während technisch ein Hinweis auf 'Defekte Funktionen’ kann nicht ganz richtig sein, Mit anderen Worten, es gibt wohl nur eine defekte funktion, und selbst bei einem Angriff von außen oder einem fehlerhaften Programm darf es keine defekte Funktion geben, Es ist eine großartige Möglichkeit, über eine kaputte Batterie nachzudenken.

Plötzlich, Variablen- und Funktionsnamen können geändert werden, es gibt eine spur (der Fluss von Funktionen, die der Computer benötigt hat, um eine bestimmte Funktion zu erreichen, die abgestürzt ist, und (in unserem Beispiel) brach den Stapel) es macht keinen sinn mehr.

Allgemein gesagt, wenn wir auf eine spur schauen, wird einen klaren Fluss von Funktionen haben, die aufgerufen wurden. Obwohl ein fehlgeschlagenes Programm nicht sofort als "gesund" bezeichnet werden kann,, in Bezug auf den Rückstoß / Ausscheidung, so sieht ein „gesunder“ Rückblick aus:

Ein 'gesunder' Stack über Backtrace (bt) mit GDB

Trotz dieses, wenn eine batterie defekt ist, Debuggen wird viel schwieriger. Der Stapel kann so aussehen:

Ein vernichtender Stapel-Dump, der von mysqld . generiert wurde, der MySQL-Datenbankserver

Dies ist ein Beispiel für ein Stack-Break-Problem, das in MySQL aufgetreten ist, der Datenbankserver (Frag die log.txt angehängt an Fehler von MySQL 37815 für volle Leistung) An 2008, was den Datenbankserver-Daemon verursacht hat (mysqld) beenden.

Während die Betriebssystembibliothek libc.so.6, unter diesen Umständen, scheint den Breaking Stack ganz gut gemeistert zu haben (mit einigen Verstärkungsfunktionen in der __fortify_fail Funktion), das Problem war irgendwo im Code vorhanden und wurde inzwischen behoben.

Beachten Sie auch, dass in diesem Fall, wir sehen keine aufgelösten Funktionsnamen, uns wird nur der binäre Name angezeigt (neugierig, das problem scheint beim kunden gewesen zu sein (mysql) verursacht den Server (mysqld) beenden) Was ist es mysql, zusammen mit einer Speicheradresse der Funktion: mysql[0x8051565], mysql[0x80525c7] und mysql(main+0x4f8)[0x8053198].

Regelmäßig, wenn wir Debug-Symbole verwenden (siehe unten einen Beitrag auf GDB, der im Detail erklärt, was Debug-Symbole sind), wir würden Funktionsnamen mit Variablen sehen, und sogar mit einigen Optimierungsstufen / binäre Minifizierung implementiert, zumindest würden wir die Funktionsnamen sehen, wie das, was wir in der ersten Rückverfolgung sehen "gesund"’ anterior.

Trotz dieses, bei defekter Batterie, die Ausgabe von Funktionsnamen, Variablennamen oder -werte sind nie garantiert und, häufig, ein Wortlaut ist abgeschlossen 🙂 Wir sehen sogar verschiedene Namen von Funktionen oder a zerbrochener Haufen (ein anderer Jargon, der oft von IT-Leuten verwendet wird) verschiedene Funktionsnamen, die wenig Sinn machen (und sie sind wahrscheinlich fiktiv / false, da der Stack irgendwie überschrieben wurde).

Das erschwert es sowohl dem Testingenieur (was zu vielen verschiedenen Ergebnissen für einen einzigen Fehler führen kann, was die Handhabung des bekannten Fehlerfiltermechanismus erschwert) was den entwickler angeht (die Sie wahrscheinlich einen Schritt-für-Schritt-Trace oder einen Rückwärtslauf-Debugger wie verwenden müssen RR um den fraglichen Fehler zu entdecken).

Was tun, wenn Sie mit Stack Smashing konfrontiert werden??

Wenn Sie auf kaputte Batterien stoßen, Das erste, was Sie tun müssen, ist, das Problem und die Umgebung ein wenig besser zu verstehen, um die Quelle zu kennen. Wenn Sie einen beliebten Webserver im Internet haben, auf dem viele Spielbenutzer versuchen, ein Turnier zu gewinnen, während der Server auch Bitcoin abbaut, Sie möchten eine Foulspiel-Gelegenheit übernehmen und herausfinden, ob sich jemand mit dem Server anlegt.

Trotz dieses, In den meisten Fällen, das Problem wird nur ein Anwendungsfehler sein. Während ich sage 'Solo’, das problem kann sehr wichtig sein, kann zu Ausfallzeiten der Dienste führen, es kann viel Geld kosten und, beenden, es kann nicht repariert werden. Als Beispiel, ein Datenbankserver kann beim Start dauerhaft ausfallen, weil sich Daten in einem bestimmten Zustand in Kombination mit einem Mangel oder einer Einschränkung im Code befinden.

Wenn eine solche Situation verschlimmert wird, indem die Batterie nicht beschädigt wird, oder anders gesagt, keine saubere Nachverfolgung des Problems generieren können, das Debuggen wird komplizierter und, manchmal, nahezu unmöglich. Trotz dieses, mach dir keine Sorgen, das gleiche grundlegende Debugging wie bei allen Bugs oder Fehlern / Versagen / Anwendungsproblem bleibt gleich.

Bitte lesen Sie vorher alle Logfiles sorgfältig durch, während und nach dem Auftreten des Problems. Machen Sie einige Backups und versuchen Sie dann den Vorgang erneut. Scheitert es wieder oder nicht? Untersuche die Fehler, die Teile des Stapels und sogar die Rahmen (Mit anderen Worten, die einzelnen Stapelfunktionen angezeigt, Als die do_the_maths Funktion in unserem 'gesunden Stack-Trace’ Original) kann in Ihren bevorzugten Suchmaschinen platziert werden.

Concatenar (mit einem Leerzeichen) die selektivsten gesperrten Frames (Vorgesetzter) und wenn Sie online nach demselben suchen, erhalten Sie oft einen vorhandenen Fehlerbericht für das Problem, mit dem Sie konfrontiert sind. Sogar so, bei Batteriebruch, diese rahmen sind wahrscheinlich (Funktionsnamen) wurden verwöhnt und, da, kann nicht mehr in gleicher Weise verwendet werden. Wenn Sie eine Bestätigungsnachricht sehen (eine vom Entwickler im Code eingeführte Behauptung) jeglicher Art, schau es auch nach.

Reichen Sie immer einen neuen Fehlerbericht ein, wenn das Problem immer noch nicht online protokolliert zu sein scheint (Vielleicht hilfst du anderen, denen es ähnlich geht!) Und geben Sie so viele Informationen über das Problem an, wie Sie finden können. Hunderte von Fehlerberichten für so viele Anwendungen werden täglich online protokolliert. Hoffentlich, das Support-Team Ihrer Stack-Zerstörungsanwendung ist aktiviert, um Ihnen schnell zu helfen.

Lesen Sie auch unseren Beitrag Debugging mit GDB: Einführung unten, da es darauf basiert, wie C- und C-Programme debuggt werden können ++ (und andere) mit GDB-Debugger. Außerdem werden die Konzepte eines Stapels genauer erklärt.

Abonniere unseren Newsletter

Wir senden Ihnen keine SPAM-Mail. Wir hassen es genauso wie du.