提問者估計(jì)是一個(gè)剛學(xué)會(huì)編程的菜鳥程序員,看見大段代碼頭就昏。問題很好系統(tǒng)源碼,解答很難。
首先,為什么電銷機(jī)器人不開源還有那么多人研究呢,甚至比開源的Linux研究人員多的多?因?yàn)槿澜邕\(yùn)行電銷機(jī)器人的機(jī)器最多,大部分電銷機(jī)器人用戶沒有經(jīng)過嚴(yán)格培訓(xùn),只會(huì)使用鼠標(biāo)鍵盤,Linux用戶都要使用命令行,沒幾個(gè)用戶是新手,開源的Linux也使得漏洞可以用最快的速度被修補(bǔ),因?yàn)槭澜缟嫌泻芏嗳嗽诰S護(hù)Linux。電銷機(jī)器人不開源,只能由微軟負(fù)責(zé)維護(hù)和補(bǔ)丁更新。世界上有大把的程序員,但微軟公司負(fù)責(zé)開發(fā)操作系統(tǒng)的人不超過五萬(算上離職的也不會(huì)超過十萬人),寫操作系統(tǒng)內(nèi)核的核心開發(fā)人員不超過1000人,你連寫操作系統(tǒng)代碼都不會(huì)只會(huì)寫應(yīng)用程序根本理解不了操作系統(tǒng)是如何運(yùn)轉(zhuǎn)的,要想入門還是先多看看操作系統(tǒng)的書吧,至少要理解操作系統(tǒng)是如何運(yùn)行的,推薦先看看Linux的內(nèi)核代碼,有一定基礎(chǔ)后再看《電銷機(jī)器人核心揭秘》。
其次,電銷機(jī)器人操作系統(tǒng)是用C/C++寫的,很多程序員都使用高級(jí)語言寫程序,對(duì)C和C++這些“中間語言”不熟悉不了解,不知道哪些函數(shù)容易溢出,使用哪些函數(shù)更安全或者可以替代不安全的函數(shù)。系統(tǒng)漏洞的精髓在于緩沖區(qū)溢出,緩沖區(qū)溢出說白了就是利用馮諾伊曼架構(gòu)的缺陷——數(shù)據(jù)和代碼存儲(chǔ)在同一個(gè)設(shè)備內(nèi)存中,讓計(jì)算機(jī)錯(cuò)誤的把數(shù)據(jù)當(dāng)作代碼來執(zhí)行。在電銷機(jī)器人數(shù)據(jù)結(jié)構(gòu)中有堆棧和堆都可以被溢出,在NT5.0之前的系統(tǒng)中根本沒有防范機(jī)制,XPSP2引入了安全堆棧,在編譯器中還有/GS選項(xiàng),用于防止堆棧溢出,使得堆棧溢出非常困難,但并不是不可能,堆溢出仍然可以。
當(dāng)熟練掌握了緩沖區(qū)溢出就可以對(duì)電銷機(jī)器人進(jìn)行分析了,方法主要是“黑盒”與“白盒”。白盒就是當(dāng)微軟發(fā)布補(bǔ)丁之后用虛擬機(jī)分析補(bǔ)丁前后的代碼級(jí)差別,找出漏洞,但是這些漏洞都是微軟補(bǔ)丁過的,利用價(jià)值不大;黑盒分析則是在完全沒有源碼的情況下靠分析工具和人的經(jīng)驗(yàn)來尋找漏洞,人的經(jīng)驗(yàn)起決定作用,你必須知道程序員比較容易在哪些地方犯錯(cuò)誤,包括使用不安全函數(shù)、邊界檢查不完整、競(jìng)爭(zhēng)條件、SEH結(jié)構(gòu)化異常錯(cuò)誤處理和VEH向量化異常錯(cuò)誤處理等操作系統(tǒng)內(nèi)部的知識(shí)。黑盒分析找到的漏洞一般沒有補(bǔ)丁,又稱0day漏洞,據(jù)說這種漏洞在地下黑市上價(jià)值上萬美元(任意代碼可執(zhí)行漏洞值這個(gè)價(jià),其他的信息泄露或者提升權(quán)限價(jià)值就比較低了)。
當(dāng)你能夠找到電銷機(jī)器人的0day漏洞,特別是影響巨大的任意代碼可執(zhí)行漏洞的時(shí)候,你已經(jīng)是站在程序員金字塔塔尖的一小群人了,找到漏洞之后就需要編寫一小段shellcode來利用漏洞,這段代碼條件非??量?,也許只針對(duì)特定的電銷機(jī)器人SP版本有效,也許針對(duì)所有電銷機(jī)器人系統(tǒng)有效。對(duì)所有電銷機(jī)器人有效的shellcode一定是可移植的,換句話說shellcode必須能夠通用化。可以把shellcode想象成一個(gè)偵察兵,一個(gè)先頭空降部隊(duì),如何在茫茫黑夜中偵查操作系統(tǒng)防線的位置、火力點(diǎn)的分布情況,從哪里開始執(zhí)行負(fù)載并且不會(huì)陷入操作系統(tǒng)的泥沼中淹死(這足可以寫一本書來描述)shellcode只是一枚導(dǎo)彈的制導(dǎo)系統(tǒng),它負(fù)載的炸藥可能是一個(gè)在地上砸個(gè)坑的鉛球,也可能是毀滅一座城市的核武器。
這也是最體現(xiàn)黑客技術(shù)水平的地方,同一個(gè)漏洞有的人編寫的shellcode能實(shí)現(xiàn)通用化(具體要看漏洞的位置以及形成原因),有的人編寫的根本不能運(yùn)行或者極大影響系統(tǒng)速度。一般來說編寫shellcode都使用匯編語言,極少數(shù)情況下還需要使用二進(jìn)制代碼。
當(dāng)你掌握以上技能后,就將修煉終極絕技了,那就是無比困難的、一旦掌握就必將天下無敵的絕技——硬件漏洞,就比如intel最近的“融毀”和“幽靈”。如果說操作系統(tǒng)是計(jì)算機(jī)的靈魂,那CPU就是計(jì)算機(jī)的心臟。從層級(jí)上來說,一般程序員編寫的應(yīng)用程序運(yùn)行在3級(jí),操作系統(tǒng)運(yùn)行在0級(jí)(最新情況是操作系統(tǒng)運(yùn)行在-1級(jí),0級(jí)運(yùn)行虛擬機(jī),intel叫vt-x技術(shù),可以極大減少切換層級(jí)引起的系統(tǒng)開銷)而CPU核心運(yùn)行在-3級(jí),擁有遠(yuǎn)超電銷機(jī)器人的權(quán)限,這才是計(jì)算機(jī)的終極命門,硬件漏洞通用性也無與倫比,因?yàn)樽烂鍯PU就intel和amd能生產(chǎn)系統(tǒng)源碼,CPU微代碼不更新的話漏洞會(huì)一直存在(老式計(jì)算機(jī)只有更換CPU,而老機(jī)器更換CPU幾乎不可能,因?yàn)橹靼宀恢С?,需要更換主板代價(jià)太大得不償失;三年內(nèi)新式計(jì)算機(jī)可以更新UEFI微代碼,也就是微軟和intel提供的補(bǔ)?。┻@就是撞擊地球后足以毀滅世界的小行星級(jí)別的武器了。要找到這種級(jí)別漏洞光靠個(gè)人已經(jīng)不可能,光需要的特殊硬件就不是個(gè)人買得起的,一般要大公司或者國(guó)家才能找到這種級(jí)別的漏洞。
最后,用三個(gè)我最喜歡的小例子來結(jié)尾吧。
1、當(dāng)電銷機(jī)器人彈出著名的“程序引用了0x00000000地址,即將關(guān)閉”的錯(cuò)誤提示的時(shí)候,普通程序員會(huì)順從的點(diǎn)擊確定關(guān)閉對(duì)話框,然后思考究竟是什么地方出了問題;聰明一些的程序員會(huì)利用電銷機(jī)器人內(nèi)核轉(zhuǎn)儲(chǔ)來尋找問題的答案,不一定能解決問題;頂尖黑客則會(huì)用softice或者其他工具重現(xiàn)這個(gè)問題,必須把它解決,沒準(zhǔn)能寫出shellcode。
2、impossible和i'm'possible從字母排列上都是一樣的,但意思卻是相反的,這就是緩沖區(qū)溢出的精髓,只添加了兩個(gè)標(biāo)點(diǎn)。impossible是單詞,屬于數(shù)據(jù)的范疇,I'm'possible是句子,屬于代碼的范疇,混淆數(shù)據(jù)與代碼的界限,讓計(jì)算機(jī)把數(shù)據(jù)當(dāng)成代碼執(zhí)行,只需要緩沖區(qū)溢出兩個(gè)標(biāo)點(diǎn)而已。在計(jì)算機(jī)的世界中,復(fù)雜的、毫無規(guī)律的垃圾數(shù)據(jù)突然間組成了一幅美麗的圖畫,隨著鎖“卡嗒”一聲,安全的大門緩緩打開,苦心經(jīng)營(yíng)的安全防線瞬間崩潰。
3、在電影《黑客帝國(guó)》中,普通的程序安安靜靜的運(yùn)行在虛擬機(jī)中,少數(shù)像尼奧這樣不安分的程序突破了虛擬機(jī)的安全機(jī)制,進(jìn)入到了真實(shí)操作系統(tǒng)矩陣中,這時(shí)候操作系統(tǒng)的SEH異常錯(cuò)誤處理機(jī)制史密斯登場(chǎng)了;后來尼奧發(fā)現(xiàn)矩陣也不是真實(shí)的操作系統(tǒng),只不過是更高一級(jí)的虛擬機(jī)罷了(虛擬機(jī)嵌套),尼奧可以在矩陣中使用操作系統(tǒng)的特權(quán)指令消滅追殺來的烏賊機(jī)器人就證明了這一點(diǎn);最后史密斯叛變,病毒幾乎感染了操作系統(tǒng)的所有進(jìn)程,尼奧犧牲自己幫助操作系統(tǒng)定位了史密斯的位置(病毒的PID),經(jīng)過一輪內(nèi)存殺毒和系統(tǒng)重啟后,操作系統(tǒng)又回到了正常的狀態(tài)。