2008年3月4日星期二

[Tips]关于CVE-2008-1054 SurgeMail 38k4 Buffer Overflow

by axis
2008-03-04
http://www.ph4nt0m.org


漏洞发生在 _lib_spawn_user_getpid 这个函数中

由于将环境变量循环拷贝导致溢出。


.text:00441BD8 loc_441BD8:                             ; CODE XREF: _lib_spawn_user_getpid+BDj
.text:00441BD8                 mov     ecx, [ebp
+var_45C]
.text:00441BDE                 add     ecx, 
1
.text:00441BE1                 mov     [ebp
+var_45C], ecx
.text:00441BE7
.text:00441BE7 loc_441BE7:                             ; CODE XREF: _lib_spawn_user_getpid
+6Ej
.text:00441BE7                 mov     edx, [ebp
+var_45C]
.text:00441BED                 mov     eax, [ebp
+arg_4]
.text:00441BF0                 cmp     dword ptr [eax
+edx*4], 0  #这里的判断
.text:00441BF4                 jz      
short loc_441C27
.text:00441BF6                 mov     ecx, [ebp
+var_45C]
.text:00441BFC                 mov     edx, [ebp
+arg_4]
.text:00441BFF                 mov     eax, [edx
+ecx*4]
.text:00441C02                 push    eax             ; 
char *
.text:00441C03                 mov     ecx, [ebp
+var_20]
.text:00441C06                 push    ecx             ; 
char *
.text:00441C07                 call    _strcpy           #拷贝溢出
.text:00441C0C                  add     esp, 
8
.text:00441C0F                 mov     edx, [ebp
+var_20]
.text:00441C12                 push    edx             ; 
char *
.text:00441C13                 call    _strlen
.text:00441C18                 add     esp, 
4
.text:00441C1B                 mov     ecx, [ebp
+var_20]
.text:00441C1E                 lea     edx, [ecx
+eax+1]
.text:00441C22                 mov     [ebp
+var_20], edx
.text:00441C25                 jmp     
short loc_441BD8
.text:00441C27 ; 
---------------------------------------------------------------------------


但是有个难点:

在覆盖到ebp或者SEH之前,就因为
cmp dword ptr [eax+edx*4], 0
jz short loc_441C27
的判断异常退出了

原因在覆盖过程中,会覆盖 ecx, edx

而eax指向当前栈中,这个加载地址是随机变化的,所以要使[eax+edx*4]不为0,同时payload里又不能出现0字节,很难控制。

所以这个漏洞个基本上只能dos,不能利用了。

也许哪位大牛有更好的办法?

没有评论: