Как виртуальное системное пространство защищено от доступа? - PullRequest
0 голосов
/ 15 ноября 2018

Вкл. Документы Microsoft Я прочитал:

В 64-битной Windows теоретический объем виртуального адресного пространства составляет 2 ^ 64 байта (16 эксабайт), но фактически используется только небольшая часть диапазона 16 эксабайт. 8-терабайтный диапазон от 0x000'00000000 до 0x7FF'FFFFFFFF используется для пространства пользователя, а части 248-терабайтного диапазона от 0xFFFF0800'00000000 до 0xFFFFFFFF'FFFFFFFF используются для системного пространства.

Поскольку у меня есть 64-битные указатели, я мог бы создать указатель, который указывает на какой-то адрес 0xFFFFxxxxxxxxxxxx.

Сайт продолжается:

Код, работающий в пользовательском режиме, имеет доступ к пользовательскому пространству, но не имеет доступа к системному пространству.

Если бы я мог угадать действительный адрес в системном виртуальном адресном пространстве, какой механизм мешает мне писать там?

Я знаю о защите памяти , но, похоже, в ней нет ничего, что отличало бы пользовательскую память от системной памяти.

1 Ответ

0 голосов
/ 09 апреля 2019

Согласно комментариям @ RbMm , эта информация хранится в PTE (запись таблицы страниц). Кажется, есть бит, который определяет, предоставляется ли доступ из пользовательского режима.

Это подтверждается статьей о ЛАРН онлайн , в которой говорится

Имя бита: доступ пользователя

Кажется, сама структура не является частью символов Microsoft

0:000> dt ntdll!_page*
          ntdll!_PAGED_LOOKASIDE_LIST
          ntdll!_PAGEFAULT_HISTORY
0:000> dt ntdll!page*
0:000> dt ntdll!*pte*
00007fff324fe910  ntdll!RtlpTestHookInitialize

PTE тесно поддерживаются процессором (MMU, блок управления памятью, в частности). Вот почему мы находим дополнительную информацию в OSDev , которая гласит

U, бит «Пользователь / Супервизор», управляет доступом к странице на основе уровня привилегий. Если бит установлен, то страница может быть доступна всем; однако, если бит не установлен, только супервизор может получить к нему доступ.

В некоторых файлах утечки SDK бит выглядит как

unsigned __int64 Owner : 1;

Поскольку PTE поддерживается процессором, мы должны найти похожие вещи в Linux. И вуаля, я вижу этот ТАК ответ , который также имеет бит:

#define _PAGE_USER 0x004

, что в точности соответствует информации OSDev.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...