systematic exploitation of physical read/write to map unsigned code into the kernel.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
xerox 3e71169f8f
Update README.md
5 years ago
README.md Update README.md 5 years ago

README.md

Credits

Before I begin, those who helped me create this project shall be credited.

  • Can1357, for helping me find the correct page in physical memory.
  • buck, for teaching me everything about paging tables.
  • Ch40zz, for helping me fix many issues for things I could never have fixed.
  • IChooseYou, for his work with physical memory.
  • Heep042, for his work with physical memory and paging tables.

Physmeme

Given map/unmap (read/write) of physical memory, one can now systematically map unsigned code into ones kernel. Many drivers expose this primitive and now can all be exploited by simply coding a few functions.

What drivers support physical read/write?

Any driver exposing MmMapIoSpace/MmUnmapIoSpace or ZwMapViewOfSection/ZwUnmapViewOfSection can be exploited. This means bios flashing utils, fan speed utils (like MSI Afterburner), or general windows system utilities that expose physical read/write.

Ff you are in any sort of doubt about the abundance of these drivers simply go to this page and ctrl-f "MmMapIoSpace".

How does it work?

First lets start with a given, controlled writes can be leveraged to gain execution. I think people call this "write what where", but nevertheless if you know where you are writing you can leverage it to gain execution in places that might not have been accessable proir. Now that we have that agreed upon, lets get into the details of how this works.

To start, lets first understand that one page of memory reguardless of physical or virtual is typically 0x1000 bytes or 4096 bytes. Now, given a relative virtual address of a syscall (an address relative to the base of the module) we can modulus the address with the size of a page (0x1000) and get the index into the page.

auto nt_syscall_offset = rva % 0x1000;

This index, combined with the iteraction of each physical page and a comparison of bytes will result in us finding the physical page of a syscall (and its mapped into our process). This then allows us the ability to install hooks, call the syscall, and then uninstall the hook. The "hook" being ExAllocatePool, ExAllocatePoolWithTag, and MmCopyMemory.