20164305徐广皓 - Exp1 PC平台逆向破解(5)M
1.逆向及Bof基礎實踐說明
? ? ? ?1.1實踐目標
- 實踐對象:pwn1的linux可執行文件
- 實踐目的:使程序執行另一個代碼(ShellCode)
- 實踐內容:
- 手工修改可執行文件,改變程序執行流程,直接跳轉到getShell函數。
- 利用foo函數的Bof漏洞,構造一個攻擊輸入字符串,覆蓋返回地址,觸發getShell函數。
- 注入一個自己制作的shellcode并運行這段shellcode。
? ? ? ?1.2基礎知識
- 熟悉Linux基本操作
- 能看懂常用指令,如管道(|),輸入、輸出重定向(>)等。
- 理解Bof的原理。
- 能看得懂匯編、機器指令、EIP、指令地址。
- 會使用gdb,vi。
2.直接修改程序機器指令,改變程序執行流程
? ? ? ?知識要求等內容詳見實驗指導,此處不再贅述。
? ? ? ?2.1反匯編查看目標地址
? ? ? ?將pwn1文件復制到主文件夾中,并重命名為20164305(便于后續實踐使用),然后使用反匯編語句?objdump -d 20164305 | more?對其進行反匯編,得到如下結果:
? ? ? ?紅色框中的"call 8048491 "是匯編指令
- 是說這條指令將調用位于地址8048491處的foo函數;
- 其對應機器指令為“e8 d7ffffff”,e8即跳轉之意。
- 本來正常流程,此時此刻EIP的值應該是下條指令的地址,即80484ba,但如一解釋e8這條指令呢,CPU就會轉而執行 “EIP + d7ffffff”這個位置的指令。“d7ffffff”是補碼,表示-41,41=0x29,80484ba +d7ffffff= 80484ba-0x29正好是8048491這個值(當前指令的下一地址+目標地址偏移量=執行下一條指令地址)。
? ? ? ?2.2使用vi修改可執行文件
? ? ? ?想要調用shell,就要將call指令的目標地址由d7ffffff變為c3ffffff(804847d-80484ba的補碼)。
? ? ? ?2.2.1使用vi打開文件并切換數據顯示模式
? ? ? 輸入?:%!xxd?,將文件轉為16進制編碼顯示。
? ? ? ? 2.2.2找到修改位置并完成修改
? ? ? ? 按實驗指導書方法,輸入?/e8d7?找到待修改數據(有的同學的系統可能會提示這是無效地址或者地址不存在,這是因為?e8d7?在十六進制表示時不連續,中間有空格符,可以通過查找?e8?找到?e8d7?位置,如下圖所示)
? ? ? ? ?選中修改位置,完成修改,輸入?:wq?存盤退出。
? ? ? ? ? 2.3查看文件修改情況并運行
? ? ? ? ? 使用?vi?檢查指令是否修改正確
? ? ? ? ?運行程序,發現程序調用shell,內容1完成。
3 .通過構造輸入參數,造成BOF攻擊,改變程序執行流
? ? ? ? 與內容1不同,內容2主要通過構造緩沖區溢出,覆蓋(實際為更改)目標地址達到調用shell的目的。
? ? ? ?? 3.1?確認輸入字符串哪幾個字符會覆蓋到返回地址
? ? ? ? 在做這一步時,我建議先初步看一下實驗指導書里的步驟,然后通過手動輸入不同長度的字符串自行判斷是否覆蓋到返回地址。
? ? ? ? 但不排除第一次就能確認輸入字符串的哪4位可以覆蓋返回地址,比如說......(我是第一次就成功了)
? ? ? ? 輸入?gdb 20164351?,在gdb內輸入指令?r?執行文件,并輸入測試數據(如下圖)。
? ? ? ? ?輸入?info r?查看寄存器信息,通過查詢ascll表,發現eip中存放數據為3444(真的很巧),就可以立即判定哪四位會覆蓋到返回地址。
? ? ? ? ?tips:是3444而不是4443的原因是Linux中棧空間是向下增長的,一個寄存器中的數據是倒序的(應該是這樣)。
? ? ? ? ? 3.2 構造輸入字符串
- 根據內容1中的getshell內存地址,修改輸入字符串(注意要將實際地址反序錄入),然后利用prel構建輸入文件。
- 執行文件,檢查是否調用shell
?
4. 注入Shellcode并執行
? ? ? ? ? ?4.1 準備一段Shellcode
? ? ? ? ? ?shellcode就是一段機器指令(code),具體代碼如下
\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(像linux的shell或類似windows下的cmd.exe),所以這段機器指令被稱為shellcode。
- 在實際的應用中,凡是用來注入的機器指令段都通稱為shellcode,像添加一個用戶、運行一條指令。
? ? ? ? ? ?4.2 準備工作
- 下載execstack并安裝
- 按實驗進行配置
? ? ? ? ? 4.3 構造要注入的payload
? ? ? ? ? ?Linux下有兩種基本構造攻擊buf的方法:
- retaddr+nop+shellcode(惡意代碼小于緩沖區大小)
- nop+shellcode+retaddr(惡意代碼大于緩沖區大小)
? ? ? ? ? ?實驗過程如下(與實驗指導過程一致,只不過寄存器地址不同)
- retaddr+nop+shellcode 構建
- 這里要注意每個人電腦的retaddr不一定與實驗報告一致,要根據自己電腦顯示內容確定retaddr位置。
? ? ? ? ?按照測試后的結果,修改返回地址運行文件,發現與實驗指導相同,shell沒辦法用。按照指導分析原因,發現push指令把payload覆蓋掉了。
? ? ? ? ? ?為什么第一步構建方法不行,我做完第二步才反應過來。
- nop+shellcode+retaddr
? ? ? ? ? 與第一種構建方法類似,找到retaddr(與第一種位置一致),然后將retddr替換成他的下一位構建payload。
? ? ? ? ?結果第二種成功了,那為什么第一種沒有成功,原因在于shellcode的代碼占用空間大于緩存區(以下均為個人理解,望指正)。那緩沖區有多大呢?
? ? ? ? ?我認為在內容2和構建nop+shellcode+retaddr的代碼中已經很明顯了,應該是32字節,而shellcode的代碼長度大約為50字節超過緩沖區大小,導致push指令執行,進而shellcode代碼被清空,無法調用。如果在第二步就留意輸入字符串的長度,那么第三部就會少走一些彎路。
? ? ? ? 實驗收獲:在今后的實驗過程中,不能僅僅按照實驗指導完成實驗,還要理解實驗指導中每一步的含義,才會真正的有所收獲。
? ? ? ? 實驗問題:什么是漏洞?漏洞有什么危害?
? ? ? ? ? ? ? ? ? ? ? ? ?1.漏洞是一種安全策略缺陷。2.漏洞可能會被入侵或者控制,造成信息丟失威脅系統安全。
?
轉載于:https://www.cnblogs.com/zui-luo/p/10497607.html
總結
以上是生活随笔為你收集整理的20164305徐广皓 - Exp1 PC平台逆向破解(5)M的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 计算机应用多媒体设计是学什么的,数字媒体
- 下一篇: 蓝桥杯嵌入式CT117E硬件开发平台经验