一個緩衝區溢位漏洞的簡易教程

zaishaoyi發表於2015-09-08

這篇文章類似於“傻瓜系列之利用緩衝區溢位”。在這類漏洞中,我們的做法是利用網路,程式控制器,輸入等等,傳送超大的資料緩衝區給程式,覆蓋程式記憶體的重要部分。在這些緩衝區覆蓋程式記憶體之後,我們可以重定向程式的執行流並執行注入程式碼。

首先,我們需要做的是查明程式的哪一部分可以用來重寫記憶體。處理這個任務的過程叫作“fuzzing”。我們可以為Metasploit框架中的各種協議找到若干個fuzzer(執行fuzzing任務的工具)。

接下來這個例子中,我們用metasploit對一個ftp伺服器進行fuzz:

Fuzzer執行幾分鐘後,程式就崩潰了,見下圖:

在Metasploit視窗中,我們可以看到崩潰緩衝區的長度:

在分析所有輸出內容之後,我們可以得出:在ftp伺服器通過使用者命令傳送了一個大於250的緩衝區後,程式崩潰了。

我們可以使用python來重現崩潰:

現在,我們重新實施這次攻擊,但是首先要將FTP SERVER程式附加到一個偵錯程式上,在這裡我們用的偵錯程式是OLLYDBG。

在實施攻擊之後,我們可以很直觀地看到ESP,EDI和EIP暫存器被覆蓋。

稍微研究一下,大家可以發現:EIP控制程式的執行流,如果可以重寫EIP,那麼就可以手動重定向程式的執行流。EIP指向下一個待執行地址。

在這裡,我們需要知道要重寫的EIP緩衝區長度。我們可以在metasplpit中用pattern_create建立一種模式,並且作為一個緩衝區使用,來獲取重寫EIP的4個位元組的位置。

把這些命令新增到我們的利用程式碼中,並再次執行:

現在,我們可以看到程式記憶體中的模式。

現在需要使用pattern_offset(偏移量模式)來找到那4個位元組的準確位置(只要把4個位元組作為一個指令碼引數貼上到EIP裡面)。

由於在EIP之後ESP就被重寫,我們可以寫出這樣一段利用程式碼如下:

並且,如果重新載入,在OLLY裡面,可以看到它執行得很好。

在EIP之後,是這樣改寫ESP的:

那麼在EIP裡面我們需要做什麼呢?將我們的惡意程式碼放到重寫EIP的程式碼後面,然後需要做的只是簡單的JMP ESP。

記住,EIP將包含下一條待執行指令的地址,所以此時需要做的是找到包含JMP ESP的地址。我們可以在OLLY(在E標籤頁)中進行查詢。

一個簡單的命令檢索將會返回給我們一個地址。

現在,我們拷貝這個地址:

最後,我們需要做的是,在實行攻擊之後,加入並執行我們的shell程式碼。我們可以用metasploit生成這些shellcode。

現在我們的利用程式碼如下。注意一下案例中CPU的ENDIAN,在EIP暫存器中我們會用到小端格式。

現在,如果我們再次實行攻擊,將會執行我們的shellcode。

好的,現在我們可以生成另外的shellcode來執行不同的任務。

我們可以生成一段反向連線的shell程式碼,來訪問我們的受害主機。

把這行程式碼我們的利用程式碼中,

最後執行利用程式碼:

我們的利用程式碼編寫完成

提示:注意一些特殊字元。如果在緩衝區中間,利用程式碼被截斷,可能是由於一些特殊字元導致的。特殊字元諸如“xa0″、 “|x00″等,會截斷shellcode,你必須通過測試找到這些字元,並且在shellcode中避免用到,可別說我沒提醒過你!

相關文章