Читаем без скачивания Недокументированные и малоизвестные возможности Windows XP - Роман Клименко
Шрифт:
Интервал:
Закладка:
Теперь нужно сформировать таблицу поиска, импортируемых адресов и таблицу импорта.
Таблица поиска содержит адреса функций и способ их поиска в библиотеках (по порядковым номерам или именам). В нашем случае будем вести поиск по именам, поэтому таблица поиска, расположенная по адресу 1080, принимает такой вид: 1060,0,0,0,1070,0,0,0. Здесь 1060,0 указывает на функцию MessageBoxA (0 отделяет названия функций между собой), потом идет 0,0 — разграничитель между функциями различных библиотек, а 1070,0 — адрес функции ExitProcess из другой библиотеки. Следует также учитывать, что первые два байта перед названиями функций должны быть равны 0 — они являются индексом, по которому в библиотеке должны находиться функции, но поскольку индекс неизвестен, нужно оставить эти поля пустыми, чтобы загрузчик сам нашел в библиотеках данные функции.
Таблица импортируемых адресов располагается в самом начале секции (в нашем случае по адресу 1000) и содержит адреса импортируемых функций — аналог таблицы поиска.
Таблица импорта связывает библиотеки с таблицами поиска и импортируемых адресов (в коде начинается по адресу 1090). Каждая строка таблицы описывает одну библиотеку (сначала содержится адрес начала описания функций из библиотеки в таблице поиска (1080,0), потом два пустых поля (0,0,0,0), потом адрес, хранящий название библиотеки (1040,0), и адрес начала описания функций данной библиотеки в таблице импортируемых адресов (1000,0)). Аналогично описывается библиотека KERNEL32.DLL. После описания всех библиотек нужно оставить еще одну пустую строку таблицы импорта, то есть следующие 20 байт. Итого размер таблицы импорта равен 3Ч5Ч4 = 60, а в шестнадцатиричном виде — 3c, что мы и вводили в заголовке PE по адресу c0.
И наконец, последняя часть кода — сам код. Он начинается с адреса 10d0, который и является точкой входа в программу — ее мы и указывали в заголовке PE файла по адресу 68.
Код довольно прост, но написан на машинном языке:
db 6a,24
db 68,10,10,40,0
db 68,20,10,40,0
db 6a,0
db ff,15,0,10,40,0
db 6a,0
db ff,5,8,10,40,0
Так вызывается функция MessageBoxA и ей передаются необходимые параметры: сначала помещается значение 24 (указывает, что вызываемое окно имеет две кнопки и значок вопроса), потом адрес заголовка, адрес сообщения и 0 (дескриптор родительского объекта, которого у нас нет). Если описать приведенный код более просто, то получится:
■ Push 24 — поместить в стек значение 24;
■ Push offset «переменная с заголовком окна» — поместить в стек адрес памяти, содержащий заголовок окна;
■ Push offset «переменная с сообщением окна» — поместить в стек адрес памяти, хранящий сообщение окна;
■ Push 0 — поместить в стек 0;
■ Call «адрес памяти, содержащий название функции».
Аналогично вызывается функция ExitProcess.
Вот и все. Теперь только осталось скопировать диапазон адресов от 1000 до 1200, хранящий нашу программу, в память, начиная с адреса 200, а потом сместить всю программу на 100, так как при сохранении файла отладчик обрезает первые 100h байт памяти.
Простой пример
Конечно, приведенный выше пример довольно сложен — ведь он написан на машинном языке и в шестнадцатиричном виде. Но его можно упростить, ведь отладчик в Windows XP поддерживает как ASCII-символы, так и язык «Ассемблера».
Вот упрощением мы сейчас и займемся. Например, напишем программу, которая будет открывать созданный нами ранее файл (если он будет называться hello.exe и находиться на диске D:).
Листинг 13.2. Создание простого файла, открывающего другой файлОчистка памяти и описание заголовка файла аналогично приведенному выше примеру, поэтому эту часть кода мы пропустим.
а 1010
db "D:HELLO.EXE"
а 1040
db "SHELL32.DLL"
а 1050
db "KERNEL32.DLL"
а 1060
db 0,0,"ShellExecuteA"
а 1070
db 0,0,"ExitProcess"
а 1080
dw 1060,0,0,0,1070,0,0,0
а 1000
dw 1060,0,0,0,1070,0,0,0
а 1090
dw 1080,0,0,0,0,0,1040,0,1000,0
dw 1088,0,0,0,0,0,1050,0,1008,0
a 10d0
xor bx,bx
push bx
push bx
push bx
db 68,10,10,40,0
push bx
push bx
db ff,15,0,10,40,0
push bx
db ff,15,8,10,40,0
m 1000 1200 200
m 0 400 100
n d:rr.bin
r cx
400
w
Согласитесь, уже проще — ведь теперь не нужно вводить текстовую информацию в шестнадцатиричном виде. А если учесть еще одну возможность командной строки, то станет совершенно просто. Все дело в том, что совсем не обязательно вводить данный текст в отладчике, ведь можно воспользоваться Блокнотом, а потом просто скопировать введенный текст в буфер обмена, запустить debug.exe и нажать правую кнопку мыши в области его окна, чтобы отладчик начал обработку команд из буфера обмена. При этом только следует убедиться, что режим быстрой вставки в командной строке включен (DWORD-параметр Quick Edit, расположенный в ветви реестра HKEY_CURRENT_USERConsole, должен быть равен 1).
Другие команды программы
Программа debug.exe содержит и другие команды, но в контексте данной книги они описаны не будут. Если вас заинтересовала приведенная информация, то для начала предлагаю посмотреть описание команд программы debug.exe в Центре справки и поддержки операционной системы Windows XP.
Глава 14
Безопасность
В данной главе рассмотрим некоторые вопросы безопасности функционирования системы. В частности, опишем недокументированную угрозу получения учетной записи администратора с помощью учетной записи опытного пользователя и рассмотрим вопросы использования системной учетной записи.
Угроза получения учетной записи администратора с помощью учетной записи опытного пользователя
Как говорилось раньше, использование группы Опытные пользователи не приветствуется Microsoft, так как данная группа имеет очень многие права в системе. В этой главе хотелось бы рассказать еще об одной причине, по которой лучше не использовать группу Опытные пользователи. А именно, о способе получения прав администратора или отдельной его учетной записи в том случае, если на взламываемой машине у вас есть учетная запись опытного пользователя либо любая другая учетная запись, имеющая права на запуск служб. Например, этим способом может воспользоваться администратор, которому вы запретили создавать других администраторов, чтобы обойти ваше ограничение. Для работы данного метода на взламываемой системе также должны быть установлены дополнительные сервисы.
Для реализации данного метода взлома необходима сторонняя служба, файл которой в Windows не защищается WFP, а также к которой вы имеете доступ. Еще одним требованием к службе является обязательное разрешение взаимодействия с Рабочим столом, а значит, служба должна запускаться от имени системы. Как правило, такие службы появляются при установке антивирусов (например, «Антивируса Касперского»), различных пакетов для программирования (например, Microsoft Visual C++ или Microsoft Visual Studio .NET), программ получения сведений о системе (например, SySoftware Sandra), программ эмуляторов операционной системы (например, VMware) и других программ, которые требуют для своих нужд права администратора (рис. 14.1).
Если все условия выполняются, а, как правило, они выполняются уже потому, что сейчас офис или отдельный компьютер невозможен без установки антивируса, не говоря уже о других программах, то можно начать попытку взлома. Для этого нужно скопировать файл explorer.exe, расположенный в каталоге %systemroot%, в каталог, который используется для хранения файла службы, например, как показано на рис. 14.1, в каталог %programfiles%common filesmicrosoft sharedVS7Debug. После этого необходимо переместить куда-нибудь файл службы (на рис. 14.1 это файл mdm.exe), а файлу explorer.exe присвоить имя перенесенного нами файла службы (в нашем случае mdm.exe).
Рис. 14.1. Вот пример службы, файл которой не защищен WFP, так как он не находится в каталоге %systemroot%system32
Вот и все приготовления, которые могут занять у вас несколько минут. Дальше есть две линии сюжета: если служба на данный момент не запущена, то просто запустите ее и переходите к следующему абзацу книги. Если же служба в данный момент работает, то нужно перезагрузить компьютер (обязательно перезагрузить, если вы просто смените сеанс, то ничего не произойдет — служба не будет перезапущена). После перезагрузки компьютера, еще до загрузки оболочки, но уже после ввода регистрационных данных пользователя, перед вами отобразится окно Проводника. Это говорит о том, что запустилась измененная служба (конечно, это произойдет только в том случае, если параметр Type для службы равен 110, а параметр Start равен 2, это означает, что служба является приложением и запускается при входе пользователя в систему сервисом smss.exe). На данный момент окно Проводника вам не нужно, поэтому просто закройте его. Теперь в Диспетчере задач (нажмите комбинацию клавиш Ctrl+Alt+Delete для его вывода) нужно самому запустить оболочку explorer.exe, так как ваша оболочка теперь самостоятельно не загрузится. Для этого в меню Файл выберите пункт Новая задача (Выполнить) и в появившемся диалоговом окне введите команду explorer.exe. Все, теперь вы полностью вошли в систему и при этом измененная вами сторонняя служба не запущена (все приведенные действия нужны потому, что опытные пользователи могут запускать службы, но не останавливать их). Осталось только одно — запустить оснастку services.msc и самостоятельно запустить измененную службу.