项目实验系统终于完成了,虽然感觉不太完美,但基本功能都能够体现出来。它能够检测出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/