Аудит и дизассемблирование exploit'ов

код, вычисляющий базовый адрес KERNEL32.DLL через PEB


С первой командой, обнуляющей EBX через XOR, все понятно. Но вот вторая… что-то считывает из ячейки, лежащей по адресу FS:[EBX+30]. Селектор FS указывает на область памяти, где операционная система хранит служебные (и практически никак недокументированные) данные потока. К счастью в нашем распоряжении есть Интернет. Набираем в Гугле "fs:[30h]" (с кавычками!) и получаем кучу ссылок от рекламы картриджей TK-30H до вполне вменяемых материалов, из которых мы узнаем, что в ячейке FS:[30h] хранится указатель на Process Enviroment Block – Блок Окружения Процесса или, сокращенно, PEB.

Описание самого PEB'а (как и многих других внутренних структур операционной системы) можно почерпнуть из замечательной книги "The Undocumented Functions Microsoft Windows NT/2000", электронная версия которой доступа по адресу http://undocumented.ntinternals.net/.

Из нее мы узнаем, что по смещению 0Ch от начала PEB лежит указатель на структуру PEB_LDR_DATA, по смещению 1Ch от начала которой лежит список. _не_ указатель на список, а сам список, состоящий из двух двойных слов: указателя на следующий LIST_ENTRY и указателя на экземпляр структуры LDR_MODULE, перечисленные в порядке инициализации модулей, а первым, как известно, инициализируется KERNEL32.DLL.

/* 00 */ ULONG                    Length;

/* 04 */ BOOLEAN           Initialized;

/* 08 */ PVOID                    SsHandle;

/* 0C */ LIST_ENTRY        InLoadOrderModuleList;

/* 14 */ LIST_ENTRY        InMemoryOrderModuleList;

/* 1C */ LIST_ENTRY        InInitializationOrderModuleList;



Содержание раздела