Vermutlich hängt es irgendwie mit dem Gedächtnis zusammen? Was würde
sudo cat /dev/urandom > /dev/mem
machen? Alles RAM in den Papierkorb werfen? Alle Nicht-Kernel-virtuellen Speicher? Nichts des oben Genannten?
Vermutlich hängt es irgendwie mit dem Gedächtnis zusammen? Was würde
sudo cat /dev/urandom > /dev/mem
machen? Alles RAM in den Papierkorb werfen? Alle Nicht-Kernel-virtuellen Speicher? Nichts des oben Genannten?
Antworten:
Es bietet Zugriff auf den physischen Speicher des Systems.
Die mem(4)
Manpage erklärt mehr darüber, was /dev/mem
ist.
Ja - es könnte alle möglichen Probleme verursachen. Ein Neustart sollte Abhilfe schaffen, aber schlimme Dinge können sehr leicht passieren. Achtung! :-)
/ dev / mem bietet Zugriff auf den physischen Speicher des Systems , nicht auf den virtuellen Speicher. Auf den virtuellen Adressraum des Kernels kann mit / dev / kmem zugegriffen werden.
Es wird hauptsächlich verwendet, um auf E / A-Speicheradressen zuzugreifen, die sich auf Peripheriegeräte wie Videoadapter beziehen.
sudo cat /dev/urandom > /dev/mem
Ich werde nichts tun, da sudo das Privileg von cat, aber nicht von redirect erhöhen wird. Sie können entweder sudo su
in der Root-Shell arbeiten oder verwenden
sudo dd if=/dev/urandom of=/dev/mem
/dev/mem
Ermöglicht den Zugriff auf den physischen Speicher, dh den gesamten RAM im System. Dies bedeutet jedoch nicht, dass Sie vollständigen Lese- / Schreibzugriff auf den RAM erhalten (siehe CONFIG_STRICT_DEVMEM-Option in diesem Dokument). Beachten Sie auch, dass in einigen Regionen des physischen Speichers andere Geräte wie Grafikkartenspeicher usw. zugeordnet sind.
Blind zu schreiben führt zu /dev/mem
einem ungewissen Verhalten. Hier ist ein YouTube-Video, das dasselbe tut.
Probieren Sie es aus mit busybox devmem
busybox devmem
ist ein winziges CLI-Dienstprogramm, das mmaps /dev/mem
.
Du kannst es in Ubuntu bekommen mit: sudo apt-get install busybox
Verwendung: 4 Bytes von der physikalischen Adresse lesen 0x12345678
:
sudo busybox devmem 0x12345678
Schreiben Sie 0x9abcdef0
an diese Adresse:
sudo busybox devmem 0x12345678 w 0x9abcdef0
Quelle: https://github.com/mirror/busybox/blob/1_27_2/miscutils/devmem.c#L85
MAP_SHARED
Beim Mapping /dev/mem
möchten Sie wahrscheinlich Folgendes verwenden:
open("/dev/mem", O_RDWR | O_SYNC);
mmap(..., PROT_READ | PROT_WRITE, MAP_SHARED, ...)
MAP_SHARED
bewirkt, dass Schreibvorgänge sofort in den physischen Speicher verschoben werden, was das Beobachten erleichtert und für Hardware-Registerschreibvorgänge sinnvoller ist.
CONFIG_STRICT_DEVMEM
und nopat
Um /dev/mem
regulären RAM auf Kernel v4.9 anzeigen und ändern zu können, müssen Sie Folgendes ausführen:
CONFIG_STRICT_DEVMEM
(standardmäßig unter Ubuntu 17.04 eingestellt)nopat
Kernel-Befehlszeilenoption für x86IO-Ports funktionieren auch ohne diese.
Cache leeren
Wenn Sie versuchen, anstelle eines Registers in den RAM zu schreiben, wird der Speicher möglicherweise von der CPU zwischengespeichert: https://stackoverflow.com/questions/22701352/how-to-flush-the-cpu-cache-for-a-region -of-address-space-in-linux und ich sehe keine sehr tragbare / einfache Möglichkeit, es zu leeren oder die Region als nicht zwischenspeicherbar zu markieren:
/dev/mem
Kann also möglicherweise nicht zuverlässig verwendet werden, um Speicherpuffer an Geräte zu übergeben?
Dies kann in QEMU leider nicht beobachtet werden, da QEMU keine Caches simuliert.
Wie man es ausprobiert
Nun zum spaßigen Teil. Hier sind einige coole Setups:
volatile
Variable in einem Userland-Prozess zuweisen/proc/<pid>/maps
+/proc/<pid>/pagemap
devmem2
und beobachten, wie der Userland-Prozess reagiert:kmalloc
virt_to_phys
und geben Sie sie an das Userland zurückdevmem2
devmem2
, um in das Register zu schreibenprintf
wird als Antwort aus dem virtuellen Gerät ausgegeben/ dev / mem bot traditionell Zugriff auf den gesamten physischen Adressraum. Das schließt RAM ein, aber es schließt auch alle speicherabgebildeten IO-Geräte ein.
Viele moderne Kernel werden mit "CONFIG_STRICT_DEVMEM" konfiguriert, wodurch / dev / mem nur auf speicherabgebildete E / A-Geräte beschränkt wird.
Zufälliges Schreiben von Müll ist eine schlechte Idee, aber es ist schwer vorherzusagen, was genau passieren wird. Hardware reagiert möglicherweise auf unvorhersehbare Weise auf zufälligen Müll. Beschädigte Kernel-Speicherstrukturen können zu unvorhersehbarem Kernel-Verhalten führen. Bestenfalls würde ich einen Systemabsturz erwarten, im schlimmsten Fall kommen Datenverfälschungen oder gar Hardware-Bricking nicht in Frage.
PS: Beachten Sie, dass Ihr Befehl, wenn er als normaler Benutzer ausgeführt wird, nichts tun sollte, da das sudo nur den cat-Befehl und nicht die Umleitung aufhebt.
dd if=/dev/urandom of=/dev/kmem bs=1 count=1 seek=$RANDOM