Hui, ein nietliches Progrämmchen, das ich da heute Zusammengeschustert habe. Ich wollte mal wissen, was so passiert, wenn man ein paar Bytes von /dev/urandom in ein Array liest, und dieses Array dann vom Processor ausführen lässt.
Dies geht anscheinend tatsächlich mit C – bzw. ich bin nicht sicher, ob es wirklich geht, zumindest passiert aber etwas, was die Vermutung nahelegt.
Erstmal der Code (unter der üblichen Lizenz dieses Blogs stehend) – bitte NICHT einfach compilieren und ausführen (nur falls das jemandem nicht sowieso schon klar ist), es ist unwahrscheinlich aber möglich, dass das Programm ziemlich schlechte Sachen macht:
#include <stdio.h>
typedef void (*func_t) (void);
FILE *urandom;
char code[2048];
int main (void) {
printf ("Opening /dev/urandom.n");
urandom = fopen("/dev/urandom", "r");
if (urandom == NULL) {
printf("Could not open /dev/urandom.");
return 1;
}
printf ("Trying to read 2048 bytes from /dev/urandom.n");
fread(&code, 2048, 1, urandom);
printf ("Trying to execute the read bytes.n");
((func_t)code)();
printf ("Closing /dev/urandom.n");
fclose(urandom);
return 0;
}
Die Ausführung dieses Codes ist witzig. Er kommt standardmäßig dazu, die Zeile „Trying to execute the read bytes.“ auszuführen, danach ist dann aber idR Schluss, und ich bekomme irgendeinen Fehler – wie zu erwarten ist – nur in seltenen Fällen ergibt sich eine Endlosschleife.
Die printf-Anweisungen habe ich da eigentlich nur hingetan, um mir sicher sein zu können, dass auch wirklich was getan wird, und das Programm nicht vorher abstürzt. Jetzt hab ich sie mal auskommentiert, brav LANG=C gesetzt, und das Programm 1000 mal ausführen lassen (das Programm heißt uex, weil mir urandom-execute zu lang war)
$ i=0; while [ $i -le 1000 ]; do ((i++)); ./uex; done
Lieferte folgende Ausgabe:
Segmentation fault
Segmentation fault
Segmentation fault
Trace/breakpoint trap
Segmentation fault
Segmentation fault
Segmentation fault
Segmentation fault
Segmentation fault
Segmentation fault
Segmentation fault
Segmentation fault
Segmentation fault
Segmentation fault
Segmentation fault
Segmentation fault
Segmentation fault
Segmentation fault
Segmentation fault
Segmentation fault
Segmentation fault
Segmentation fault
Segmentation fault
Segmentation fault
Segmentation fault
Segmentation fault
Segmentation fault
Segmentation fault
Segmentation fault
Segmentation fault
Segmentation fault
Segmentation fault
Segmentation fault
Segmentation fault
Segmentation fault
Trace/breakpoint trap
Segmentation fault
Illegal instruction
Segmentation fault
Segmentation fault
Segmentation fault
Illegal instruction
Segmentation fault
Illegal instruction
Segmentation fault
Segmentation fault
Segmentation fault
Illegal instruction
Segmentation fault
Segmentation fault
Segmentation fault
Illegal instruction
Segmentation fault
Segmentation fault
Segmentation fault
Trace/breakpoint trap
Segmentation fault
Segmentation fault
Illegal instruction
Segmentation fault
Illegal instruction
Segmentation fault
Segmentation fault
Illegal instruction
Segmentation fault
Segmentation fault
Segmentation fault
Segmentation fault
Segmentation fault
Segmentation fault
Segmentation fault
Segmentation fault
Segmentation fault
Segmentation fault
Segmentation fault
Segmentation fault
Segmentation fault
Segmentation fault
Segmentation fault
Segmentation fault
Illegal instruction
Segmentation fault
Segmentation fault
Segmentation fault
Segmentation fault
Segmentation fault
Illegal instruction
Segmentation fault
Segmentation fault
Segmentation fault
Segmentation fault
Segmentation fault
Segmentation fault
Illegal instruction
Segmentation fault
Segmentation fault
Segmentation fault
Segmentation fault
Segmentation fault
Segmentation fault
Segmentation fault
Segmentation fault
Segmentation fault
Segmentation fault
Segmentation fault
Segmentation fault
Segmentation fault
Segmentation fault
Segmentation fault
Segmentation fault
Segmentation fault
Segmentation fault
Segmentation fault
Segmentation fault
Segmentation fault
Segmentation fault
Segmentation fault
Segmentation fault
Segmentation fault
Segmentation fault
Segmentation fault
Illegal instruction
Illegal instruction
Segmentation fault
Segmentation fault
Segmentation fault
Segmentation fault
Segmentation fault
Segmentation fault
Segmentation fault
Segmentation fault
Segmentation fault
Segmentation fault
Illegal instruction
Segmentation fault
Segmentation fault
Segmentation fault
Segmentation fault
Illegal instruction
Segmentation fault
Segmentation fault
Segmentation fault
Segmentation fault
Trace/breakpoint trap
Segmentation fault
Floating point exception
Segmentation fault
Illegal instruction
Segmentation fault
Segmentation fault
Segmentation fault
Segmentation fault
Segmentation fault
Segmentation fault
Segmentation fault
Segmentation fault
Segmentation fault
Segmentation fault
Segmentation fault
Segmentation fault
Segmentation fault
Segmentation fault
Segmentation fault
Segmentation fault
Segmentation fault
Segmentation fault
Segmentation fault
Segmentation fault
Segmentation fault
Segmentation fault
Illegal instruction
Segmentation fault
Segmentation fault
Segmentation fault
Segmentation fault
Segmentation fault
Segmentation fault
Segmentation fault
Segmentation fault
Segmentation fault
Segmentation fault
Segmentation fault
Segmentation fault
Segmentation fault
Segmentation fault
Segmentation fault
Segmentation fault
Segmentation fault
Segmentation fault
Segmentation fault
Segmentation fault
Segmentation fault
Illegal instruction
Segmentation fault
Segmentation fault
Segmentation fault
Segmentation fault
Segmentation fault
Segmentation fault
Segmentation fault
Segmentation fault
Segmentation fault
Illegal instruction
Segmentation fault
Illegal instruction
Segmentation fault
Segmentation fault
Segmentation fault
Segmentation fault
Segmentation fault
Segmentation fault
Segmentation fault
Segmentation fault
Illegal instruction
Segmentation fault
Segmentation fault
Segmentation fault
Segmentation fault
Segmentation fault
Segmentation fault
Segmentation fault
Segmentation fault
Segmentation fault
Segmentation fault
Segmentation fault
Segmentation fault
Illegal instruction
Segmentation fault
Segmentation fault
Segmentation fault
Segmentation fault
Illegal instruction
Segmentation fault
Segmentation fault
Illegal instruction
Segmentation fault
Segmentation fault
Segmentation fault
Segmentation fault
Trace/breakpoint trap
Segmentation fault
Segmentation fault
Segmentation fault
Segmentation fault
Segmentation fault
Segmentation fault
Segmentation fault
Segmentation fault
Segmentation fault
Segmentation fault
Illegal instruction
Segmentation fault
Segmentation fault
Segmentation fault
Segmentation fault
Segmentation fault
Segmentation fault
Segmentation fault
Segmentation fault
Segmentation fault
Segmentation fault
Segmentation fault
Segmentation fault
Segmentation fault
Segmentation fault
Illegal instruction
Segmentation fault
Illegal instruction
Segmentation fault
Segmentation fault
Segmentation fault
Segmentation fault
Segmentation fault
Segmentation fault
Segmentation fault
Illegal instruction
Segmentation fault
Segmentation fault
Segmentation fault
Segmentation fault
Segmentation fault
Segmentation fault
Segmentation fault
Trace/breakpoint trap
Segmentation fault
Segmentation fault
Segmentation fault
Segmentation fault
Segmentation fault
Segmentation fault
Segmentation fault
Segmentation fault
Segmentation fault
Segmentation fault
Segmentation fault
Segmentation fault
Segmentation fault
Segmentation fault
Segmentation fault
Segmentation fault
Illegal instruction
Segmentation fault
Segmentation fault
Segmentation fault
Illegal instruction
Segmentation fault
Segmentation fault
Segmentation fault
Segmentation fault
Segmentation fault
Segmentation fault
Segmentation fault
Segmentation fault
Segmentation fault
Trace/breakpoint trap
Segmentation fault
Segmentation fault
Segmentation fault
Segmentation fault
Segmentation fault
Segmentation fault
Segmentation fault
Segmentation fault
Illegal instruction
Segmentation fault
Segmentation fault
Segmentation fault
Segmentation fault
Segmentation fault
Illegal instruction
Segmentation fault
Segmentation fault
Illegal instruction
Segmentation fault
Segmentation fault
Illegal instruction
Segmentation fault
Trace/breakpoint trap
Segmentation fault
Segmentation fault
Segmentation fault
Segmentation fault
Segmentation fault
Danach stoppte die Ausgabe. (Wer zählt für mich, wie viele das waren? wc -l geht leider in dem Fall nicht…)
$ ps -ef | grep uex
tester 9397 6105 73 01:43 pts/1 00:00:12 ./uex
1000 9458 9398 0 01:44 pts/2 00:00:00 grep uex
Interessant. Auch top zeigt an dass uex ziemlich viele Systemressourcen verbraucht. Vermutlich hat sich das Programm in einer endlosen Schleife verfangen. Genaugenommen muss jedes so zufällig generierte Programm ja entweder terminieren, oder sich in einer endlosen Schleife verfangen. Die Wahrscheinlichkeit dafür, dass sich eine Endlosschleife aus zufälligen Bytes ergibt, kann man sicherlich irgendwie approximativ bestimmen – genau vermutlich nur theoretisch, und sicherlich nur unter Ausnutzung der physischen beschränktheit des Computers (letztendlich /kann/ sich auch plötzlich ein Code bilden, der das gesamte Nutzvolumen des Rechners ausnutzt, um die Endlosschleife möglichst groß zu machen – oder möglichst lange zu brauchen, um zu terminieren), und wahrscheinlich nur mit guter Kenntnis der x86-Architektur.
Ja mei. Und was bringt das Ganze? Mir hat es sinnlosen Zeitvertreib gebracht, und das Wissen, dass man tatsächlich ausführbaren Maschinencode direkt in C aufrufen kann.