分享
 
 
 

对WindowsXPSP2溢出漏洞进行保护(下)

王朝system·作者佚名  2008-05-19
窄屏简体版  字體: |||超大  

ZwQueryInformationProcess最后会调用一个系统调用,转到内核运行,最后会调用内核中的函数NtQueryInformationProcess,并且调用该函数的子功能代码为0x24。该子功能直接取出保存在进程中的一个随机数,并将其拷贝到用户堆栈中的一个临时变量中。如果该随机数为0,则还要根据系统时间重新生成该随机数,一般在进程刚开始创建的时候,这个随机数为0,从而会重新生成该随机数。由于该随机数跟进程创建的时间有关,所以这个随机数是无法猜测的。该函数在ntoskrnl.exe中导出,跟这个功能相关的函数代码为:

PAGE:004970CC loc_4970CC:

;下面的代码得到一个进程唯一的随机数,子功能代码为0x24

PAGE:004970CC cmp edi, edx ; case 0x24

PAGE:004970CE jnz loc_497349

PAGE:004970D4 cmp dword ptr [ebp+8], 0FFFFFFFFh

PAGE:004970D8 jnz loc_4977B8

;下面的代码得到保存随机数的地址

PAGE:004970DE mov eax, large fs:124h

PAGE:004970E4 mov eax, [eax+44h]

PAGE:004970E7 mov [ebp-34h], eax

PAGE:004970EA

PAGE:004970EA loc_4970EA:

PAGE:004970EA mov edi, [ebp-34h]

PAGE:004970ED add edi, 258h

;edi地址中保存的是一个跟进程相关的随机数,这里取出这个随机数

PAGE:004970F3 mov eax, [edi]

PAGE:004970F5 test eax, eax

PAGE:004970F7 jz loc_4B2379

{

;如果得到的随机数为0,则重新得到随机数,得到随机数的过程如下:

;1、先得到系统的时间,

;2、而后将这个时间和系统内核中的一个值进行不断的异或操作,

;就产生了一个随机数

PAGE:004B2379

PAGE:004B2379 loc_4B2379:

;得到系统时间

PAGE:004B2379 lea eax, [ebp-3Ch]

PAGE:004B237C push eax

PAGE:004B237D call KeQuerySystemTime

PAGE:004B2382 db 3Eh

;得到系统内核中的一个全局变量,该全局变量估计也是一个随机数

PAGE:004B2382 mov eax, ds:0FFDFF020h

PAGE:004B2388 mov ecx, [eax+518h]

PAGE:004B238E xor ecx, [eax+4B8h]

;将得到的随机数和得到系统时间进行异或

PAGE:004B2394 xor ecx, [ebp-38h]

PAGE:004B2397 xor ecx, [ebp-3Ch]

;将计算得到的随机数保存在上面的跟进程相关的全局变量中,edi中保存的就是

;这个地址。

PAGE:004B239A mov [ebp-0CCh], ecx

PAGE:004B23A0 mov [ebp-0D4h], edi

PAGE:004B23A6 mov eax, 0

PAGE:004B23AB mov ecx, [ebp-0D4h]

PAGE:004B23B1 mov edx, [ebp-0CCh]

PAGE:004B23B7 cmpxchg [ecx], edx

PAGE:004B23BA push 4

PAGE:004B23BC pop edx

;重新转到loc_4970EA,再一次得到刚才生成的随机数,如果该生成的随机数为

;0,则还会重新生成。

PAGE:004B23BD jmp loc_4970EA

}

;得到随机数之后,将其拷贝到用户栈中的一个临时变量中,esi保存的就是这个临时

;变量的地址。至此,就得到了一个跟进程相关的随机数,该随机数跟进程的创建时间

;相关。

PAGE:004970FD mov dword ptr [ebp-4], 15h

PAGE:00497104 mov [esi], eax

PAGE:00497106 test ebx, ebx

PAGE:00497108 jnz loc_497AA5

PAGE:0049710E jmp loc_4955F5

到这里我们已经完全清楚了整个随机数的获取过程。该随机数跟进程的创建时间相关,可见我们是无法猜得该随机数的。不过这个随机数只是再进程创建的时候产生,并且直到进程结束,该随机数都不会改变。所以,如果我们可以得到该随机数,在进程结束之前还是可以利用的。比如我们可以将其和我们的跳转地址进行异或,通过溢出将其写入到最高溢出处理地址,就可以像以前一样利用了。

不过这种方法对于远程溢出是无法利用的。但是如果能够覆盖程序的导入表或者静态数据段,那就是最理想的情况了。不过系统DLL的导入表不能够修改,但是一般程序的导入表还都是可以改的,所以还是有利用的可能性的。如果在静态数据段中存在某些函数的指针,则可以进行覆盖,从而加以利用,如果存在这种情况的话,要做到利用的通用还是有可能的。

3、VEH链表指针_RtlpCalloutEntryList的保护

我们知道堆溢出经常用的一个技巧就是修改VEH的链表指针。这在XP sp0和sp1的环境下都好使。但是sp2同样堵住了这条路。

XP_sp2下

异常处理过程

KiUserExceptionDispatcher

|

________RtlDispatchException

|

___________RtlCallVectoredExceptionHandlers

