Первичный фрейм всех последующих потоков
Первичный фрейм всех последующих потоков располагается на dwStackSize байт выше предыдущего фрейма, где dwStackSize – размер памяти, выделенной потоку (по умолчанию: 4 Мбайт на первый поток и по 1 Мбайту на все последующие). Доработаем нашу тестовую программу, включив в нее следующую строку:
CreateThread(0, 0, (void*) main, 0,0, &xESP); gets(&xESP);
Листинг 4 исследования раскладки SEH-фреймов во многопоточной среде
Результат ее прогона будет выглядеть приблизительно так:
ESP : 0012FF48h ; текущая вершина стека 1го потока
EXCEPTION_REGISTRATION.prev : 0012FF70h ; "пользовательский" SEH-фрейм 1го потока
EXCEPTION_REGISTRATION.handler : 00401244h
EXCEPTION_REGISTRATION.prev : 0012FFB0h ; SEH-фрейм
стартового кода
всех потоков
EXCEPTION_REGISTRATION.handler : 00401244h
EXCEPTION_REGISTRATION.prev : 0012FFE0h ; первичный SEH-фрейм 1го потока
EXCEPTION_REGISTRATION.handler : 77EA1856h
ESP : 0051FF7Ch ; текущая вершина стека 2го потока
EXCEPTION_REGISTRATION.prev : 0051FFA4h ; "пользовательский" SEH-фрейм 2го потока
EXCEPTION_REGISTRATION.handler : 00401244h
EXCEPTION_REGISTRATION.prev : 0051FFDCh ; первичный SEH-фрейм 2го потока
EXCEPTION_REGISTRATION.handler : 77EA1856h
ESP : 0061FF7Ch ; текущая вершина стека 3го потока
EXCEPTION_REGISTRATION.prev : 0061FFA4h ; "пользовательский" SEH-фрейм 3го потока
EXCEPTION_REGISTRATION.handler : 00401244h
EXCEPTION_REGISTRATION.prev : 0061FFDCh ; первичный SEH-фрейм 3го потока
EXCEPTION_REGISTRATION.handler : 77EA1856h
ESP : 0071FF7Ch ; текущая вершина стека 4го потока
EXCEPTION_REGISTRATION.prev : 0071FFA4h ; "пользовательский" SEH-фрейм 4го потока
EXCEPTION_REGISTRATION.handler : 00401244h
EXCEPTION_REGISTRATION.prev : 0071FFDCh ; первичный SEH-фрейм 4го потока
EXCEPTION_REGISTRATION.handler : 77EA1856h
Листинг 5 раскладка SEH-фреймов в памяти
Заметно, что первичный SEH-фрейм всех потоков находится на идентичном расстоянии от текущей вершины стека, что существенно облегчает задачу его подмены. Первичные фреймы первого и второго потоков разнесены на 4 Мбайта (51FFDCh – 12FFE0h == 0x3EFFFC ~4 Мбайт), а остальные – на 1 Мбайт (61FFDCh – 51FFDCh == 71FFDCh – 61FFDCh == 10.00.00 == 1 Мбайт), ну в общем разобраться можно.
Поскольку, большинство серверных приложений конструируются по многопоточной схеме, уметь ориентироваться в потоках жизненно необходимо, иначе вместо перехвата управления, атакующий получит полный DoS. Кстати, об управлении…
Содержание Назад Вперед
Forekc.ru
Рефераты, дипломы, курсовые, выпускные и квалификационные работы, диссертации, учебники, учебные пособия, лекции, методические пособия и рекомендации, программы и курсы обучения, публикации из профильных изданий