Издательский дом ООО "Гейм Лэнд"ЖУРНАЛ ХАКЕР #95, НОЯБРЬ 2006 г.

Обзор эксплойтов

Крис Касперски

Хакер, номер #095, стр. 095-060-3


Rands

Классический сценарий атаки на переполняющиеся буферы предполагает подмену адреса возврата из функции на адрес машинной команды jmp esp (опкод FFh E4h), находящейся где-то в оперативной памяти, и подобных команд там предостаточно. Такие двухбайтовые последовательности в изобилии встречаются как в системных библиотеках, так и в самом атакуемом приложении. jmp esp передает управление на вершину стека, в которой расположен переполненный буфер, содержащий shell-код, и все идет по плану, по такому хорошему конопляному плану, выращенному под жарким южным солнцем. Но при включенном DEP такой план ни хвоста не торкает, поскольку выполнение команд в стеке категорически запрещено и приходится совершать ряд дополнительных действий по устранению этих досадных неприятностей. Самое простое, что можно сделалась, – это занести в стек адрес API-функции VirtualProtect, которая позволяет манипулировать атрибутами доступа к памяти, а вслед за ней (ним) — адрес API-функции MoveMemory, которая копирует shell-код из стека в область памяти, обработанную функцией VirtualProtect, присвоившей ей атрибут «исполняемый». Остается только передать сюда управление, для чего в стек кладется адрес новой дислокации shell-кода, и наступает полный приход.

Как видно, независимо от активности DEP мы должны знать содержимое адресного пространства жертвы атаки, чтобы найти в памяти инструкцию jmp esp или адреса API-функций. На XP и Server 2003 это не представляет никаких проблем, поскольку и сам исполняемый файл, и системные библиотеки всегда грузятся по одним и тем же адресам. Конечно, эти адреса постоянны только в рамках данной версии Windows и меняются с каждым Service Pack'ом, что вынуждает атакующего либо определять версию косвенным путем, либо просто действовать наугад. Если ему повезет, он будет кайфовать, в противном случае у жертвы случится крэш и она словит сообщение о критической ошибке, а вместе с ним – бэд трип. Постоянным и не зависящим от версии остается только базовый адрес загрузки самого уязвимого приложения, однако это не слишком большая зацепка, поскольку при смене версии меняется и его содержимое. То есть написать универсальную атакующую программу, поражающую все системы не так-то просто, а в общем случае — вообще невозможно, но это обстоятельство не ломает кайф и не высаживает на измену. Количество версий Windows (вместе с версиями уязвимого приложения) хоть и велико, но все-таки конечно. Если настойчиво долбить жертву, то рано или поздно она скажет: «Пых!», shell-код получит управление, и все будут очень довольны, ну или почти все.

Назад на стр. 095-060-2  Содержание  Вперед на стр. 095-060-4