Злобные Shatter-атаки
DigitalScream
Xakep, номер #060, стр. 060-068-4
SendMessage(hControl, EM_SETWORDBREAKPROC, 0, intAddr);
Подготовительный процесс закончен, теперь осталось только исполнить полученный код. Но тут возникает вопрос, как, собственно, это сделать. Все очень просто - поскольку этот участок эксплоита обработчик ставит в поле ввода, то необходимо лишь дать ему команду для исполнения. Вручную это можно сделать двойным нажатием левой кнопки мышки на поле ввода или программно при помощи сообщения:
SendMessage (hControl, EM_LBUTTONDBLCLK, MK_LBUTTON, 0x00A00B);
Примеров подобной атаки можно привести сколько угодно. Так хакер для исполнения внедренного кода может использовать сообщение LVM_SORTITEMS. Его параметры совпадают с прошлым примером, поэтому, я думаю, не стоит акцентировать на нем внимание. Добавлю только, что это сообщение предназначено для списков (List Box). Такой список, например, присутствует в диспетчере задач (список процессов).
Модификация SEH
Поскольку уязвимость вызвала большой интерес со стороны общественности, то появились и новые модификации атаки, отличающиеся от классических. Именно такой модификацией стала атака по подмену адреса SEH. SEH (Structured Exception Handling) – это расширенная технология от Microsoft для Win32 программ, позволяющая последним получать контроль над ситуацией даже в том случае, если произошла непредвиденная ошибка, которая должна прекратить ход работы программы.
В принципе, подменяя адрес SEH, атакующий, как и раньше, пытается получить управление, но в этом случае техника подмены адреса уже немного отличается от предыдущего примера. В прошлых атаках хакер явно указывал адрес shellcode, который должен был исполниться. Теперь же ему придется записать его в то место памяти, где хранится сам адрес SEH. А для этого необходимо знать способ записи данных в любое место памяти чужого приложения.
Кто программировал, тот знает, что есть сообщения, которым передают различные адреса для определенных целей. И тут два варианта развития событий: приложение должно либо прочитать какие-то данные с этого адреса, либо, наоборот, записать их туда.
Мы с тобой рассмотрим второй вариант для подмены SEH. Например, есть возможность с помощью сообщений настраивать один из параметров окна, а используя другое сообщение, можно узнать его новое значение. Т.к. необходимо получить именно результат, то системе удобнее всего будет записать его по какому-нибудь адресу, а уже потом вытаскивать его оттуда для чтения (тем более что адрес указывается вручную). Таким образом, если изменить значение какого-нибудь параметра на число 2, а потом попросить окно записать это значение по адресу, например, 0x11111111, то там уже расположится наша двойка.
Сообщения LVM_SETCOLUMNWIDTH и HDM_GETITEMRECT предназначены для работы со списками. LVM_SETCOLUMNWIDTH – изменяет ширину столбца, а HDM_GETITEMRECT возвращает форму окна в следующем формате:
Определяем структуру
Typedef struct _RECT
{
LONG left;
LONG top;
LONG right;
LONG bottom;
} RECT, *PRECT;
Получается, что при изменении ширины столбца, изменяется и местоположение точек (они содержатся в переменных left или right). А это значит, что если передавать сообщению HDM_GETITEMRECT адрес 0x11111111 и менять ширину столбца, то значение по этому адресу (переменная left) также будет меняться.