-
-
CVE-2014-2206:远程代码执行漏洞大剖析
-
发表于: 2014-3-7 11:09 755
-
本文中转载自:黑客与极客
前些时候我发布了一篇关于远程代码执行漏洞的安全公告,被CVSS评了10分。该漏洞影响所有版本的GetGo DownloadManager,因此如果有读者在使用这款软件话,请务必用一款更安全的软件代替,因为GetGo项目已经不再被支持了,但是其再在cnet.com网站仍然评级依然很高。
本文简单介绍一下该bug的起因,并在打了全部补丁以及启用了DEP保护的Windows 7 64位系统上进行测试:
当向一个网站请求下载时,下载器会读取目标页面返回的HTTP响应头的值,并将该返回值保存到一块固定大小为4097字节的临时缓存中,但该尺寸并没有被用来限制拷贝到这块缓存中的输入的大小,只是将输入内容一个字节一个字节地拷贝到临时缓存中,直到遇到“\r\n”为止。因此如果HTTP响应头的大小超过了4097字节,就会被写到这块内存的界限之外了。
下面我们看一下这款下载器如何处理HTTP下载。
当用户像上图一样请求下载时,调试器跳转到断点0x004A4CF4处,正是包含漏洞的代码部分的入口点:
该函数包含三个参数,将其转换为相应的c语言风格的函数调用,如下所示:
int vuln_func(void *buffer, size_t arg2, int arg3)
栈内包含三个参数,参数1位于缓存的0x0430C390处,参数2位于0×00001001处,参数3位于0×00000078处,如图2所示:
小提示:本示例中你可以完全忽略参数3,因为该值只是用来表示ws2_32版本的select函数从socket中读取内容时的timeout时间:
这里发生了什么?
在vuln_func()中,第一组重要的指令集为:
memset函数的功能很简单,用最多arg3个字节的unsigned char类型的数值(arg2)填充arg1指向的内存中,也就是说,地址0x430C390 指向的缓存空间被4097个0×00填充。
接下来对包含漏洞的代码部分进行分析:
前些时候我发布了一篇关于远程代码执行漏洞的安全公告,被CVSS评了10分。该漏洞影响所有版本的GetGo DownloadManager,因此如果有读者在使用这款软件话,请务必用一款更安全的软件代替,因为GetGo项目已经不再被支持了,但是其再在cnet.com网站仍然评级依然很高。
本文简单介绍一下该bug的起因,并在打了全部补丁以及启用了DEP保护的Windows 7 64位系统上进行测试:
当向一个网站请求下载时,下载器会读取目标页面返回的HTTP响应头的值,并将该返回值保存到一块固定大小为4097字节的临时缓存中,但该尺寸并没有被用来限制拷贝到这块缓存中的输入的大小,只是将输入内容一个字节一个字节地拷贝到临时缓存中,直到遇到“\r\n”为止。因此如果HTTP响应头的大小超过了4097字节,就会被写到这块内存的界限之外了。
下面我们看一下这款下载器如何处理HTTP下载。
当用户像上图一样请求下载时,调试器跳转到断点0x004A4CF4处,正是包含漏洞的代码部分的入口点:
该函数包含三个参数,将其转换为相应的c语言风格的函数调用,如下所示:
int vuln_func(void *buffer, size_t arg2, int arg3)
栈内包含三个参数,参数1位于缓存的0x0430C390处,参数2位于0×00001001处,参数3位于0×00000078处,如图2所示:
小提示:本示例中你可以完全忽略参数3,因为该值只是用来表示ws2_32版本的select函数从socket中读取内容时的timeout时间:
这里发生了什么?
在vuln_func()中,第一组重要的指令集为:
memset函数的功能很简单,用最多arg3个字节的unsigned char类型的数值(arg2)填充arg1指向的内存中,也就是说,地址0x430C390 指向的缓存空间被4097个0×00填充。
接下来对包含漏洞的代码部分进行分析:
赞赏
谁下载
谁下载
谁下载
看原图
赞赏
雪币:
留言: