1、布景
Tor(The Oninon Router)供給一個(gè)匿名交換收集平臺(tái),它使得用戶在瀏覽網(wǎng)頁或拜候其它收集辦事時(shí)不會(huì)被跟蹤。作為該收集的一部門即所謂的“暗網(wǎng)”(darknet),是指只能經(jīng)由過程Tor收集拜候的辦事器群組,這些辦事器供給包含社區(qū)論壇、電子郵件等多種辦事。當(dāng)然供給這些辦事都是無歹意的,初志是用來存眷加害人權(quán)標(biāo)題問題,可是因?yàn)槟涿膯⑹挛肆级嘤蟹阜ㄒ鈭D的人,好比傳播兒童色情。過后法律部門也不克不及追蹤到犯法者的源IP地址。
2013年,在“暗網(wǎng)”辦事器上發(fā)現(xiàn)了一款歹意軟件,它操縱特定Web瀏覽器上的安然縫隙在用戶電腦上履行一段代碼。該代碼匯集一些用戶信息,發(fā)往弗吉尼亞州的辦事器,以后自毀。就歹意軟件的特點(diǎn)來講,它沒有較著的歹意意圖。初步揣度是FBI植進(jìn),他們在弗吉尼亞州有處事處,曾也派專人開辟過歹意法度,多是他們成立了它—此刻看來是真的。
2、對(duì)Shellcode的逆向闡發(fā)
1、縫隙操縱
縫隙操縱代碼用javascript編寫,操縱一個(gè)出名的firefox瀏覽器的特定版本(Tor收集預(yù)裝的firefox)的縫隙。該縫隙操縱代碼顛末端恍惚措置,但經(jīng)由過程快速掃描可以看到一長串十六進(jìn)制字符,這些字符是shellcode的前幾個(gè)標(biāo)記性字節(jié),即call把持碼(shellcode常常以一個(gè)jump或call開端,是以知道了這些把持碼使得辨認(rèn)shellcode變得等閑起來)。
我不會(huì)在這里闡發(fā)這個(gè)縫隙,可是要看一下這個(gè)shellcode。
起首,讓我們用一些根基的shellcode原則設(shè)定一個(gè)場景。
2、位置無關(guān)代碼
Shellcode的成功履行顛末端獨(dú)一無二的挑戰(zhàn),因?yàn)樗侵苯幼⑦M(jìn)到一個(gè)過程而不是由Windows加載器加載。是以,我們不知道shellcode位于內(nèi)存中的甚么處所,更關(guān)頭的是,不知道尺度的windowsAPI函數(shù)位于甚么處所(而凡是環(huán)境下,Windows加載器會(huì)奉告一個(gè)法度這些信息)。
是以,我們必需利用一系列技能往獲得這個(gè)信息。FBI歹意法度用了一個(gè)常常利用的技能往找出它的內(nèi)存地址:
call start
start:
pop ebp
call函數(shù)將履行法度移動(dòng)到start標(biāo)簽處,同時(shí)將法度當(dāng)前履行的位置壓進(jìn)倉庫中(如許我們稍后可以從call函數(shù)返回)。
在此,我們將要用這個(gè)值,從棧里盜取位置,倉庫彈出的值保留到ebp存放器。我們此刻知道了下一條指令的地址,那么便可以用它來拜候跟我們的shellcode相干的數(shù)據(jù)。
3、定位Windows API
因?yàn)檎-h(huán)境下Windows加載器會(huì)加載Windows API的位置到我們的法度,所以我們不奢看運(yùn)行一個(gè)shellcode時(shí)可以或許知道法度的位置信息。找出API函數(shù)慣用的編制是查看FS段存放器所指的線程信息塊(thread information block)。我們可以或許經(jīng)由過程這個(gè)布局體往定位被我們shellcode宿主法度加載的DLLs,然后操縱這些DLL的輸出直到找到方針函數(shù)為止。當(dāng)然這個(gè)過程是很乏味的,所以,F(xiàn)BI這個(gè)shellcode利用了一個(gè)庫,包含在MetasploitFramwork內(nèi),這是由Stephen Fewer寫的一個(gè)函數(shù)解析器。它的工作道理以下:
push arguments
. . .
push FUNCTIONHASH
call
這個(gè)函數(shù)的哈希值是由一個(gè)簡單的hash算法生成,以我們調(diào)用函數(shù)的名稱定名。如許做的目標(biāo)不是為了混合代碼(雖然它達(dá)到這個(gè)目標(biāo)),但只承諾我們用一個(gè)32位的DWORD來調(diào)用此函數(shù),而不是一個(gè)長型字符串(shellcode空間常常是有限的)。
值得光榮的是,我們本身可以計(jì)較出hash值,或用他人生成的查找表。
4、開端
假定我們對(duì)shellcode的開端進(jìn)行反匯編,以下圖:

