繞過 KIS 7 防火牆的一種簡單方法

2021-04-15 23:10:07 字數 2533 閱讀 5939

今天我們來講乙個簡單但很有效的繞過 kaspersky internet security 7.0 網路監控的方法,kis 7.0 的網路監控是現如今個人電腦上最流行、最著名的保護程式之一。對於這個產品,人們有褒有貶。用或不用完全在您,這裡只是闡述客觀事實。我們來看下時下最新版本 7.0.0.125。繞過的方法類似於利用緩衝區溢位漏洞。概念上的證明這裡就不進行了,免得我們的小兄弟——script kidds——太過興奮。要寫**的話,連帶除錯有 30 分鐘就能搞定。閒話少說,開始動手。

有一種技術極其著名而且常用,這就是注入(inject)。關於這種技術的介紹已經很多了,而且所有已經公開的注入技術都能被我們這裡用作小白鼠的卡巴檢測出來。注入技術的本質就是用某種合適的方法在已信任的程式中執行**。大多數使用者在上網時都要使用瀏覽器,所以瀏覽器程式一定被列在網路監控的信任列表裡,這時網路監控會預設允許瀏覽器向任何伺服器的 80 埠傳送資料。我們所利用的就是這一點——將**注入到瀏覽器裡,並通過瀏覽器來傳送和接受資料。喏,這點大家都知道 =) 可是如何實現注入呢?如何繞過 kis 主動防禦這道門檻呢?辦法居然十分簡單。

注入過程總共有兩步 - 1) 寫入** 2) 將控制權傳給這段**。寫入**嘛……辦法可以想出很多,但我只講乙個獨用於 kis 的秘法。一般來說,向另外乙個程序寫入**用的都是 kernel32!writeproces**emory 函式,更底層些的還有 native 版的 ntdll!ntwritevirtualmemory。我們這裡就不講它的引數了,要檢視引數資訊,可以用 ida 看反彙編**,=) 這當然是開玩笑了,去看 micro$oft 的 msdn 吧。通常向其它程序寫入**的行為都會被 kis 攔截,但也不一定。破解任何一種保護方式的基礎是破解它實施保護所依賴的前提。kis 的前提是可以向沒有標記為可執行(即沒有 executable 屬性)的虛擬記憶體中寫入。如果記憶體沒有這個屬性,那就可以任意向其中寫入,而 kis 則放手不管。這一點純粹是通過試驗手段得來的。很好。我們開始寫入**。但是向**寫呢?有乙個簡單的辦法——寫入堆疊記憶體中。但是一般的方法太沒意思了,用乙個一箭雙鵰的辦法向堆疊中的指定位置寫入**才最有意思,而這裡的「雙雕」正是程序裡的兩個注入點。大家可能都有所意會了。還沒明白的就接著往下看吧。對於寫入部分已經講明白了,**的執行也將在堆疊中進行——在接下來將要執行我們程式的執行緒的堆疊中。執行緒在呼叫函式時,函式的返回位址通常也是在堆疊中。把這個返回位址換成我們程式的位址,我們就劫持了執行緒,使其執行我們的同樣位於堆疊中的**。我知道,由於一些現代的技術,堆疊中的**並不總是能執行的。喏,我們的寫入位置可以不僅僅在堆疊中。這個問題就留給大家了。這個簡單注入的方案可以很明晰地分為以下幾步:

1. 建立程序,以預設方式執行瀏覽器檔案。

2. 執行一段時間後停止瀏覽器執行緒。

3. 獲得其上下文——我們需要堆疊指標。

4. 分析堆疊中的返回位址。

5. 寫入我們**的位址。

6. 恢復執行緒執行。

在這個演算法裡有乙個地方最不容易實現——如何分析堆疊得出某函式返回的位址。我使用了下面的方法——沿堆疊向下搜尋,會取得乙個個的 dword。每個 dword 都可能是返回位址。是否是返回位址可用如下方法驗證——讀取 dword,取得 dword 表示的位址,並沿此位址往回進行反彙編。如果遇到了 call 指令,那就意味著這個位址就是返回位址。簡單的說明如下:

call x

ret_address:

proc x

….假設我們在執行 x 函式時停止了執行緒,在堆疊中就會存在著儲存在暫存器中的區域性變數(stdcall 呼叫方式)、儲存在堆疊中的臨時資料,當然還有函式返回位址。這個返回位址就是 ret_address。它的值我們應該可以通過分析堆疊來找到。這裡我們可能會想,分析過程中我們可以依賴 ebp 的值,這個值一般也是儲存在堆疊中的,大家可以回憶一下多數函式的標準的 prologue。ebp 的值我們可以通過上下文取得。但是,實踐證明這一點並不是完全可以信賴的,因為在某個具體函式呼叫的上下文中被停止的執行緒的堆疊裡可能僅僅有乙個返回位址,別的就再沒有什麼了。實現這個技術需要乙個指令長度反彙編器以及對指令的分析。結果我們得到了乙個具備繞過 kis 7 功能的最小函式的偽**:

createprocess(browserfilepath,…,processinformation); //建立程序

sleep(1000);                      // 睡會兒

suspendthread(processinformation.hthread);          // 停掉最初生成的執行緒

getthreadcontext(processinformation.hthread,&context);// 獲取上下文

readproces**emory(processinformation.hprocess,context.esp,stackchunk,1000*4);// 從 esp 裡讀 1000 個 dword

for (i=0;i<1000;i++) // 分析執行緒堆疊}}

wa** 小組的 *dead_body* 提出了這個繞過的思想,謹向他表示敬意。永遠懷念已逝的程式天才 ms-rem。我們等待 kis 研發團隊的官方回應。再見。

mailto –[email protected]

[c] mental_mirror

CenTos 7上防火牆的簡單操作

1 firewall的簡單操作 查詢防火牆狀態 firewall cmd state 關閉防火牆 systemctl stop firewalld.service 禁止firewall開機啟動 systemctl disable firewalld.service 開啟防火牆 systemctl s...

CentOS7簡單的網路,防火牆設定

一 網路設定 1.開啟網絡卡開關 將 onboot no 修改為 onboot yes 2.重啟網路服務 systemctl restart network.service 3.測試一下,從網路上安裝gcc試試 yum install y gcc 二 防火牆配置 1.檢視firewall服務狀態 2...

Centos7 關於防火牆的一些簡單配置

近期安裝了linux系統centos7,接觸下來發現了與原來的centos6.5有一些差別,這裡主要記錄下來我的一些關於centos7防火牆的了解。一 firewall簡介 centos 7中防火牆是乙個非常的強大的功能,在centos 6.5中在iptables防火牆中進行了公升級了。在cento...