sp2中,该指针位于

.data:7C99C320 _RtlpCalloutEntryList dd 0 ; DATA XREF: LdrpInitializeProcess(x,x,x,x,x)+2EFo

.data:7C99C320 ; LdrpInitializeProcess(x,x,x,x,x)+2F9w ...

我们就直接看看RtlCallVectoredExceptionHandlers函数

.text:7C95779C ; __stdcall RtlCallVectoredExceptionHandlers(x,x)

.text:7C95779C _RtlCallVectoredExceptionHandlers@8 proc near

.text:7C95779C ; CODE XREF: RtlDispatchException(x,x)+14p

.text:7C95779C mov edi, edi

.text:7C95779E push ebp

.text:7C95779F mov ebp, esp

.text:7C9577A1 push ecx

.text:7C9577A2 push ecx

.text:7C9577A3 push edi

这里就比较VEH的链表是不是空的,也就是看自己是否指向自己。如果是空的就不用说了,非空就转向该指针的调用

.text:7C9577A4 mov edi, offset _RtlpCalloutEntryList

.text:7C9577A9 cmp _RtlpCalloutEntryList, edi

.text:7C9577AF jnz loc_7C962DA0

.text:7C962DA0 loc_7C962DA0: ; CODE XREF: RtlCallVectoredExceptionHandlers(x,x)+13j

.text:7C962DA0 mov eax, [ebp+arg_4]

.text:7C962DA3 push ebx

.text:7C962DA4 push esi

.text:7C962DA5 mov [ebp+var_8], eax

.text:7C962DA8 mov eax, [ebp+arg_8]

.text:7C962DAB mov ebx, offset _RtlpCalloutEntryLock

.text:7C962DB0 push ebx

.text:7C962DB1 mov [ebp+var_4], eax

.text:7C962DB4 call _RtlEnterCriticalSection@4 ; RtlEnterCriticalSection(x)

.text:7C962DB9 mov esi, _RtlpCalloutEntryList

.text:7C962DBF jmp short loc_7C962DD6

.text:7C962DC1 loc_7C962DC1: ; CODE XREF: RtlInitializeResource(x)+21C3Dj

.text:7C962DC1 push dword ptr [esi+8]

代码就不解释那么多了,可以看到指针在使用前必须先解码,这个函数前面已经讲解过了。

.text:7C962DC4 call _RtlDecodePointer@4 ; RtlDecodePointer(x)

.text:7C962DC9 lea ecx, [ebp+var_8]

.text:7C962DCC push ecx

.text:7C962DCD call eax

.text:7C962DCF cmp eax, 0FFFFFFFFh

.text:7C962DD2 jz short loc_7C962DEE

.text:7C962DD4 mov esi, [esi]

所以可以看到在sp2下无法利用这个覆盖VEH链表指针的技巧了。

给出XP sp1下通用的指针

XP sp1下

.text:77F60C26 ; __stdcall RtlCallVectoredExceptionHandlers(x,x)

.text:77F60C26 _RtlCallVectoredExceptionHandlers@8 proc near

.text:77F60C26 ; CODE XREF: RtlDispatchException(x,x)+Ep

.text:77F60C26 push ebp

.text:77F60C27 mov ebp, esp

.text:77F60C29 push ecx

.text:77F60C2A push ecx

.text:77F60C2B push edi

.text:77F60C2C mov edi, offset _RtlpCalloutEntryList

.text:77F60C31 cmp _RtlpCalloutEntryList, edi

;这里我们可以看到将77FC3210的值放入edi,然后和该地址的内容相比较,如果没有安装VEH,那么该地址

;的内容也是77FC3210,就不会跳转到77F7F485。如果用户安装了VEH,那么就会跳到77F7F485

.text:77F60C37 jnz loc_77F7F485

.text:77F60C3D xor al, al

.text:77F60C3F

.text:77F60C3F loc_77F60C3F: ; CODE XREF: RtlInitializeResource(x)+1B6CDj

.text:77F60C3F pop edi

.text:77F60C40 leave

.text:77F60C41 retn 8

.text:77F7F485 loc_77F7F485: ; CODE XREF: RtlCallVectoredExceptionHandlers(x,x)+11j

.text:77F7F485 mov eax, [ebp+8]

.text:77F7F488 push ebx

.text:77F7F489 push esi

.text:77F7F48A mov [ebp-8], eax

.text:77F7F48D mov eax, [ebp+0Ch]

.text:77F7F490 mov ebx, offset _RtlpCalloutEntryLock

.text:77F7F495 push ebx

.text:77F7F496 mov [ebp-4], eax

.text:77F7F499 call _RtlEnterCriticalSection@4 ; RtlEnterCriticalSection(x)

关键的下面这个部分,从77FC3210里面取出安装的处理函数地址

.text:77F7F49E mov esi, _RtlpCalloutEntryList

.text:77F7F4A4 jmp short loc_77F7F4B4

.text:77F7F4A6 loc_77F7F4A6: ; CODE XREF: RtlInitializeResource(x)+1B6BCj

.text:77F7F4A6 lea eax, [ebp-8]

.text:77F7F4A9 push eax

.text:77F7F4AA call dword ptr [esi+8]

;这里esi指向struct _VECTORED_EX

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有