我們一旦計(jì)較出指向API解析器的ebp存放器值,我們便可以在windows的API進(jìn)行哈希調(diào)用前獲得其十六進(jìn)制數(shù)。如斯,假定在查找表里查找到阿誰值,在阿誰值周圍查找調(diào)用的函數(shù),并且添加一些注釋,以下圖:
這段代碼履行完全性查抄,經(jīng)由過程用GET 開端的HTTP要求頭部信息以確保shellcode安然運(yùn)行。然后調(diào)用Windows API函數(shù)LoadLibrary()載進(jìn)兩個(gè)動(dòng)態(tài)鏈接庫:ws2_32.dll(用于互聯(lián)網(wǎng)通信的Windows套接字庫)和iphlpapi.dll(WindowsIP輔助庫)。
5、連接到HTTP辦事器
在需要的庫文件都加載完以后,shellcode將履行下圖中的把持:

再一次,用不異的步調(diào),用哈希值查找一個(gè)Windows API函數(shù):connect()函數(shù)。我們可以看見,在[ebp +0x2e1]位置的數(shù)據(jù)作為一個(gè)參數(shù)傳遞給connect()函數(shù)—從手冊我們知道,阿誰參數(shù)是一個(gè)sockaddr布局體(sockaddr structure)。我們知道ebp存放器指向我們在內(nèi)存中的地址,利用阿誰地址,再加上偏移量,我們就可以定位出那些數(shù)據(jù)在內(nèi)存0x2E8處(ebp=0×7)。
是以,我們在闡發(fā)sockaddr之前,先給這些代碼添加一些注釋,定名一些內(nèi)存偏移地址,以下圖:
這個(gè)eax存放器保留著調(diào)用connect()函數(shù)的返回值,假定這個(gè)值為0(來自微軟用戶手冊)暗示connect()調(diào)用成功??墒俏覀兂晒B接到哪兒?假定我們此刻添加一些注釋到我們之前的反匯編文件,基于我們在微軟用戶手冊中能查到的關(guān)于sockaddr布局體的信息,我們可以如許添加注釋,以下圖:
經(jīng)由過程對(duì)IP地址進(jìn)行whois快速查詢,只獲得很少信息。以下圖:

