改掉了一個bug,可以發IPv6資料包了

longtrue發表於2007-10-10

專案實驗系統終於完成了,雖然感覺不太完美,但基本功能都能夠體現出來。它能夠檢測出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/,如需轉載,請註明出處,否則將追究法律責任。

相關文章