太慘了!藍(lán)屏了,我的文章沒了
在某一個平行宇宙中,各位讀者大大現(xiàn)在看到的應(yīng)該是一篇關(guān)于網(wǎng)絡(luò)協(xié)議的文章。
這個平行宇宙與當(dāng)前宇宙的分叉點來源于2個小時前,我點了一下Wireshark抓包,一剎那,藍(lán)屏了,那篇文章中近一段時間寫的內(nèi)容沒了。
我差點拍案而起,WTF!保存啊保存,一個不留神就忘記了。
事情是這樣的:
我想抓一些DHCP協(xié)議的數(shù)據(jù)包,于是將網(wǎng)卡禁用,然后開啟Wireshark,打算把一會兒啟用網(wǎng)卡后的通信過程抓下來。然而等我雙擊網(wǎng)卡開始抓包的一瞬間,藍(lán)了!
捶足頓胸之際,不小心瞅見了藍(lán)屏界面上藍(lán)屏的驅(qū)動程序名字:npcap.sys,看來是Wireshark用的抓包驅(qū)動有問題呀!
這家伙害我害得這么慘,我不打算放過它,決定找出來到底這程序哪里寫的有問題。
等了幾分鐘,電腦重啟后,在C:\Windows目錄下找到了系統(tǒng)崩潰后產(chǎn)生的核心存儲文件:MEMORY.dmp,這個文件是操作系統(tǒng)崩潰后,Windows將內(nèi)核的數(shù)據(jù)、所有進(jìn)程、線程的執(zhí)行上下文進(jìn)行了保存,相當(dāng)于對“案發(fā)現(xiàn)場”進(jìn)行了“拍照”,用于事后定位問題。
注意,這個得提前設(shè)置好才會存儲,默認(rèn)情況下只會存儲一個很簡單的mini dump文件,不利于問題分析。
祭出內(nèi)核分析神器:WinDbg,來加載分析dump文件。
因為已經(jīng)知道崩潰位置位于npcap.sys文件,所以先去簡單了解了一下這個東西。
Linux上咱們使用tcpdump抓取數(shù)據(jù)包時,底層使用的核心庫就是libpcap,這是一個開源項目,在Windows上對應(yīng)的就是winpcap。后來在Win7之后,Windows上使用了更現(xiàn)代化的抓包接口,Wireshark默認(rèn)使用npcap來代替了傳統(tǒng)的winpcap。
既然是開源項目,事情就好辦了,有源碼,有PDB符號文件。
源碼大家知道,PDB文件可能有些人不知道。我們知道C/C++這類語言編譯完成后,所有的函數(shù)名字、參數(shù)、數(shù)據(jù)結(jié)構(gòu)定義等信息就丟失了,剩下的都是CPU指令了。那萬一程序出了問題程序員怎么分析呢?這就需要pdb文件了,pdb是程序數(shù)據(jù)庫的意思,這里面有前面說的那些信息。
在npcap項目的官網(wǎng),找到了npcap.sys驅(qū)動程序?qū)?yīng)版本的npcap.pdb文件,下載后,載入WinDbg中,可以看到程序崩潰的函數(shù)調(diào)用堆棧:
看到了吧,有了PDB文件,連源代碼路徑都顯示出來了。
在GitHub上找到了這個openclos.c文件,定位到最后導(dǎo)致崩潰的函數(shù):NPF_FreeCapData
具體是崩潰在哪一行呢?
回頭看看windbg可以告訴我們具體那一行指令的地址,在上下文的RIP寄存器中可以看到:
看一下這個位置的指令是個啥:
導(dǎo)致藍(lán)屏的是這一條指令:
- mov rbx, [rdx+18h]
這條指令的意思是把rdx+18指向位置的內(nèi)容,讀取到rbx寄存器中。又看了一下崩潰代碼是內(nèi)存訪問異常,那肯定就是rdx+18這個地址有問題了。
地址有問題,那現(xiàn)在rdx是個啥呢?
我去,居然是0,空指針NULL啊!那不崩潰就怪了!
結(jié)合匯編指令和數(shù)據(jù)結(jié)構(gòu)定義,就能鎖定源碼中的具體位置了:在源碼中的三級指針訪問中,第二級指針的pNBLCopy字段為空!而代碼中又沒有判斷為空指針的情況,就崩潰了~
再次結(jié)合函數(shù)調(diào)用棧和GitHub中的源代碼,可以看到這是在清理釋放抓取到的所有數(shù)據(jù)包時出現(xiàn)的問題,看下面代碼,這是在一個循環(huán)中,挨個釋放每個數(shù)據(jù)包所占據(jù)的資源,所有數(shù)據(jù)包以雙鏈表形式串聯(lián)了起來。
問題分析到這里,我已經(jīng)按捺不住心里的激動了,難道我發(fā)現(xiàn)了一個0day漏洞?要知道,驅(qū)動程序空指針bug用的好可是能做內(nèi)核級攻擊的!一個漏洞都是值不少$的。
剛剛幻想了1秒鐘,馬上清醒過來,等等,我這版本好像不是最新的,我康康最新的版本還有沒有這個問題。
結(jié)果潑了我一盆冷水,新的版本,已經(jīng)增加了對這個指針是否為空的判斷了:
哎!與財富擦肩而過~
本文轉(zhuǎn)載自微信公眾號「編程技術(shù)宇宙」,可以通過以下二維碼關(guān)注。轉(zhuǎn)載本文請聯(lián)系編程技術(shù)宇宙公眾號。