it-swarm.com.de

Kann ich Anweisungen senden, die in ein Image eingebettet sind, wenn ich die CPU-Architektur eines Ziels kenne?

Kann ich Anweisungen, die in ein Image eingebettet sind, an ein Ziel senden, wenn ich seine CPU-Architektur kenne?

32
Faminha102

CPU-Anweisungen werden in opcodes gegeben, und Sie haben Recht, dass diese genau wie Ihr Image im Speicher leben. Sie leben jedoch in konzeptionell unterschiedlichen "Bereichen" der Erinnerung.

Sie können sich beispielsweise einen Opcode "read" (0x01) vorstellen, der ein Eingabebyte von stdin liest und irgendwo ablegt, und einen anderen Operanden "add" (0x02), der zwei Bytes hinzufügt. Einige Opcodes können Argumente annehmen, daher geben wir unseren Beispiel-Opcodes einige: Der "Lese" -Opcode verwendet einen Operanden zum Speichern des gelesenen Bytes und der "Hinzufügen" -Operand drei Operanden: zwei zum Lesen der Eingaben und eine, in die das Ergebnis geschrieben werden soll.

0x01 a1 // read a byte to memory location 0xa1
0x01 a2 // read a byte to memory location 0xa2
0x02 a1 a2 a3 // read the bytes at locations 0xa1 and 0xa2, add them,
              // and write the result to location 0xa3

Dies ist typisch für die Funktionsweise vieler Anweisungen: Die meisten von ihnen verarbeiten nur Daten, die sich im Speicher befinden, und einige von ihnen speichern neue Daten von außen in den Speicher (in diesem Beispiel beim Lesen von stdin oder beim Lesen einer Datei oder Netzwerkschnittstelle).

Während es stimmt, dass sich die Anweisungen und die Daten, mit denen sie arbeiten, beide im Speicher befinden, führt das Programm nur die Anweisungen aus. Es ist die Aufgabe der CPU, des Betriebssystems und des Programms, dafür zu sorgen, dass dies geschieht. Wenn sie fehlschlagen, können Sie tatsächlich Daten in den Ausführungsbereich laden, und es handelt sich um einen schwerwiegenden Sicherheitsfehler. Pufferüberläufe sind wahrscheinlich das bekannteste Beispiel für einen solchen Fehler. Abgesehen von diesen Arten von Fehlern können Sie sich den Datenraum und den Ausführungsraum im Wesentlichen als separate CPU-Blöcke vorstellen.

In einem Spielzeugcomputer sieht der Speicher anhand des obigen Beispiels möglicherweise folgendermaßen aus:

(loc)  | Initial      | After op 1   | After op 2   | After op 3   |
0x00   | *01 a1       |  01 a1       |  01 a1       |  01 a1       |
0x02   |  01 a2       | *01 a2       |  01 a2       |  01 a2       |
0x04   |  02 a1 a2 a3 |  02 a1 a2 a3 | *02 a1 a2 a3 |  02 a1 a2 a3 |
0x08   |  99          |  99          |  99          | *99          |
...
0xa1   |  00          |  03          |  03          |  03          |
0xa2   |  00          |  00          |  04          |  04          |
0xa3   |  00          |  00          |  00          |  07          |

In diesem Beispiel das Sternchen (*) zeigt auf den nächsten Opcode, der ausgeführt wird. Die Spalte ganz links gibt den Startspeicherort für diese Zeile an. So zeigt uns zum Beispiel die zweite Zeile zwei Bytes Speicher (mit den Werten 01 und a2) an den Stellen 0x02 (explizit in der linken Spalte) und 0x03.

(Bitte haben Sie Verständnis dafür, dass dies alles eine große Vereinfachung ist. In einem echten Computer kann beispielsweise der Speicher verschachtelt werden - Sie haben nicht nur einen Teil der Anweisungen und einen Teil von allem anderen. Das oben Genannte sollte dafür gut genug sein antworte aber.)