6、匯集用戶信息
接下來,這個(gè)歹意軟件測驗(yàn)測驗(yàn)獲得windows主機(jī)名—凡是環(huán)境下這是windows機(jī)械的名字。這可能有助于確認(rèn)嫌疑犯和確認(rèn)他們沒有拘系錯(cuò)人。
其次,它列舉了活躍主機(jī)的hostname和IP地址。
利用SendARP()函數(shù)來發(fā)現(xiàn)收集中所有電腦的MAC地址。有一些“得當(dāng)”的編制做到如許,可是shellocode只能獲得有限的空間往完成這些事。MAC地址將用戶與一張?zhí)囟ǖ木W(wǎng)卡綁定,因而可以經(jīng)由過程這些網(wǎng)卡的供給鏈來追蹤用戶。
最后,它要構(gòu)建HTTP頭部信息,將MAC地址放進(jìn)Cookie字段,用戶的主機(jī)名放進(jìn)Host字段,并且要以GET要求編制發(fā)送到http://65.222.202.54/05cea4de-951d-4037-bf8f-f69055b279bb。這些十六進(jìn)制數(shù)字的意義不清晰,它們多是肆意選擇或鏈接一個(gè)用戶到特定的接進(jìn)辦事器。
7、最后階段
這個(gè)shellcode最后階段的獨(dú)一目標(biāo)就是在該shellcode結(jié)束時(shí)運(yùn)行更多的shell代碼—它如許做的編制略微有點(diǎn)迂回,我也不知道為甚么如許,或許是一次粗略的測驗(yàn)測驗(yàn)。
那么,最后一歩要如何做。起首,它操縱一些字符串長度把持找出一些被嵌進(jìn)在其他所稀有據(jù)區(qū)的代碼。那些代碼計(jì)較出我們的HTTP要求字符串結(jié)束的位置,跳過在shellcode結(jié)尾處的所有的無效的空把持指令,然后跳到那邊。那邊是哪里?誰知道!我被奉告有更多的shellcode(這不首要),可是我已沒有時(shí)候來調(diào)試這個(gè)縫隙并獲得它。
構(gòu)建頭部,然后跳轉(zhuǎn)到頭部結(jié)尾處。
查找http頭部結(jié)尾處的無效指令并且跳過它們。
8、運(yùn)行代碼
到今朝為止,我以完全靜態(tài)的編制闡發(fā)了這些代碼—主如果為了完全性。經(jīng)由過程運(yùn)行這些代碼可以或許更快速的闡發(fā)它們,同時(shí)可以驗(yàn)證我們的闡發(fā)是不是準(zhǔn)確。既然這段歹意代碼沒有任何粉碎系統(tǒng)的行動(dòng),是以我們可以安然的在真機(jī)上運(yùn)行它。因而運(yùn)行它并不雅察它發(fā)送給FBI的切當(dāng)數(shù)據(jù)。因?yàn)閟hellcode不是一個(gè)exe可履行文件,我需要一個(gè)shellcode加載器往運(yùn)行它—-它們快速的分派需要的內(nèi)存,加載shellcode并跳轉(zhuǎn)到該處。這是加載shellcode需要做的—-在調(diào)用真實(shí)的shellcode之前會(huì)主動(dòng)斷開。
然后我們啟動(dòng)調(diào)試器跨步履行到調(diào)用cnnect()函數(shù)。我們不克不及不把這個(gè)shellcode的方針指向另外一臺(tái)我們本身的機(jī)械,便于不雅察運(yùn)行成果。是以,我將讓他指向ip地址為192.168.0.254的77端口,然后在這個(gè)機(jī)械上運(yùn)行netcat法度抓取數(shù)據(jù)。鄙人圖代碼暫停的箭頭所指處,就是初期經(jīng)由過程patch編制來點(diǎn)竄sockaddr布局體。

然后我們繼續(xù)跨步履行到調(diào)用send()函數(shù),履行它,以后我們能看見在netcat終端的輸出,它將輸出它收到的所稀有據(jù)—顯示的那些數(shù)據(jù)本來是發(fā)給FBI。你可以看到,cookie里面的ID包含了我的MAC地址,Host 頭部包含了我的desktop名。
最后,我們跨步履行到最后階段—最后的空把持多是用來注進(jìn)更多的已提取的shellcode。在阿誰十六進(jìn)制查看器窗口可以看見,我們機(jī)關(guān)的阿誰HTTP要求已發(fā)出。

9、結(jié)論
這個(gè)歹意軟件從用戶瀏覽器發(fā)送確認(rèn)信息給報(bào)復(fù)打擊機(jī),然后利用戶firefox瀏覽器解體。就復(fù)雜性而言,它沒有很較著的出格的地方,也沒有益用一些大年夜家不知道的新手藝。
假定這個(gè)歹意軟件作者是FBI,那么他們需要往答復(fù)一些很峻厲的標(biāo)題問題。這些歹意法度被植進(jìn)到非美國的辦事器上,并報(bào)復(fù)打擊操縱全球用戶的瀏覽器(他們傍邊良多人是無辜的)他們?nèi)缭S做乃至可能會(huì)獲得法令授權(quán)?我不這么覺得。當(dāng)有人告密時(shí)FBI是不是需要出示他們曾獲得過法令授權(quán)的證據(jù)?未必。我希看他們會(huì)根據(jù)用戶的電腦內(nèi)發(fā)現(xiàn)的證據(jù)和在收到告狀時(shí)獲得的證據(jù)—-雖然最初的搜刮授權(quán)可能很不靠譜。不管如何說,我事實(shí)不是一個(gè)律師。