Polyglott
Vor ein paar Jahren habe ich mal was über Quines geschrieben: Das sind Programme, die ihren eigenen Sourcecode ausgeben. Das ist komplizierter, als es im ersten Moment klingt.
Eine ähnliche Kategorie sind polyglotte Programme oder Dateien. Ein polyglottes Programm ist ohne Änderung am Quelltext gleichzeitig ein gültiges Programm in mehreren Programmiersprachen. Ein sehr stupides minimales Beispiel konnte ich mir selber zusammenbauen:
Polyglotter Code
Einerseits ist das hier ein handelsübliches C-Programm (ganz stumpf
mit #ifdef
), …
- #include <stdio.h>
- #ifdef NOT_DEFINED
- use strict;
- use warnings;
- foreach my $i (0 .. @ARGV - 1) {
- printf("arg %d is %s\n", $i, $ARGV[$i]);
- }
- __DATA__
- #endif
- int main(int argc, char** argv) {
- for (int i = 0; i < argc; i++) {
- printf("arg %d is %s\n", i, argv[i]);
- }
- return 0;
- }
…andererseits ist es gleichzeitig ein Perl-Programm mit
__DATA__
-Block:
- #include <stdio.h>
- #ifdef NOT_DEFINED
- use strict;
- use warnings;
- foreach my $i (0 .. @ARGV - 1) {
- printf("arg %d is %s\n", $i, $ARGV[$i]);
- }
- __DATA__
- #endif
- int main(int argc, char** argv) {
- for (int i = 0; i < argc; i++) {
- printf("arg %d is %s\n", i, argv[i]);
- }
- return 0;
- }
Beides ist compilier- bzw. ausführbar.
Wer erspäht den subtilen Unterschied zwischen beiden Varianten,
ohne den Code tatsächlich auszuführen?
Mit C und COBOL wäre das aufgrund der festen Spaltenstruktur von COBOL gar zu einfach, da muss man nur abwechselnd Kommentare setzen:
- /**/ int i=3;
- // MOVE a TO b
Polyglotte Dateien
Ich bin auf diesen aktuellen Tweet gestoßen worden, der ziemlich großartig ist: Das angehängte Bild ist einerseits ein gültiges JPEG, andererseits ein ZIP, das ein Multipart-RAR enthält, welches wiederum die kompletten Werke von Shakespeare enthält. Mit der direkten URL des Bildes könnt ihr mal das selber überprüfen.
Technisch ist das wohl „nur“ ein JPEG, an das hintendran ein ZIP gehängt ist. Wenn der ZIP-Entpacker den Datenmüll vorne erfolgreich überspringt (das macht wohl fast jede Implementierung), hat man gewonnen. Lustigerweise erkennt Twitter das nicht als Bug an, womit der Dienst gerade offiziell zu einer Dateiablage für alles mögliche geworden ist. Hier veröffentlicht der Autor des obigen Kunststückes z.B. seinen Quellcode als PDF in einem ZIP in einem JPG.
Natürlich werden auch sofort Rufe nach einem Twitter-basierten Netzwerkfilesystem laut.
Der zugehörige Thread auf Hackernews enthält einen Twitter-basierten Softwareinstaller, den ich hier mal zitiere:
- curl -s https://pbs.twimg.com/media/Dq2sPGNU0AEKyyC.jpg | dd status=none bs=1 skip=599 count=40| sh
Außerdem verweist dieser Thread auf das International Journal of Proof-of-Concept or Get The Fuck Out, dem ich früher schon einmal begegnet bin. Die stehen auf polyglott:
Polyglotter Wahnsinn
Die Übersicht über die Ausgaben des Journals enthält bei den alten Ausgaben Spoiler-Links, die erklären, was die vermeintlichen PDF-Dateien noch so sind.
Für die neueren Ausgaben zitiere ich mal direkt aus dem obigen Hackernews-Thread:
- PoC || GTFO 0x15 „is a laser-projectable PDF that's also a ZIP containing, among other things, another PDF that is also a Git repo of its own source code“
- PoC || GTFO 0x16 „is valid as a PDF document, a ZIP archive, and a Bash script that runs a Python webserver which hosts Kaitai Struct’s WebIDE which, allowing you to view the file’s own annotated bytes“
- PoC || GTFO 0x17 „is a PDF that's also a valid ZIP and valid firmware for Apollo Guidance Computer“
Wie geil ist das denn!
Als Schmankerl sind die PDFs nach Konvertierung per pdftotext
richtig schön lesbar (zumindest Ausgabe 0x16, die ich mal ausprobiert
habe).
Mir ist vollkommen klar, dass komplexe polyglotte Dateien per Skript oder Programm zusammengebaut werden (denn was der findige Programmierer ein zweites Mal tun muss, wird automatisiert), aber das initiale Puzzeln, Experimentieren und Basteln und die kreativen Ergebnisse faszinieren mich trotzdem.
Netz - Rettung - Recht am : Wellenreiten 11/2018