Обеспечение безопасности в Windows
Задание 4. В приложении поставить точку останова.
Указания к выполнению.
1. В созданном проекте уберите комментарии (//) перед оператором, обозначающим точку останова:
_asm int 3
2. Запустите проект. Программа должна прерваться в точке останова. Её выполнение можно продолжить, нажав кнопку Продолжить:
Задание 5. Запустить приложение ReadFile на виртуальной машине, установить точку останова на функции SeAccessCheck.
Указания к выполнению.
1. Исполняемый файл созданного в предыдущем пункте приложения ReadFile.exe после компиляции проекта должен находиться в следующей папке:
c:\Programs\ReadFile\Release.
Скопируйте исполняемый файл на виртуальную машину.
Скопируйте текстовый файл input.txt на виртуальную машину в ту же папку, что и исполняемый файл.
2. Запустите исполняемый файл. Выполнение программы должно прерываться, а управление перейти к отладчику WinDbg.
3. Установите в отладчике точку останова на функции SeAccessCheck для процесса ReadFile.exe. Для этого сначала следует определить адрес объекта EPROCESS для процесса ReadFile.exe при помощи команды:
!process 0 0 ReadFile.exe
В данном случае адрес равен 0x8222F630.
Установить точку останова для функции SeAccessCheck для процесса ReadFile.exe можно при помощи следующей команды:
bp /p 8222F630 nt!SeAccessCheck
Проверьте, что команда выполнена верно: в меню Edit отладчика выберите пункт Breakpoints…:
Замечание. После перезапуска процесса ReadFile.exe его адрес может поменяться. В этом случае придется удалить старую точку останова и повторить нахождение адреса объекта EPROCESS и установки новой точки останова.
4. Продолжите выполнение, нажав F5 в отладчике. Должна сработать точка останова на функции SeAccessCheck и откроется исходный код этой функции.
Задание 6. Исследовать маркер доступа (access token).
Указания к выполнению.
1. Функция SeAccessCheck проверяет возможность доступа процесса с заданным маркером доступа к объекту с определенным дескриптором защиты (см. лекцию 13 "Безопасность в Windows").
2. Адрес маркера доступа процесса содержится в поле PrimaryToken параметра SubjectSecurityContext. Чтобы узнать этот адрес, откройте в отладчике окно Locals (Alt+3) и раскройте параметр SubjectSecurityContext (нажмите "плюс" слева от имени параметра):
На рисунке видно, что адрес в поле PrimaryToken равен 0xE1249870.
3. Просмотрите содержимое структуры _TOKEN, по адресу, определенному в предыдущем пункте. Введите команду:
dt _token 0xE1249870
В этой структуре содержится вся информация о маркере. Например, ID маркера хранится в поле TokenID типа _LUID по смещению 0x010 от начала структуры. Чтобы узнать ID маркера, введите следующую команду:
dt _LUID 0xE1249870+0x010
В данном примере TokenID равен 0x963D2.
SID учетной записи пользователя владельца маркера и групп, в которые он входит, хранятся по адресу в поле UserAndGroups:
dt _SID_AND_ATTRIBUTES 0xe1249a00
В первом поле структуры _SID_AND_ATTRIBUTES хранится адрес SID. Чтобы узнать какой SID расположен по данному адресу, можно воспользоваться следующей командой:
!sid 0xe1249a58
Очевидно, что это SID учетной записи с именем Administrator, ведь процесс ReadFile запускался из под неё.
Структуры _SID_AND_ATTRIBUTES для групп, в которые входит учетная запись, расположены следом за той же структурой для учетной записи. Чтобы вывести адреса SID групп, можно набрать следующую команду:
dd 0xe1249a00
Структура _SID_AND_ATTRIBUTES для учетной записи Administrator выделена на рисунке красным, для первой группы, в которую входит Administrator – синим.
Чтобы узнать SID групп, можно снова воспользоваться командой !sid:
Этот SID соответствует группе Users (см. статью MSDN "Хорошо известные идентификаторы безопасности в операционных системах Windows").
4. В отладчике WinDbg имеется специальная команда для удобного отображения содержимого маркера доступа – !token.
Введите эту команду, указав адрес маркера доступа:
!token 0xE1249870
Сравните информацию, выводимую командой !token, с данными, полученными в предыдущем пункте путем анализа полей структуры TOKEN.