книги хакеры / Защита_от_взлома_сокеты,_эксплойты,_shell_код_Фостер_Дж_
.pdf
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
|
|
hang |
e |
|
|
|
|
|
||
|
|
|
C |
|
E |
|
|
|
|
|
|
|
C |
|
E |
|
|
|
||||||
|
|
X |
|
|
|
|
|
|
|
|
|
X |
|
|
|
|
|
|
||||||
|
- |
|
|
|
|
|
d |
|
|
|
- |
|
|
|
|
|
d |
|
||||||
|
F |
|
|
|
|
|
|
|
t |
|
|
|
F |
|
|
|
|
|
|
|
t |
|
||
|
D |
|
|
|
|
|
|
|
|
i |
|
|
|
D |
|
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
|
r |
|
|
|
|
|
|
|
|
|
|
r |
||||
P |
|
|
|
|
|
NOW! |
o |
|
P |
|
|
|
|
|
NOW! |
o |
||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||
|
|
|
|
|
BUY |
|
|
|
|
|
|
|
|
BUY |
|
|
||||||||
|
|
|
|
to |
|
|
|
|
|
|
Часто задаваемые вопросы 641 |
|
to |
|
|
|
|
|
|
|||||
w Click |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||
|
|
|
|
|
|
|
m |
|
w Click |
|
|
|
|
|
|
|
m |
|||||||
w |
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
|
|
|
||
|
w |
|
|
|
|
|
|
|
|
o |
|
|
|
w |
|
|
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
g |
.c |
|
|
|
. |
|
|
|
|
g |
.c |
|
||||||
|
|
p |
|
|
|
|
|
|
|
|
|
|
p |
|
|
|
|
|
|
|
||||
|
|
|
df |
|
|
n |
e |
|
|
|
|
|
df |
|
|
n |
e |
|
||||||
|
|
|
|
|
Часто задаваемые вопросы |
|
|
|
|
-x cha |
|
|
|
|
|
|||||||||
|
|
|
|
-xcha |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Следующие часто задаваемые вопросы, на которые отвечают авторы книги, призваны помочь вам оценить, насколько хорошо вы поняли идеи, изложенные в данной главе, и возможные их применения на практике. Если вы хотите задать авторам вопрос, зайдите на страницу www.syngress.com/solutions и заполните форму Ask the Author. Заодно вы получите доступ к тысячам других FAQов на сайте ITFAQnet.com.
Â: Надо ли знать, как писать shell-код, для того чтобы пользоваться каркасом Metasploit?
Î: Нет. Пользуясь Web-интерфейсом msfweb или утилитами msfpayload è msfencode, разработчик может полностью забыть о написании shell-кода, ограничившись лишь копированием готовых фрагментов в свой эксплойт. Если эксплойт разрабатывается в каркасе Metasploit, то его автор может никогда и не увидеть полезную нагрузку.
Â: Нужно ли обязательно кодировать полезную нагрузку?
Î: Нет. Если полезная нагрузка не содержит недопустимых символов, то ее можно послать и в незакодированном виде. Основная задача кодировщиков – устранить недопустимые символы.
Â: Обязательно ли использовать генератор NOP-команд при встраивании эксплойта к каркас?
Î: Нет. Можете присвоить значение 0 параметрам MaxNops è MinNops â õýøå Payload внутри хэша %info. Тогда каркас не станет автоматически добавлять NOP-команды в полезную нагрузку. Можно вместо этого переопределить методы PayloadMinOps è PayloadMinOps так, чтобы они не возвращали NOP-команд.
Â: Я вычислил смещение, подобрал адрес возврата, определил недопустимые символы и максимальный размер, успешно сгенерировал и закодировал полезную нагрузку. Но по какой-то причине отладчик перехватывает управление процессом где-то в середине исполнения shell-кода. Я точно не знаю, что происходит, но складывается впечатление, что полезная нагрузка изменена. Мне казалось, что я выявил все недопустимые символы.
Î: Скорее всего, вызывается какая-то функция, которая модифицирует часть стека, в которой находится ваш эксплойт. Обращение к этой функции происходит уже после того, как строка атаки помещена в стек, но до загрузки адреса возврата в регистр EIP. Следовательно, эта функция всегда будет
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
|
hang |
e |
|
|
|
|
|
||
|
|
|
C |
|
E |
|
|
|
|
|
|
C |
|
E |
|
|
|
||||||
|
|
X |
|
|
|
|
|
|
|
|
X |
|
|
|
|
|
|
||||||
|
- |
|
|
|
|
|
d |
|
|
- |
|
|
|
|
|
d |
|
||||||
|
F |
|
|
|
|
|
|
|
i |
|
|
F |
|
|
|
|
|
|
|
i |
|
||
|
|
|
|
|
|
|
|
t |
|
|
|
|
|
|
|
|
|
t |
|
||||
P |
D |
|
|
|
|
|
|
|
|
o |
P |
D |
|
|
|
|
|
|
|
|
o |
||
|
|
|
|
NOW! |
r |
|
|
|
|
NOW! |
r |
||||||||||||
|
|
|
|
|
BUY |
|
|
|
|
|
|
|
BUY |
|
|
||||||||
|
|
|
|
to |
|
|
|
642 Глава 12. Написание эксплойтов III |
|
|
|
|
to |
|
|
|
|
|
|
||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||
w |
|
|
|
|
|
|
|
|
|
m |
w |
|
|
|
|
|
|
|
|
|
m |
||
w Click |
|
|
|
|
|
|
o |
w Click |
|
|
|
|
|
|
o |
||||||||
|
w |
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
|
|
||
|
. |
|
|
|
|
|
|
.c |
|
|
. |
|
|
|
|
|
|
.c |
|
||||
|
|
p |
df |
|
|
|
|
e |
|
|
|
p |
df |
|
|
|
|
e |
|
||||
|
|
|
|
|
g |
|
|
|
|
|
|
|
|
g |
|
|
|
||||||
|
|
|
|
|
n |
|
|
|
|
|
|
|
|
|
n |
|
|
|
|
||||
|
|
|
|
-xcha |
|
|
вызываться, и вы ничего не можете с этим поделать. Попробуйте изменить-x cha |
|
|
|
|
|
вектор управления и не помещать полезную нагрузку в те области памяти, которые подвергаются модификации. Можно вместо этого написать специальный shell-код, который с помощью команды JMP обойдет эти области. В большинстве случаев пристальное изучение окна содержимого памяти покажет, какие области могут быть изменены посторонней функцией.
Â: Всякий раз, как я пытаюсь определить смещение, посылая длинную строку, отладчик слишком рано перехватывает управление и твердит что-то о неправильном адресе в памяти.
Î: Скорее всего, какая-то функция читает значение из стека, предполагая, что там должен находиться корректный адрес и пытается перейти по нему. Посмотрите в окно дизассемблера, это должно помочь вам разобраться, какая команда приводит к ошибке. Если привлечь еще окно содержимого памяти, то вы сможете изменить «плохие» байты в строке атаки, так чтобы они указывали на правильный адрес.
Â: Чтобы проверить, ведет ли адрес возврата на мою полезную нагрузку, я послал строку букв ‘а’. Я полагал, что EIP должен указывать на одну из этих букв, а поскольку ‘a’ – это не корректная команда, то исполнение должно прекратиться. Так я и собирался проверить, что EIP указывает, куда нужно. Но ничего подобного не происходит. Когда процесс останавливается, состояние процесса оказывается совсем не таким, как я ожидал.
Î: Ошибка состоит в предположении, будто символ ‘a’ обязательно вызовет останов из-за несуществующей команды. Если записать в адрес возврата четыре символа ‘a’, то исполнение может и прерваться, поскольку адрес 0x61616161 не обязательно принадлежит программе. Но на 32-разрядном процессоре x86 символ ‘a’ с кодом 0x61 интерпретируется как однобайтовая команда POPAD, которая последовательно извлекает из стека 32-разрядные значения и загружает их в регистры EDI, ESI, EBP, в «никуда» (вместо загрузки в ESP), EBX, EDX, ECX и EAX. Если EIP указывает на ячейку, содержащую букву ‘a’, то он выполняет команду POPAD, что приводит к многократному извлечению из стека и полностью изменяет текущее состояние процесса. В частности, останов происходит совсем не там, где вы ожидали. Чтобы корректно проверить, что EIP указывает внутрь полезной нагрузки, лучше послать строку, состоящую из байтов 0xCC, которые интерпретируются как команда INT 3 останова в контрольной точке.
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
|
|
hang |
e |
|
|
|
|
|
||
|
|
|
C |
|
E |
|
|
|
|
|
|
|
C |
|
E |
|
|
|
||||||
|
|
X |
|
|
|
|
|
|
|
|
|
X |
|
|
|
|
|
|
||||||
|
- |
|
|
|
|
|
d |
|
|
|
- |
|
|
|
|
|
d |
|
||||||
|
F |
|
|
|
|
|
|
|
i |
|
|
|
F |
|
|
|
|
|
|
|
i |
|
||
|
|
|
|
|
|
|
|
t |
|
|
|
|
|
|
|
|
|
|
t |
|
||||
P |
D |
|
|
|
|
|
|
|
|
o |
|
P |
D |
|
|
|
|
|
|
|
|
o |
||
|
|
|
|
NOW! |
r |
|
|
|
|
|
NOW! |
r |
||||||||||||
|
|
|
|
|
BUY |
|
|
|
|
|
|
|
|
BUY |
|
|
||||||||
|
|
|
|
to |
|
|
648 Глава 13. Написание компонентов для задач, связанных с безопасностью |
|
|
|
|
to |
|
|
|
|
|
|
||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||
w |
|
|
|
|
|
|
|
|
|
m |
|
w |
|
|
|
|
|
|
|
|
|
m |
||
w Click |
|
|
|
|
|
|
o |
|
w Click |
|
|
|
|
|
|
o |
||||||||
|
w |
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
|
|
||
|
. |
|
|
|
|
|
|
.c |
|
|
|
. |
|
|
|
|
|
|
.c |
|
||||
|
|
p |
df |
|
|
|
|
e |
|
|
|
|
p |
df |
|
|
|
|
e |
|
||||
|
|
|
|
|
g |
|
|
|
|
|
|
|
|
|
g |
|
|
|
||||||
|
|
|
|
|
n |
|
|
|
|
|
|
|
|
|
|
n |
|
|
|
|
||||
|
|
|
|
-xcha |
|
|
|
|
|
Если COM-объект представляет собой внутрипроцессную DLL, то его-x cha |
|
|
|
|
|
можно зарегистрировать вручную с помощью утилиты RegSvr32. Если же это внепроцессный исполняемый файл, то для регистрации вручную он обычно вызывается с флагом /regserver. Как бы то ни было, действия, выполняемые в ходе регистрации, имеют огромное значение для реализации COM-объектов.
Выше уже упоминалось, что COM-объект идентифицируется глобально уникальным значением CLSID. Очевидно, что среда исполнения COM должна знать этот идентификатор, чтобы связать с ним объект. Тут-то и приходит на помощь регистрация.
Основное хранилище регистрационной информации о компонентах – это, естественно, реестр Windows. Реестр представляет собой единую базу конфигурационных данных, управляемую операционной системой. Это иерархическое хранилище, организованное в виде дерева. Внутри реестра есть несколько отдельных баз данных или «ульев» (hives). Обычно их именуют по названиям ключей верхнего уровня: HKEY_LOCAL_MACHINE, HKEY_CLASSES_ROOT и так далее. Данные хранятся в реестре в виде пар «имя / значение». Все имена – это строки, значения же могут быть строками, целыми числами типа DWORD или двоичными данными. Для просмотра и изменения реестра служит утилита RegEdit (рис. 13.1).
Рис. 13.1. Использование RegEdit для просмотра реестра Windows
Относящаяся к COM информация хранится в улье HKEY_CLASSES_ROOT. Ниже описывается та часть структуры этого улья, которая имеет отношение к регистрации.