Was ist / dev / mem?


40

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?


2
Siehe auch:dd if=/dev/urandom of=/dev/kmem bs=1 count=1 seek=$RANDOM
user3490

6
Sollte der Speicherschutz nicht den Zugriff auf den physischen Arbeitsspeicher für alle Prozesse außer dem, der diesem Bereich des Arbeitsspeichers zugewiesen wurde, stoppen? Oder überschreibt sudo diesen Schutz?
Matthew Lock

Antworten:


32

Es bietet Zugriff auf den physischen Speicher des Systems.

Die mem(4)Manpage erklärt mehr darüber, was /dev/memist.

Ja - es könnte alle möglichen Probleme verursachen. Ein Neustart sollte Abhilfe schaffen, aber schlimme Dinge können sehr leicht passieren. Achtung! :-)


4
Ich würde vorschlagen, die Mem-Manpage zu überprüfen. Lumpen ist richtig. "mem ist eine Gerätezeichendatei, die ein Abbild des Hauptspeichers des Computers ist. Sie kann zum Beispiel verwendet werden, um das System zu untersuchen (und sogar zu patchen). Byte-Adressen in mem werden als physikalische Speicheradressen interpretiert." Und ... "Die Datei kmem ist mit mem identisch, außer dass auf den virtuellen Kernel-Speicher und nicht auf den physischen Speicher zugegriffen wird."
Mr. Shickadance

@ Andrew Flanagan: Ihr Link zeigt jetzt, wie man mit dem Befehl time eine Stoppuhr einrichten kann.
Aiyion.Prime

1
@ Aiyion.Prime. Danke - wies auf eine archive.org-Version.
Andrew Flanagan

19

/ 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.


9

sudo cat /dev/urandom > /dev/memIch werde nichts tun, da sudo das Privileg von cat, aber nicht von redirect erhöhen wird. Sie können entweder sudo suin der Root-Shell arbeiten oder verwenden
sudo dd if=/dev/urandom of=/dev/mem

/dev/memErmö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/memeinem ungewissen Verhalten. Hier ist ein YouTube-Video, das dasselbe tut.


6

Probieren Sie es aus mit busybox devmem

busybox devmemist 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 0x9abcdef0an 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/memmö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/memregulären RAM auf Kernel v4.9 anzeigen und ändern zu können, müssen Sie Folgendes ausführen:

  • deaktivieren CONFIG_STRICT_DEVMEM(standardmäßig unter Ubuntu 17.04 eingestellt)
  • Übergeben Sie die nopatKernel-Befehlszeilenoption für x86

IO-Ports funktionieren auch ohne diese.

Siehe auch: https://stackoverflow.com/questions/39134990/mmap-of-dev-mem-fails-with-invalid-argument-for-virt-to-phys-address-but-addre/45127582#45127582

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/memKann 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:

  • Userland-Speicher
    • volatileVariable in einem Userland-Prozess zuweisen
    • Die physikalische Adresse erhalten Sie mit /proc/<pid>/maps+/proc/<pid>/pagemap
    • Die physikalische Adresse mit devmem2und beobachten, wie der Userland-Prozess reagiert:
  • Kernelland-Speicher
    • Kernelspeicher zuweisen mit kmalloc
    • Holen Sie sich die physikalische Adresse mit virt_to_physund geben Sie sie an das Userland zurück
    • Ändern Sie die physikalische Adresse mit devmem2
    • Fragen Sie den Wert vom Kernel-Modul ab
  • IO mem und QEMU Virtual Platform Device
    • Erstellen Sie ein Plattformgerät mit bekannten physischen Registeradressen
    • Verwenden Sie devmem2, um in das Register zu schreiben
    • Die Uhr printfwird als Antwort aus dem virtuellen Gerät ausgegeben

5

/ 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.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.