Wenn Ihr stack und heap sind nicht ausführbar, wie kann man den code ausführen?
Las ich ein Buch über Puffer-überlauf, und er schlage vor, die nächste zu tun haben:
Macht der stack und heap) non-executable bietet eine hohe
Schutz gegen viele Arten von buffer-overflow-Angriffe für bestehende
Programme.
Aber ich verstehe nicht, wie können wir es tun - denen die Ausführung stattfinden würde, wenn nicht auf dem heap oder auf dem stack?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn ich verstehe deine Frage richtig, keine der anderen Antworten Adresse. Die Antwort ist, dass die Ausführung tritt in den code-Abschnitt, der weder stack noch heap. In einem typischen paged-memory-Systems, die code aus einer Programmdatei (z.B., ein .exe in Windows) geladen wird in ein ausführbares, aber nur-lese-Seiten. Zusätzliche beschreibbaren (und ausführbare) Seiten zugeordnet sind, um den Prozess für den stack und den heap. Der Vorschlag hier ist, dass das Betriebssystem und die hardware sollten zusammenarbeiten, um diejenigen markieren, die Seiten beschreibbar, aber nicht ausführbar ist (rgngl Antwort erklärt, wie man das in Windows).
Auch mit den nicht-ausführbaren heap-und stack-exploits sind immer noch möglich, dass die Verwendung der return-oriented programming erwähnt Alexey Frunse Antwort, aber es gibt Schutz-Techniken, stymie, auch diejenigen, die wie stack-smashing-Schutz und address space layout randomization -- siehe http://en.wikipedia.org/wiki/Return-to-libc_attack#Protection_from_return-to-libc_attacks
Gibt es den sogenannten "return-oriented programming" (AKA ROP) Art des exploits.
Den Angreifer findet, wie man seine bösen code aus verschiedenen teilen des Programm, das ausgenutzt wird.
Er findet nutzbare byte-Sequenzen (Anweisungen) vor der return-Anweisung byte(s), die nützliche Operationen auf Registern oder Speicher wie verschieben Sie einen Wert in einen Speicherort, Werte hinzufügen, Werte zu vergleichen, etc etc. Das sind Mikro-Unterprogramme, die das ausnutzen, wird gebaut.
Dann durch die Ausnutzung eines Fehlers code der Angreifer zwingt das Programm zu starten, die Kette von diese Mikro-Unterprogramme, die nicht alle die böse Arbeit.
So, nun guten code verwandelt sich in böse code. Nichts ausgeführt wird, auf dem stack oder im heap.
Bemerkenswert ist auch, dass auf CPUs, wo Anweisungen, die über mehrere bytes und sind von variabler Länge, selbst über die unmittelbare Instruktion Operanden (IOW, numerische Konstanten), sind Teil der Anweisungen kann zu code, und so die Chancen auf nutzbare byte-Sequenzen dort höher sind als bei "einfacheren" CPUs.
Es ist auch oft möglich zu konstruieren bösartigen code, die geändert wird, Speicherschutz und der exploit wird nicht mehr beschränkt durch die bestehende Anwendung code.
Sehr konkretes Beispiel: Ordnen Sie für die Rückkehr-Adresse zu zeigen, um
system
und der nächste slot auf dem stack (oder das erste argument registrieren, auf der pass-by-register-Architekturen) ein Zeiger auf den string"/bin/sh"
."/bin/sh"
zu"/bin/sh 0<&n"
won
ist der Datei-Deskriptor-Nummer des server-socket für die Verbindung ein."echo 'toor::0:0::/:/bin/sh' >> /etc/passwd"
Diese Art von Schutz wird durch die OS und kann nicht getan werden in der Anwendungsschicht.
Siehe den wikipedia-Artikel, die auch erzählt, wie es zu aktivieren unter Windows: http://en.wikipedia.org/wiki/Data_Execution_Prevention
können Sie direkt zu jedem anderen Ort, die ausführbaren Segments und führen Ihre bösen code...
Schließlich sind alle Daten auf einem Speicher -, Speicher-bits und bits können Anweisungen an die cpu, um Sie auszuführen.
Können Sie mit Ihrem überlauf überschreiben der Rücksprungadresse einer Funktion, die springen können, um einige bekannte Adresse mit dem code drauf. Aber dann OS Schriftsteller reagierten, indem Sie zufällig die Adresse-code wird ausgeführt...
Ihr code ausgeführt wird, in das text-segment, nicht in den stack oder auf dem heap (die beide zur Speicherung von Daten). Also die Organisation ist:
Den code-Bereich ausführbar ist aber unveränderlich. Dieser wikipedia-Artikel hat mehr details: https://en.wikipedia.org/wiki/Data_segment