SEH на службе контрреволюции


         

Первичный фрейм всех последующих потоков


Первичный фрейм всех последующих потоков располагается на 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
Рефераты, дипломы, курсовые, выпускные и квалификационные работы, диссертации, учебники, учебные пособия, лекции, методические пособия и рекомендации, программы и курсы обучения, публикации из профильных изданий