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/mem
yang.
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/mem
tidak akan melakukan apa-apa, karena sudo akan meningkatkan hak istimewa kucing tetapi tidak dari pengalihan. Anda dapat melakukannya sudo su
dan kemudian bekerja di shell root, atau gunakan
sudo dd if=/dev/urandom of=/dev/mem
/dev/mem
menyediakan 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/mem
akan mengakibatkan perilaku yang tidak pasti, di sini adalah video youtube melakukan hal yang sama.
Uji dengan busybox devmem
busybox devmem
adalah 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 0x9abcdef0
ke 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/mem
untuk melihat dan memodifikasi RAM reguler pada kernel v4.9, Anda harus mengepal:
CONFIG_STRICT_DEVMEM
(ditetapkan secara default pada Ubuntu 17.04)nopat
opsi 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/mem
tidak 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:
volatile
variabel pada proses userland/proc/<pid>/maps
+/proc/<pid>/pagemap
devmem2
, dan perhatikan proses userland bereaksi:kmalloc
virt_to_phys
dan kirimkan kembali ke userlanddevmem2
devmem2
untuk menulis ke registerprintf
keluar 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