cve-2010-0304Wireshark溢出漏洞分析和利用代.PDF

cve-2010-0304Wireshark溢出漏洞分析和利用代.PDF

  1. 1、本文档共5页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
cve-2010-0304 Wireshark 溢出漏洞分析及利用代码的分析 Wireshark 是一款非常流行的网络封包分析软件. 其方便性,开源性和跨平台性和可扩 展性,导至其有很广大的使用人群,尤其做网络相关开发工作的程序员. 现在我们要分析的 Cve-2010-0304 这个漏洞是在对lwres 协议解码中,由于字符串读取处理不当造成的. 我们 可以从官方下到其源码,来分析下漏洞产生的原因,并对网络上流行的利用程序,进行简单的 分析.(在1.2.6 的版本中,修补了这个漏洞,我下的是1.2.5). 下面分析下漏洞产生的原因. 出现问题的函数为:dissect_getaddrsbyname_request (这个函数在epan\dissectors\packet-lwres.c 这个文件中定义). static void dissect_getaddrsbyname_request(tvbuff_t* tvb, proto_tree* lwres_tree) { guint32 flags,addrtype; guint16 namelen; guint8 name[120]; proto_item* adn_request_item; proto_tree* adn_request_tree; flags = tvb_get_ntohl(tvb, LWRES_LWPACKET_LENGTH); addrtype = tvb_get_ntohl(tvb, LWRES_LWPACKET_LENGTH + 4); namelen = tvb_get_ntohs(tvb, LWRES_LWPACKET_LENGTH + 8); tvb_get_nstringz(tvb, LWRES_LWPACKET_LENGTH+10, namelen, name); //这里产生 溢出 name[namelen]=\0; } 这个地方为什么会出现问题呢,首先讲一下tvb_get_nstringz 这个函数的作用,这个函数有 四个参数,第一个是一个tvb 结构,里面放着相关的一些结构及原始的数据,第二个是一个偏 移,用于描述tvb 中数据区域的偏移,第三个namelen,用于描述拷贝的长度,而我们也可以看 出,这个值是从LWRES_LWPACKET_LENGTH + 8 的偏移处读取的,第四个参数name 即我们定义 的数组,用来保存我们读取的对象. 很明显,我们可以看到问题是怎么产生的了, 由于namelen 也是从数据中读取,所以这 个值是可控的,假如我们把它设为大于120 的一个数, 那在往name[120]中拷贝的过程中,便 会产生溢出了. 漏洞的产生的原因很简单,就是普通的溢出漏洞.下面我们分析一下攻击代码,可以学习 一下利用程序是如何写的.(当然,在这里,高手可以跳过去了.因为都是一些基础的东西.) 网上公布了利用的python 利用代码/exploit/19119/,我们也可以自己利 用metasploit 生成攻击包. (/redmine/projects/framework/repository/revisions/8367/ent ry/modules/exploits/multi/misc/wireshark_lwres_getaddrbyname.rb) 下面我们先科普一下Wireshark 接口的编写的相关基础知识. 在packet-lwres.c 中,还有如下函数, proto_register_lwres(void)//用于注册这个协议,其中定义了相关协议的数据结构. proto_reg_handoff_lwres(void)//绑定处理函数的句柄 dissect_lwres(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)//具体解码的 函数 具体函数的细节,大家下到源码后自己慢慢分析吧,下面只讲其中的几个重要的数据. 在开始的定义中,有如下代码, #define LWRES_UDP_PORT 921 static guint global_lwres_port = LWRES_UDP_PORT; 从中我们可以看出,其走的是UDP 协议,端口号为921, 并在proto_register_lwres 函数中,用如下代码将其绑定 prefs_register_uint_preference(lwres_module,

文档评论(0)

***** + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档