Opera是挪威欧朋(Opera Software)公司所开发的一款Web浏览器,它支持多窗口浏览、可定制用户界面等。 Opera实现上存在有符号型变量处理漏洞,远程攻击者可能利用此漏洞导致客户机上的Opera程序崩溃。 Opera在wcsncpy调用中存在有符号型变量比较错误,攻击者可以覆盖目标缓冲区后的大量内存,导致Opera崩溃。但很难利用这个漏洞执行任意代码,因为尽管拷贝了大量的内存,但只有很少的部分是可控的。 攻击者可以通过在样式表属性中指定超长的值来触发这个漏洞。以下是有漏洞函数的反汇编。请注意如果arg_length > 0x7FFFFFFF的话,就可以绕过在0x67B8CF0D的有符号型比较。 .text:67B8CEFE ; int __stdcall POC_CALL_TO_WCSNCPY_67B8CEFE(wchar_t *,int) .text:67B8CEFE POC_CALL_TO_WCSNCPY_67B8CEFE proc near ; CODE XREF: sub_67B4DB72+9D6 p .text:67B8CEFE ; _POC_CALL_WSCNCPY_67B8AE6E+1B4 p .text:67B8CEFE .text:67B8CEFE arg_pbuf_src= dword ptr 4.text:67B8CEFE arg_length= dword ptr 8 .text:67B8CEFE .text:67B8CEFE mov eax, POC_pbuf_target .text:67B8CF03 push ebx .text:67B8CF04 push esi .text:67B8CF05 push edi .text:67B8CF06 mov edi, [esp+0Ch+arg_length] .text:67B8CF0A mov esi, [eax+40h] .text:67B8CF0D cmp edi, 4096 .text:67B8CF13 mov ebx, ecx .text:67B8CF15 jl short loc_67B8CF1C ; signedness error .text:67B8CF17 mov edi, 4095 .text:67B8CF1C .text:67B8CF1C...
Opera是挪威欧朋(Opera Software)公司所开发的一款Web浏览器,它支持多窗口浏览、可定制用户界面等。 Opera实现上存在有符号型变量处理漏洞,远程攻击者可能利用此漏洞导致客户机上的Opera程序崩溃。 Opera在wcsncpy调用中存在有符号型变量比较错误,攻击者可以覆盖目标缓冲区后的大量内存,导致Opera崩溃。但很难利用这个漏洞执行任意代码,因为尽管拷贝了大量的内存,但只有很少的部分是可控的。 攻击者可以通过在样式表属性中指定超长的值来触发这个漏洞。以下是有漏洞函数的反汇编。请注意如果arg_length > 0x7FFFFFFF的话,就可以绕过在0x67B8CF0D的有符号型比较。 .text:67B8CEFE ; int __stdcall POC_CALL_TO_WCSNCPY_67B8CEFE(wchar_t *,int) .text:67B8CEFE POC_CALL_TO_WCSNCPY_67B8CEFE proc near ; CODE XREF: sub_67B4DB72+9D6 p .text:67B8CEFE ; _POC_CALL_WSCNCPY_67B8AE6E+1B4 p .text:67B8CEFE .text:67B8CEFE arg_pbuf_src= dword ptr 4.text:67B8CEFE arg_length= dword ptr 8 .text:67B8CEFE .text:67B8CEFE mov eax, POC_pbuf_target .text:67B8CF03 push ebx .text:67B8CF04 push esi .text:67B8CF05 push edi .text:67B8CF06 mov edi, [esp+0Ch+arg_length] .text:67B8CF0A mov esi, [eax+40h] .text:67B8CF0D cmp edi, 4096 .text:67B8CF13 mov ebx, ecx .text:67B8CF15 jl short loc_67B8CF1C ; signedness error .text:67B8CF17 mov edi, 4095 .text:67B8CF1C .text:67B8CF1C loc_67B8CF1C: ; CODE XREF: POC_CALL_TO_WCSNCPY_67B8CEFE+17 j .text:67B8CF1C push edi ; size_t .text:67B8CF1D push [esp+10h+arg_pbuf_src] ; wchar_t * .text:67B8CF21 push esi ; wchar_t * .text:67B8CF22 call _wcsncpy .text:67B8CF27 and word ptr [esi+edi*2], 0 .text:67B8CF2C add esp, 0Ch .text:67B8CF2F mov ecx, ebx .text:67B8CF31 push esi ; wchar_t * .text:67B8CF32 call sub_67B8CD10 .text:67B8CF37 test ax, ax .text:67B8CF3A jge short loc_67B8CF48 .text:67B8CF3C mov ecx, [ebx+5D0h] .text:67B8CF42 call sub_67B8C7BC .text:67B8CF47 inc eax .text:67B8CF48 .text:67B8CF48 loc_67B8CF48: ; CODE XREF: POC_CALL_TO_WCSNCPY_67B8CEFE+3C j .text:67B8CF48 pop edi .text:67B8CF49 pop esi .text:67B8CF4A pop ebx .text:67B8CF4B retn 8 .text:67B8CF4B POC_CALL_TO_WCSNCPY_67B8CEFE endp 尽管传送2GB的字符串看起来是不可能的,但由于在调用函数中的另一个漏洞,只需注入32k字符串就可扩展为很大的负值。 .text:67B8AF62 loc_67B8AF62: ; CODE XREF: _POC_CALL_WSCNCPY_67B8AE6E+E2 j .text:67B8AF62 movsx eax, [ebp+var_length_ovfl] ; here the error occurs: short int length is sign extended .text:67B8AF62 ; to a long integer. the result is a large negative value if length .text:67B8AF62 ; is negative. .text:67B8AF66 jmp short loc_67B8AF5D