Beachten Sie, dass sich beim Ausführen des Programms der Speicher in den Bereichen 0xa1 - 0xa3 ändert, der Speicher in 0x00 - 0x08 jedoch nicht. Die Daten in 0x00 - 0x08 sind die ausführbare Datei unseres Programms, während der Speicher in den Bereichen 0xa1 - 0xa3 der Speicher ist, den das Programm zum Knacken der Zahlen verwendet.

Um auf Ihr Beispiel zurückzukommen: Die Daten in Ihrem JPEG werden von Opcodes in den Speicher geladen und von Opcodes manipuliert, jedoch nicht in denselben Bereich im Speicher geladen. Im obigen Beispiel befanden sich die beiden Werte 0x03 und 0x04 nie im Opcode-Bereich, was von der CPU ausgeführt wird. Sie befanden sich nur in dem Bereich, aus dem die Opcodes lesen und schreiben. Solange Sie keinen Fehler (wie einen Pufferüberlauf) gefunden haben, mit dem Sie Daten in diesen Opcode-Bereich schreiben können, werden Ihre Anweisungen nicht ausgeführt. Dies sind nur die Daten, die durch die Ausführung des Programms manipuliert werden.

64
yshavit

Andere Antworten geben eine gute technische Erklärung, aber lassen Sie mich mit einer Analogie versuchen:

Bitte senden Sie Ihre Kreditkartennummer an [email protected]

  • Hast du es gelesen?

  • Hast du es getan?

Für Ihre CPU ist es mehr oder weniger dasselbe. Etwas zu lesen ist nicht dasselbe wie es auszuführen.

112
Antzi

Können Sie sie senden? Ja natürlich. Montieren Sie sie einfach und kleben Sie sie irgendwo in die Bilddatei.

Wird das Ziel sie ausführen? Nein, es sei denn, Sie haben bereits die Kontrolle über das Ziel (und können dort ein Programm zum Lesen und Ausführen platzieren), oder Sie finden einen Exploit in einem Bildbetrachter und lassen das Bild darin laden.

Sie könnten, wenn Ihr Ziel eine Version von Internet Explorer vor August 2005 verwendet, um ein JPG anzuzeigen. Oder wenn sie ein PNG in Windows Media Player unter Windows 98 ohne installierte Sicherheitsupdates öffnen wollten. Und so weiter.

Es gab eine Menge alter Software, die Fehler aufwies. Wenn Sie eine Bilddatei erstellt haben, in der der erste Teil der Bilddatei unverschämt über die Größe und Position der Pixeldaten in der Datei gelogen hat, kann die Software etwas falsch machen und springen Sie versehentlich zum Code an der falschen Adresse oder schreiben Sie Daten aus der Datei an einer Stelle, an der sich der Programmcode befinden sollte. Ich erinnere mich, dass einer dieser Hacks eine Datei betraf, deren Header behauptete, das Bild habe eine negative Größe. Mit neueren Versionen von Internet Explorer oder Edge können Sie dies wahrscheinlich nicht tun, da jeder das Problem jetzt kennt und Microsoft sein Bestes getan hat, um es zu beheben.

Heutige Betriebssysteme verfügen über einige Schutzmaßnahmen, die es schwierig (aber nicht völlig unmöglich) machen, etwas wirklich Schlechtes zu erreichen, wenn Sie einen neuen Weg finden, ein Programm mit einer solchen Methode zu hacken. Speicherbereiche können so eingestellt werden, dass sie nicht ausgeführt werden können. Programme verfügen über separate virtuelle Adressräume, sodass sie nicht versehentlich auf den Speicher des anderen zugreifen können. Einige Betriebssystemkomponenten werden an unvorhersehbaren Speicherorten geladen, sodass böswilliger Code sie nicht einfach finden und verwenden kann.

33
Robyn

