【转】反病毒攻防研究第002篇:利用缝隙实现代码的植入
聲明
因?yàn)樵谠u(píng)論區(qū)看到原博主說(shuō)要把文章刪掉。。。心想這么好的文章刪了真的可惜,所以就先轉(zhuǎn)一份。。。
一、前言
? ? ? ? 現(xiàn)在很多網(wǎng)站都提供各式各樣軟件的下載,這就為黑客提供了植入病毒木馬的良機(jī)。黑客可以將自己的惡意程序植入到正常的程序中,之后發(fā)布到網(wǎng)站上,這樣當(dāng)用戶下載并運(yùn)行了植入病毒的程序后,計(jì)算機(jī)就會(huì)中毒,而且病毒可能會(huì)接著感染計(jì)算機(jī)中的其他程序,甚至通過(guò)網(wǎng)絡(luò)或者U盤(pán),使得傳播面積不斷擴(kuò)大。而本篇文章就來(lái)剖析病毒感染的實(shí)現(xiàn)原理,首先需要搜索正常程序中的縫隙用于“病毒”(用對(duì)話框模擬)的植入,之后感染目標(biāo)程序以實(shí)現(xiàn)“病毒”的啟動(dòng)。當(dāng)然,討論完這些,我依舊會(huì)分析如何應(yīng)對(duì)這種攻擊方法,這才是本篇文章討論的重點(diǎn)。
?
二、搜索程序中存在的縫隙。
? ? ? ? 病毒木馬如果想對(duì)一個(gè)正常的程序?qū)懭氪a,那么首先就必須要知道目標(biāo)程序中是否有足夠大的空間來(lái)讓它把代碼植入。一般來(lái)說(shuō),有兩種方法,第一種就是增加一個(gè)節(jié)區(qū),這樣就有足夠的空間來(lái)讓病毒植入了,但是這樣一來(lái),不利于病毒的隱藏,如同告訴反病毒工程師“我就是病毒”一樣,即便如此,我依舊會(huì)在后面的文章中討論這種方法。第二種方法就是查找程序中存在的縫隙,然后再植入代碼。因?yàn)樵赑E文件中,為了對(duì)齊,節(jié)與節(jié)之間必然存在未被使用的空間,這就是程序中存在的縫隙。只要惡意代碼的長(zhǎng)度不大于縫隙的長(zhǎng)度,那么就可以將代碼寫(xiě)入這個(gè)空間。這里討論的就是這種方法的實(shí)現(xiàn)。
? ? ? ? 為了討論的簡(jiǎn)單起見(jiàn),我這里依舊使用在上一篇文章中所編寫(xiě)的ShellCode。和上一篇文章中所討論的方法不同的是,上次是將ShellCode寫(xiě)入了密碼文件,密碼驗(yàn)證程序讀取密碼文件后,產(chǎn)生溢出,執(zhí)行了ShellCode,然后再執(zhí)行“病毒”程序。而這次是省去了中間環(huán)節(jié),直接將ShellCode寫(xiě)入正常的程序中,運(yùn)行程序就直接運(yùn)行了“病毒”,這樣就更加隱蔽,更容易被觸發(fā)。提取出之前的ShellCode,并進(jìn)行一定的修改,定義如下:
? ? ? ? 這里需要說(shuō)明的是,由于我們接下來(lái)要將程序的入口點(diǎn)修改為ShellCode的入口點(diǎn),在ShellCode執(zhí)行完后,又需要跳回原程序的入口點(diǎn),因此在原始ShellCode的后面添加上了mov和jmp eax的指令。mov后面留有四個(gè)字節(jié)的空間,用于原始程序OEP的寫(xiě)入,下一步就是跳到原始程序去執(zhí)行。由于原始ShellCode中包含有退出代碼,所以也需要將調(diào)用ExitProcess的ShellCode代碼去掉。
搜索程序中縫隙的代碼如下:? ? ? ? 上述代碼是在代碼的節(jié)區(qū)與緊挨著代碼節(jié)區(qū)之后的節(jié)區(qū)的中間的位置進(jìn)行搜索,從代碼節(jié)區(qū)的末尾開(kāi)始反向搜索。
?
三、將ShellCode植入目標(biāo)程序
這里我們需要編寫(xiě)一個(gè)main函數(shù)來(lái)調(diào)用上面的函數(shù),代碼如下:? ? ? ? 由于我需要把ShellCode植入可執(zhí)行文件,只有可執(zhí)行文件才能啟動(dòng)ShellCode,因此有必要提前對(duì)目標(biāo)文件進(jìn)行格式檢測(cè)。而檢測(cè)的方法,一般就是檢測(cè)MZ與PE標(biāo)志位是否存在。這里有一件事需要說(shuō)明,就是在將ShellCode拷貝到縫隙中的那條語(yǔ)句中,使用了memcpy函數(shù),它的第三個(gè)參數(shù)是strlen(shellcode)+3,這里之所以加上3,是因?yàn)閟trlen這個(gè)函數(shù)當(dāng)遇到字符串中出現(xiàn)的\x00時(shí),就會(huì)認(rèn)為字符串已經(jīng)結(jié)束,那么它的字符長(zhǎng)度的計(jì)數(shù)就會(huì)停在\x00處。而一個(gè)程序的OEP往往是0x004XXXXX,小端顯示,它的存儲(chǔ)方式就是XXXXX400,在我的ShellCode中,由于00后面還剩下三個(gè)字節(jié)(\xff\xe0\x90),但是被00所截?cái)嗔?#xff0c;導(dǎo)致這最后的三個(gè)字節(jié)不被strlen認(rèn)可,因此需要再加上3。
?
四、程序的“感染”
? ? ? ? 為了測(cè)試我們的“感染”程序,在此我再編寫(xiě)一個(gè)HelloWorld程序,代碼如下:圖1 用Hex Editor查看植入代碼
? ? ? ? 再用OllyDbg查看植入代碼:
圖2 用OllyDbg查看植入代碼
圖3 被“感染”前
圖4 被“感染”后
? ? ? ? 此時(shí)我們就可以確定,helloworld.exe已經(jīng)被“感染”了,為了驗(yàn)證“被感染”程序是否能夠啟動(dòng)我們的對(duì)話框程序,需要將Hack.exe(注意這里改了名字)放到與helloworld.exe的同一目錄下,然后執(zhí)行helloworld.exe,如下圖所示:
圖5 運(yùn)行“被感染”的程序
? ? ? ? 可見(jiàn),用于模擬病毒的提示對(duì)話框以及helloworld.exe自身的程序都得到了運(yùn)行,這也說(shuō)明了“感染”是成功的。
? ? ? ? 這里是直接將程序的入口點(diǎn)修改為我們的ShellCode的入口地址,其實(shí)這是不利于“病毒”的隱藏的,為了起到迷惑的作用,可以將ShellCode程序植入到helloworld的代碼中,甚至將ShellCode拆分為幾個(gè)部分再植入,這樣就很難被發(fā)現(xiàn)了,這里就不再詳細(xì)討論。
?
五、防范方法的討論
? ? ? ? 由于惡意程序的這種“感染”方法是在程序的縫隙將自身代碼植入,因此它是不會(huì)對(duì)原始程序的大小產(chǎn)生任何改變的,當(dāng)然也是由于我所舉的這個(gè)例子比較簡(jiǎn)單,ShellCode也比較短的緣故。這或多或少也實(shí)現(xiàn)了病毒的隱藏,不過(guò)防范的方法還是有的。一般來(lái)說(shuō),軟件公司都會(huì)對(duì)自己的軟件產(chǎn)品進(jìn)行校驗(yàn),比如運(yùn)用MD5、Sha-1或者CRC32等。校驗(yàn)的結(jié)果是唯一的,也就是說(shuō),即便原始程序改動(dòng)很小(如這次僅僅修改了32個(gè)字節(jié)的內(nèi)容),那么校驗(yàn)的結(jié)果也會(huì)很不相同。很多安全類軟件都能夠提供校驗(yàn)的功能,而校驗(yàn)也總被運(yùn)用在手工查殺病毒中,因?yàn)楹诳屯鶗?huì)對(duì)系統(tǒng)中的svchost.exe或者一些DLL文件做手腳,而這樣的一些重要文件,官方都會(huì)給出真正的校驗(yàn)值,那么對(duì)比一下就能夠很容易發(fā)現(xiàn)這些文件是否被篡改過(guò)了。回到上面的helloworld.exe,在“感染”前后,用火眼進(jìn)行校驗(yàn)檢測(cè):
圖6 “感染”前
圖7 “感染”后
? ? ? ? 這里的建議是多采用幾種校驗(yàn)方式進(jìn)行校驗(yàn),因?yàn)橄馦D5這種校驗(yàn)方式有可能會(huì)被做手腳,使得“感染”前后的結(jié)果可能是一樣的,而目前的技術(shù)還無(wú)法使在修改了原始文件的前提下,所有校驗(yàn)方式的校驗(yàn)結(jié)果不變。所以善于利用校驗(yàn)的方式,可以使自己的計(jì)算機(jī)免受很多的威脅。
? ? ? ? 針對(duì)于這種攻擊方式,我這次并不打算寫(xiě)出專殺工具,畢竟依靠之前的專殺工具就足夠了。而對(duì)于文件被“感染”,去除感染是一件比較麻煩的事情,在這里先不進(jìn)行討論。以后的文章中可能會(huì)專門論述這個(gè)問(wèn)題。
?
六、小結(jié)
? ? ? ? 這次簡(jiǎn)單討論了一下利用PE結(jié)構(gòu)中的縫隙實(shí)現(xiàn)ShellCode的植入。在我看來(lái),PE知識(shí)是許多高級(jí)技術(shù)的基礎(chǔ),是必須要掌握的。以后的文章,會(huì)從更多的角度來(lái)講解利用PE格式實(shí)現(xiàn)“病毒”的攻擊與防范。再次強(qiáng)調(diào)的是,我在這里討論的目的是為了讓大家了解更多的計(jì)算機(jī)安全的知識(shí),而不應(yīng)將這些運(yùn)用于歪門邪道。我所講的這些方法,是無(wú)法通過(guò)殺軟的檢驗(yàn)的,即便是這次被感染的程序,“火眼”依舊將其列為重點(diǎn)懷疑對(duì)象。所以不應(yīng)為了一時(shí)之快,而做出讓自己后悔的舉動(dòng)。
- <li class="tool-item tool-active is-like tool-clicked"><a href="javascript:;"><svg class="icon" aria-hidden="true"><use xlink:href="#csdnc-thumbsup"></use></svg><span class="name">點(diǎn)贊</span><span class="count">3</span></a></li><li class="tool-item tool-active is-collection "><a href="javascript:;" data-report-click="{"mod":"popu_824"}"><svg class="icon" aria-hidden="true"><use xlink:href="#icon-csdnc-Collection-G"></use></svg><span class="name">收藏</span></a></li><li class="tool-item tool-active is-share"><a href="javascript:;" data-report-click="{"mod":"1582594662_002"}"><svg class="icon" aria-hidden="true"><use xlink:href="#icon-csdnc-fenxiang"></use></svg>分享</a></li><!--打賞開(kāi)始--><!--打賞結(jié)束--><li class="tool-item tool-more"><a><svg t="1575545411852" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="5717" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M179.176 499.222m-113.245 0a113.245 113.245 0 1 0 226.49 0 113.245 113.245 0 1 0-226.49 0Z" p-id="5718"></path><path d="M509.684 499.222m-113.245 0a113.245 113.245 0 1 0 226.49 0 113.245 113.245 0 1 0-226.49 0Z" p-id="5719"></path><path d="M846.175 499.222m-113.245 0a113.245 113.245 0 1 0 226.49 0 113.245 113.245 0 1 0-226.49 0Z" p-id="5720"></path></svg></a><ul class="more-box"><li class="item"><a class="article-report">文章舉報(bào)</a></li></ul></li></ul></div></div><div class="person-messagebox"><div class="left-message"><a href="https://blog.csdn.net/ioio_jy"><img src="https://profile.csdnimg.cn/D/5/F/3_ioio_jy" class="avatar_pic" username="ioio_jy"><img src="https://g.csdnimg.cn/static/user-reg-year/2x/7.png" class="user-years"></a></div><div class="middle-message"><div class="title"><span class="tit"><a href="https://blog.csdn.net/ioio_jy" data-report-click="{"mod":"popu_379"}" target="_blank">ioio_jy</a></span><span class="flag expert"><a href="https://blog.csdn.net/home/help.html#classicfication" target="_blank"><svg class="icon" aria-hidden="true"><use xlink:href="#csdnc-blogexpert"></use></svg>博客專家</a></span></div><div class="text"><span>發(fā)布了121 篇原創(chuàng)文章</span> · <span>獲贊 670</span> · <span>訪問(wèn)量 65萬(wàn)+</span></div></div><div class="right-message"><a href="https://bbs.csdn.net/topics/395526389" target="_blank" class="btn btn-sm btn-red-hollow bt-button personal-messageboard">他的留言板</a><a class="btn btn-sm attented bt-button personal-watch" data-report-click="{"mod":"popu_379"}">已關(guān)注</a></div></div></div>
總結(jié)
以上是生活随笔為你收集整理的【转】反病毒攻防研究第002篇:利用缝隙实现代码的植入的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 深度学习在医学影像中的研究进展及发展趋势
- 下一篇: 【2017年第1期】基于外卖物流配送大数