改掉了一个bug,可以发IPv6数据包了

项目实验系统终于完成了,虽然感觉不太完美,但基本功能都能够体现出来。它能够检测出IPv6数据包中携带的有恶意的数据,并给出相应的报警。在寻找测试数据可是花了不少功夫,试用了好几款攻击模拟工具,都不尽人意。

Scan6针对IPv6进行端口扫描,但是功能比较单一。IDSwakeup可以发送teardrop, deepthoad等多种攻击数据,但没有IPv6版本的,只好另寻出路了。Snot可根据snort的规则发送某些特征的数据包,但也是没有IPv6的,没办法,改吧!

用了好个几个版本的libnet都没把下载来的snot直接编译通过,google了一下找到libnet-1.1.2.1版支持IPv6,我的测试数据就全赖你了。仔细地研读了帮助文档,libnet_init(), libnet_build_tcp, libnet_build_udp(), libnet_build_ipv6()….很符合我的需求。很快完成了根据snort的规则内容产生IPv6数据包的小工具。但一个意想不到错误发生,程序会时不时地发生段错误,有时一个数据包都没发出去,有时发几个才出错,有时发了十几出错。以往的经验告诉我这是内存某个地方出了非法访问。调出GDB调试,居然崩溃的地方在libnet库的libnet_in_checksum()里,晕!仔细检查了一遍,传递的参数也没错啊,如果是库出现了问题,那会修正起来会比较棘手啊。为了探查究竟,翻开库的源代码来看瞧瞧吧。幸好是开源的,冲着这点我就可以很喜欢开源。原来在libnet_write()里它组装所有协议区块,并会做一下检查是否要计算检验和,如果用户以参数0调用libnet_build_XXX()时它自动计算检验和,否则就用用户传进来的值填充检验和域。先前每次崩溃就是这个函数惹的祸。IPv6包头本身是没有校验和域的,但它上层协议的检验和的计算要包括一个IPv6的伪头部,而libnet里没有这样处理。原因知道了,那就好办,每次发包我都手动计算好检验和值再调用库函数。编译后,运行一切正常,不会出现段错误了。[@more@]

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/7406370/viewspace-975642/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/7406370/viewspace-975642/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值