สมมุติว่ามันเกี่ยวข้องกับหน่วยความจำบ้าง? สิ่งที่จะ
sudo cat /dev/urandom > /dev/mem
ทำ? ทิ้ง RAM ทั้งหมดหรือไม่ หน่วยความจำเสมือนที่ไม่ใช่เคอร์เนลทั้งหมดหรือไม่ ไม่มีข้อใดถูก?
สมมุติว่ามันเกี่ยวข้องกับหน่วยความจำบ้าง? สิ่งที่จะ
sudo cat /dev/urandom > /dev/mem
ทำ? ทิ้ง RAM ทั้งหมดหรือไม่ หน่วยความจำเสมือนที่ไม่ใช่เคอร์เนลทั้งหมดหรือไม่ ไม่มีข้อใดถูก?
คำตอบ:
มันให้การเข้าถึงหน่วยความจำกายภาพของระบบ
mem(4)
หน้าคนอธิบายเพิ่มเติมเกี่ยวกับสิ่งที่/dev/mem
เป็น
ใช่ - อาจทำให้เกิดปัญหาได้ทุกประเภท การรีบูตควรแก้ไขคุณ แต่สิ่งเลวร้ายสามารถเกิดขึ้นได้ง่ายมาก ระวัง! :-)
/ dev / mem ให้การเข้าถึงหน่วยความจำกายภาพของระบบไม่ใช่หน่วยความจำเสมือน พื้นที่แอดเดรสเสมือนของเมล็ดสามารถเข้าถึงได้โดยใช้ / dev / kmem
ส่วนใหญ่จะใช้เพื่อเข้าถึงที่อยู่หน่วยความจำ IO ที่เกี่ยวข้องกับฮาร์ดแวร์ต่อพ่วงเช่นอะแดปเตอร์วิดีโอ
sudo cat /dev/urandom > /dev/mem
จะไม่ทำอะไรเลยเพราะ sudo จะยกระดับสิทธิ์แมว แต่ไม่ใช่การเปลี่ยนเส้นทาง คุณสามารถทำได้sudo su
และทำงานในรูทเชลล์หรือใช้
sudo dd if=/dev/urandom of=/dev/mem
/dev/mem
ให้การเข้าถึงหน่วยความจำกายภาพเช่น RAM ทั้งหมดในระบบอย่างไรก็ตามนี่ไม่ได้หมายความว่ามันจะช่วยให้คุณเข้าถึง RAM แบบอ่าน / เขียนแบบเต็ม (ดูที่ CONFIG_STRICT_DEVMEM ตัวเลือกในเอกสารนี้ ) นอกจากนี้โปรดทราบว่าบางพื้นที่ของหน่วยความจำกายภาพจะมีอุปกรณ์อื่นเช่นหน่วยความจำการ์ดวิดีโอ ฯลฯ ที่แมปไว้
การเขียนแบบสุ่มไปยัง/dev/mem
จะส่งผลให้เกิดพฤติกรรมที่ไม่แน่นอนนี่คือวิดีโอ YouTube ที่ทำเช่นเดียวกัน
ทดสอบด้วย busybox devmem
busybox devmem
เป็นสาธารณูปโภค CLI เล็ก ๆ ที่ /dev/mem
mmaps
คุณสามารถหาได้จาก Ubuntu ด้วย: sudo apt-get install busybox
การใช้งาน: อ่าน 4 ไบต์จากที่อยู่จริง0x12345678
:
sudo busybox devmem 0x12345678
เขียน0x9abcdef0
ไปยังที่อยู่นั้น:
sudo busybox devmem 0x12345678 w 0x9abcdef0
ที่มา: https://github.com/mirror/busybox/blob/1_27_2/miscutils/devmem.c#L85
MAP_SHARED
เมื่อ mmapping /dev/mem
คุณมีแนวโน้มที่จะต้องการใช้:
open("/dev/mem", O_RDWR | O_SYNC);
mmap(..., PROT_READ | PROT_WRITE, MAP_SHARED, ...)
MAP_SHARED
ทำให้การเขียนไปที่หน่วยความจำกายภาพทันทีซึ่งทำให้ง่ายต่อการสังเกตและเหมาะสมสำหรับการเขียนลงทะเบียนฮาร์ดแวร์
CONFIG_STRICT_DEVMEM
และ nopat
ในการใช้/dev/mem
เพื่อดูและแก้ไข RAM ปกติบนเคอร์เนล v4.9 คุณต้องมีกำปั้น:
CONFIG_STRICT_DEVMEM
(ตั้งค่าเริ่มต้นบน Ubuntu 17.04)nopat
ตัวเลือกบรรทัดคำสั่งเคอร์เนลสำหรับ x86พอร์ต IO ยังคงทำงานโดยไม่มีสิ่งเหล่านั้น
ดูเพิ่มเติมที่: https://stackoverflow.com/questions/39134990/mmap-of-dem-mem-fails-with-invalid-argument-for-virt-to-phys-address-but-addre/45127582#45127582
ล้างแคช
หากคุณพยายามเขียนลง RAM แทนการลงทะเบียนหน่วยความจำอาจถูกแคชโดย CPU: https://stackoverflow.com/questions/22701352/how-to-flush-the-cpu-cache-for-a-region - ของที่อยู่พื้นที่ในลินุกซ์และฉันไม่เห็นวิธีพกพา / ง่ายในการล้างหรือทำเครื่องหมายพื้นที่ว่าไม่สามารถเข้าถึงได้:
ดังนั้นอาจ/dev/mem
ไม่สามารถใช้เชื่อถือได้ในการส่งผ่านบัฟเฟอร์หน่วยความจำไปยังอุปกรณ์?
ไม่สามารถสังเกตเห็นได้ใน QEMU เนื่องจาก QEMU ไม่ได้จำลองแคช
วิธีทดสอบ
ตอนนี้เพื่อความสนุกสนาน นี่คือการตั้งค่าที่ยอดเยี่ยม:
volatile
ตัวแปรให้กับกระบวนการ userland/proc/<pid>/maps
+/proc/<pid>/pagemap
devmem2
และดูกระบวนการของผู้ใช้ตอบสนอง:kmalloc
virt_to_phys
แล้วส่งกลับไปยัง userlanddevmem2
devmem2
เพื่อเขียนลงทะเบียนprintf
ออกมาจากอุปกรณ์เสมือนจริงในการตอบสนอง/ dev / mem ให้การเข้าถึงพื้นที่ที่อยู่จริงทั้งหมดตามธรรมเนียม นั่นรวมถึง ram แต่มันยังรวมถึงหน่วยความจำใด ๆ ที่ทำแผนที่อุปกรณ์ IO
เมล็ดที่ทันสมัยหลายแห่งจะถูกกำหนดค่าด้วย "CONFIG_STRICT_DEVMEM" ซึ่ง จำกัด / dev / mem สำหรับอุปกรณ์ที่แมป IO หน่วยความจำเท่านั้น
การเขียนขยะแบบสุ่มไปเป็นความคิดที่ไม่ดี แต่สิ่งที่เลวร้ายที่จะเกิดขึ้นคือการคาดการณ์ล่วงหน้า ฮาร์ดแวร์อาจตอบสนองด้วยวิธีที่ไม่คาดคิดในการสุ่มขยะโครงสร้างหน่วยความจำเคอร์เนลที่เสียหายอาจทำให้เกิดการทำงานของเคอร์เนลที่ไม่สามารถคาดเดาได้ ที่ดีที่สุดฉันคาดว่าจะเกิดความผิดพลาดของระบบที่ความเสียหายของข้อมูลที่เลวร้ายที่สุดหรือแม้กระทั่งการก่ออิฐฮาร์ดแวร์จะไม่ออกจากคำถาม
PS ทราบว่าคำสั่งของคุณเมื่อทำงานในฐานะผู้ใช้ปกติไม่ควรทำอะไรเพราะ sudo จะลบคำสั่ง cat เท่านั้นไม่ใช่การเปลี่ยนเส้นทาง
dd if=/dev/urandom of=/dev/kmem bs=1 count=1 seek=$RANDOM