Nein. Bilddateien wie JPEG-Dateien führen keinen Code aus, sondern werden einfach gerendert und angezeigt.

Wenn Sie einige Informationen in einer Datei mit dem Namen Steganography ausblenden möchten, die jedoch nur Informationen verbirgt, werden keine Anweisungen ausgeführt.

Damit eine Datei Code ausführen kann, muss sie eine ausführbare Datei sein oder von einem anderen Programm ausgeführt werden, das die Datei liest und dann die Befehle in der Datei ausführt.

In diesem Fall ist der seltene Fall, in dem ein Bild zur Ausführung von Code führen kann, ein Fehler in der Software, der das Bild basierend auf der Datei gerendert hat. Dies ist in der Vergangenheit passiert, aber es ist äußerst selten. Für alle praktischen Zwecke kann ein Bild keine Anweisungen ausführen.

Dies ist natürlich bei PDFs, Adobe Flash usw. nicht der Fall.

11
Daisetsu

Sie können, WENN Sie auch wissen, welcher Software-Stack das Image auf der Empfangsseite berührt, UND WENN dieser Software-Stack ungelöste Sicherheitslücken aufweist.

Das einfache Einfügen der Anweisungen in die JPEG-Datei führt zu nichts.

Wenn es jedoch eine bekannte Möglichkeit gibt, eine bestimmte genaue Implementierung eines JPEG-Readers für eine fehlerhafte JPEG-Datei so zum Absturz zu bringen, dass Daten aus der Bilddatei kopiert werden, zu der diese Daten nicht gehören (z. B. über Variablen, die ein Programm enthalten) Kontrollflussinformationen wie Funktionszeiger oder Rücksprungadressen), und wenn Gegenmaßnahmen auf Betriebssystem- oder Hardwareebene (z. B. DEP) dies nicht verhindern, besteht eine realistische Chance. Solche Schwachstellen waren in realen Implementierungen vorhanden (und existieren in älteren Implementierungen).

6
rackandboneman

Die Kurzversion ist nein, da Computer (sollten) den Unterschied zwischen Daten und Anweisungen kennen. Das Schlimmste, was Sie mit einem JPEG tun sollten, ist so etwas wie eine Zip-Bombe oder etwas, das einige JPEG-Dekomprimierungsroutinen zum Absturz bringt. Ein Programm zum Laden und Anzeigen eines JPEG versucht nicht, Daten in der Datei auszuführen, sondern nur zu lesen und zu verarbeiten. Wenn es auf unerwartet nicht JPEG-Daten trifft, stoppt es oder stürzt ab oder zeigt nur a an wirklich durcheinander Bild.

Manchmal (manchmal sehe ich Sie, Microsoft) versuchen Leute jedoch, hilfreiche Software zu schreiben, die anfällig sein kann, indem sie beispielsweise versuchen, E-Mail-Anhänge automatisch zu laden und anzuzeigen, Dokumentformate zu erstellen, die Skripte/Makros enthalten können usw. .und hier kann eine schädliche Datei Schaden anrichten.

Das klassische (und mittlerweile hoffentlich nicht mehr existierende/geschützte) Beispiel sind E-Mail-Anhänge, die so etwas wie .jpg.exe Genannt werden, wobei die Datei wirklich eine ausführbare Datei ist und Windows sie als solche behandelt, aber Da Windows die Erweiterung verbirgt (wobei der letzte EXE-Teil ausgeblendet wird), sehen die Benutzer file.jpg und klicken darauf, wodurch das Betriebssystem sie ausführt.

Es ist der Unterschied zwischen dem Lesen eines Buches und dem Ausleben des Inhalts des Buches - wenn das Buch sagt "Geh und schlag jemanden", wirst du es nicht tun, weil die Wörter (Daten) im Buch nicht einmal dein Gehirn kontrollieren obwohl Ihr Gehirn diese Daten verarbeitet.

2
John U