Mungkin ini terkait dengan memori? Apa yang akan
sudo cat /dev/urandom > /dev/mem
melakukan? Buang semua RAM? Semua memori virtual non-kernel? Bukan dari salah satu di atas?
Mungkin ini terkait dengan memori? Apa yang akan
sudo cat /dev/urandom > /dev/mem
melakukan? Buang semua RAM? Semua memori virtual non-kernel? Bukan dari salah satu di atas?
Jawaban:
Ini memberikan akses ke memori fisik sistem.
The mem(4)halaman manual menjelaskan lebih lanjut tentang apa /dev/memyang.
Ya - itu bisa menyebabkan berbagai masalah. Reboot akan memperbaiki Anda, tetapi hal-hal buruk dapat terjadi dengan sangat mudah. Hati-hati! :-)
sudo cat /dev/urandom > /dev/memtidak akan melakukan apa-apa, karena sudo akan meningkatkan hak istimewa kucing tetapi tidak dari pengalihan. Anda dapat melakukannya sudo sudan kemudian bekerja di shell root, atau gunakan
sudo dd if=/dev/urandom of=/dev/mem
/dev/memmenyediakan akses ke memori fisik, yaitu semua RAM dalam sistem, namun ini tidak berarti bahwa itu memberi Anda akses baca / tulis penuh ke RAM (lihat opsi CONFIG_STRICT_DEVMEM dalam dokumen ini ). Perhatikan juga bahwa beberapa wilayah memori fisik akan memiliki perangkat lain seperti memori kartu video, dll. Yang dipetakan di atasnya.
Menulis secara membabi buta /dev/memakan mengakibatkan perilaku yang tidak pasti, di sini adalah video youtube melakukan hal yang sama.
Uji dengan busybox devmem
busybox devmemadalah utilitas CLI kecil yang mmaps /dev/mem.
Anda bisa mendapatkannya di Ubuntu dengan: sudo apt-get install busybox
Penggunaan: baca 4 byte dari alamat fisik 0x12345678:
sudo busybox devmem 0x12345678
Tulis 0x9abcdef0ke alamat itu:
sudo busybox devmem 0x12345678 w 0x9abcdef0
Sumber: https://github.com/mirror/busybox/blob/1_27_2/miscutils/devmem.c#L85
MAP_SHARED
Saat mmapping /dev/mem, Anda mungkin ingin menggunakan:
open("/dev/mem", O_RDWR | O_SYNC);
mmap(..., PROT_READ | PROT_WRITE, MAP_SHARED, ...)
MAP_SHARED membuat write masuk ke memori fisik segera, yang membuatnya lebih mudah untuk diamati, dan lebih masuk akal untuk hardware register menulis.
CONFIG_STRICT_DEVMEM dan nopat
Untuk menggunakan /dev/memuntuk melihat dan memodifikasi RAM reguler pada kernel v4.9, Anda harus mengepal:
CONFIG_STRICT_DEVMEM(ditetapkan secara default pada Ubuntu 17.04)nopatopsi baris perintah kernel untuk x86Port IO masih berfungsi tanpa itu.
Cache memerah
Jika Anda mencoba menulis ke RAM alih-alih register, memori dapat di-cache oleh CPU: https://stackoverflow.com/questions/22701352/how-to-flush-the-cpu-cache-for-a-region -of-address-space-in-linux dan saya tidak melihat cara yang sangat portabel / mudah untuk menyiramnya atau menandainya sebagai tidak dapat di-cache:
Jadi mungkin /dev/memtidak dapat digunakan secara andal untuk meneruskan buffer memori ke perangkat?
Sayangnya, ini tidak dapat diamati dalam QEMU, karena QEMU tidak mensimulasikan cache.
Cara mengujinya
Sekarang untuk bagian yang menyenangkan. Berikut ini beberapa pengaturan keren:
volatilevariabel pada proses userland/proc/<pid>/maps+/proc/<pid>/pagemapdevmem2, dan perhatikan proses userland bereaksi:kmallocvirt_to_physdan kirimkan kembali ke userlanddevmem2devmem2untuk menulis ke registerprintfkeluar dari perangkat virtual sebagai tanggapan/ dev / mem secara tradisional menyediakan akses ke seluruh ruang alamat fisik. Itu termasuk ram tetapi juga mencakup perangkat IO yang dipetakan memori.
Banyak kernel modern akan dikonfigurasikan dengan "CONFIG_STRICT_DEVMEM" yang membatasi / dev / mem hanya ke perangkat IO yang dipetakan di memori.
Menulis sampah secara acak adalah ide yang buruk, tetapi persis apa yang akan terjadi adalah sulit untuk diprediksi. Perangkat keras dapat merespons dengan cara yang tidak terduga terhadap sampah acak, struktur memori kernel yang rusak dapat menyebabkan perilaku kernel yang tidak dapat diprediksi. Paling-paling saya akan mengharapkan sistem crash, korupsi data terburuk atau bahkan bricking perangkat keras tidak keluar dari pertanyaan.
PS perhatikan bahwa perintah Anda ketika dijalankan sebagai pengguna biasa seharusnya tidak melakukan apa-apa, karena sudo hanya menghilangkan perintah cat, bukan redirect.
dd if=/dev/urandom of=/dev/kmem bs=1 count=1 seek=$RANDOM