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

Подключим - поиграем!

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

Хакер, номер #082, стр. 082-064-2


Затем указывается Device ID - в данном случае нам требуется Plug and Play Software Device Enumerator, поэтому указывается ROOT\SYSTEM\0000. Хочу предупредить что данный сервис использует обработку исключительных ситуаций (SEH), поэтому для удачного эксплуатирования нужно будет обойти эту защиту. О том, как это реализовать, тебе лучше почитать в Спеце по переполнениям. А мы пока попробуем свои силы на практике и присмотримся к первому выпущенному эксплойту, который появился через два дня после публикации информации о баге. Автор этого эксплоита, перец с ником sl0ppy, реализовал в своем творении все, о чем я говорил выше, и получил вполне боеспособную отмычку. Его творение ты можешь наблюдать на нашем DVD-диске. В тексте эксплойта очень легко разобраться, в чем ты скоро убедишься.

[эксплойт в разрезе]

Сейчас я рассмотрю на пальцах, как работает сплоит от sl0ppy. В начале программы расположена структура RPC, описание которой ты можешь найти в статье о сервисах, которая лежит на нашем диске. Поэтому я не буду заострять внимание на такой ерунде, лучше перейду сразу к основным функциям, а именно к BindRpcInterface. В данной функции происходит бинд RPC интерфейса; я приведу ее код и расскажу, как она работает.

[код функции BindRpcInterface]

int BindRpcInterface(HANDLE PH, char *Interface, char *InterfaceVer)

{

memcpy(&RPCBind,&PRPC,sizeof(RPCBind));

UuidFromString(Interface,&RPCBind.InterfaceUUID);

UuidToString(&RPCBind.InterfaceUUID,&Interface);

RPCBind.InterfaceVerMaj=atoi(&InterfaceVer[0]);

RPCBind.InterfaceVerMin=atoi(&InterfaceVer[2]);

TransactNamedPipe(PH, &RPCBind, sizeof(RPCBind), rbuf,

sizeof(rbuf), &dw, NULL);

return 0;

}

Функция UuidFromString преобразует строку в Uuid формат, который используется для взаимосвязи посредством сервисных интерфейсов, а UuidToString, как несложно догадаться, выполняет обратную операцию. После того, как заполняются поля InterfaceVerMaj и InterfaceVerMin структуры RPCBIND, происходит вызов функции TransactNamedPipe(PH, &RPCBind, sizeof(RPCBind), rbuf, sizeof(rbuf), &dw, NULL), которая записывает и читает данные из именованного канала. Несложно видеть, что у этой функции имеется 7 параметров:

Назад на стр. 082-064-1  Содержание  Вперед на стр. 082-064-3