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

Куча с горкой

Хаштамов Адиль (adi1@ok.kz)

Хакер, номер #081, стр. 081-074-3


Посмотри на скриншот под номером три. Там отчетливо видно, что происходит при переполнении кучи. Heap Overflow произошел при освобождении блоков памяти, и теперь управляем двумя регистрами - EAX и ECX. Обрати внимание на этот участок кода в отладчике:

MOV DWORD PTR DS:[ECX],EAX

MOV DWORD PTR DS:[EAX+4],ECX

Эти строки и означают то, что у нас в распоряжении вышеприведенные регистры. Если ты понял всю технику работы кучи, то уже можешь догадаться, что в регистр EAX при нормальной работе будет занесен адрес следующего свободного блока, а в регистр ECX - адрес предыдущего. При переполнении мы затерли значения этих регистров и поэтому происходит ошибка. Эксплуатирование может идти по сценарию

подмены Flink и Blink. В данной статье я хочу рассказать об одной из самых легких техник - о перезаписывании фильтра необработанных исключений (Unhandled Exception Filter). Функция, которая устанавливает этот фильтр, находится в системной библиотеке kernel32.dll - SetUnhandledExceptionFilter. Код ее выглядит примерно так:

mov ecx, dword ptr [esp+04]

mov eax, dword ptr [77ED73B4]

mov dword ptr [77ED73B4], ecx

ret 0004

Для выполнения кода нам достаточно установить в регистр ECX адрес фильтра (77ED73B4), а в регистр EAX - адрес, который передаст управление шеллкоду.

Тем самым после этого будет выполнен следующий код:

ntdll.NtQueryInformationProcess:

mov eax, dword ptr [77ED73B4]

сmp eax, esi

je 77E93132

push edi

call eax

Здесь видно, что управление будет передано этому фильтру. И при подмене фильтра мы сможем передать управление нашему шелл-коду. У внимательного читателя, наверное, уже назрел вопрос о том, каким образом можно узнать адрес шелл-кода. Тут все просто. Дело в том, что регистр EDI+0x74 указывает на стек перед кучей. Таким образом, при перезаписи фильтра этим адресом мы передаем управление на заранее подготовленный шелл-код.

Давай все это рассмотрим на практике. В качестве подопытного кролика я написал маленькое серверное приложение, которое принимает запросы от клиента. При посылке запроса, который превышает размер отведенного буфера, сервер отрубается с ошибкой переполнения. Задача клиента-эксплойта заключается в том, чтобы послать специальным образом сформированный запрос, который переполнит кучу, вызовет необработанное исключение, подменит его и передаст управление шелл-коду, который, в свою очередь, откроет шелл на 28876 порту. Вот и все. Чтобы лучше понимать, о чем я говорю, настоятельно советую тебе взять с нашего диска исходник сервера и параллельно со мной проделывать все операции над выполняемым бинарником в отладчике. Загрузи в OllyDbg Server.exe с диска и передай программе на вход достаточно длинную строку. В отладчике ты увидишь картинку, очень похожую на рисунок 4.

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