И наконец, последняя часть кода — сам код. Он начинается с адреса 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_USER\Console, должен быть равен 1).
Программа debug.exe содержит и другие команды, но в контексте данной книги они описаны не будут. Если вас заинтересовала приведенная информация, то для начала предлагаю посмотреть описание команд программы debug.exe в Центре справки и поддержки операционной системы Windows XP.
В данной главе рассмотрим некоторые вопросы безопасности функционирования системы. В частности, опишем недокументированную угрозу получения учетной записи администратора с помощью учетной записи опытного пользователя и рассмотрим вопросы использования системной учетной записи.
Угроза получения учетной записи администратора с помощью учетной записи опытного пользователя
Как говорилось раньше, использование группы Опытные пользователи не приветствуется Microsoft, так как данная группа имеет очень многие права в системе. В этой главе хотелось бы рассказать еще об одной причине, по которой лучше не использовать группу Опытные пользователи. А именно, о способе получения прав администратора или отдельной его учетной записи в том случае, если на взламываемой машине у вас есть учетная запись опытного пользователя либо любая другая учетная запись, имеющая права на запуск служб. Например, этим способом может воспользоваться администратор, которому вы запретили создавать других администраторов, чтобы обойти ваше ограничение. Для работы данного метода на взламываемой системе также должны быть установлены дополнительные сервисы.
Читать дальше