Куча с горкой Хаштамов Адиль (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. |