20145325張梓靖 《網絡對抗技術》 PC平臺逆向破解

20145325張梓靖 《網絡對抗技術》 PC平臺逆向破解

  

學習任務

  • shellcode注入:shellcode實際是一段代碼,但卻做爲數據發送給受攻擊服務器,將代碼存儲到對方的堆棧中,並將堆棧的返回地址利用緩衝區溢出,覆蓋成爲指向 shellcode 的地址。
  • Return-to-libc 攻擊實驗:即便棧有不可執行的能力,沒法將shellcode放入堆棧中運行,但咱們卻能夠直接讓漏洞程序調轉到現存的代碼來實現咱們的攻擊。(本次實驗所用的是已經載入內存的 libc 庫中的 system()函數等)
      
      

基礎知識

  • ps -ef | grep pwn1:
      ps:將某個進程顯示出來
      ps:將某個進程顯示出來
      ps參數:-A  顯示全部程序;-e  此參數的效果和指定"A"參數相同;-f  顯示UID,PPIP,C與STIME欄位
      ps顯示進程結果格式:UID PID PPID C STIME TTY TIME CMD
         UID 程序被該 UID 所擁有
         PID 就是這個程序的 ID
         PPID 則是其上級父程序的ID
         C CPU 使用的資源百分比
         STIME 系統啓動時間
         TTY 登入者的終端機位置
         TIME 使用掉的 CPU 時間。
         CMD 所下達的指令爲什麼
      本條命令意爲:查找與pwn1有關的進程,並用-ef格式顯示出來
  • (gdb) attach: GDB能夠對正在執行的程序進行調度,它容許開發人員中斷程序並查看其狀態,以後還能讓這個程序正常地繼續執行。在GDB中使用「attach」命令是一個方法。
  • (gdb) disassemble foo: 反彙編一段內存地址,
  • (gdb) c: 繼續執行被調試程序,直至下一個斷點或程序結束,Continue的簡寫
  • (gdb) x/16x : 使用x命令(examine的簡寫)來查看內存地址中的值。
    * x命令的語法:x/ (n、f、u是可選的參數)
    * n表示單元個數,f表示顯示的進制,u表示每一個單元的大小。
    linux

  • ln -s 源文件 目標文件 :爲某一個文件或目錄在另一個位置創建一個同步的連接
  • chmod u+s 文件 :對文件設置強制位,即SET-UID,能夠使非文件擁有者或文件所屬羣組的用戶具備執行該文件的權限
  • export [-fnp][變量名稱]=[變量設置值] : 設置或顯示環境變量。(好比咱們要常常使用到一個命令時,而這個命令的執行文件又不在當前目錄,這時能夠在代碼中先執行export,即告訴程序,要執行什麼東西時,須要的文件就在這些目錄裏)
  • echo : 在顯示器上顯示一段文字
  • gdb -q : -q用以使得gdb不輸出gdb程序的版本等信息
  • system :是一個函數,用於運行其它外部程序
      
      git

注入Shellcode並執行

  • 先將環境設置爲:堆棧可執行、地址隨機化關閉
    shell

  • 以 anything+retaddr+nops+shellcode 的結構來構造,先估計返回地址所在位置,而且找到 shellcode 所在地址
    sass

  • 要驗證返回地址所在位置以及找到 shellcode 地址,須要使用GDB調試
    * 先運行 20145325pwn1 可執行文件
    bash

  (先不輸入「回車」,在後面的調試過程當中須要繼續運行的時候再回車,到時候就會顯示如圖的字符部分)服務器

* 再找到正在執行的 20145325pwn1 的進程號

*  進入GDB,聯繫上該進程號

*  在 ret 處設置斷點,接着運行到斷點處,顯示當前esp的值並依照此位置顯示接下來的內存地址內容,並由此分析出返回地址位置的正確性以及shellcode的地址

  (紅色方框爲返回地址處,紅色橢圓爲 shellcode 代碼,由此推算出 shellcode 地址爲 「\x31\xd3\xff\xff」)網絡

*  繼續運行,再次檢測是否跳到覆蓋的返回地址所表示的地方

  (如紅框所示,已經能夠確認返回地址是被 \x10\x20\x30\x40 所覆蓋的)ide

  • 將做爲輸入的 input_shellcode 處的 「\x10\x20\x30\x40」 換爲上面所找到的 shellcode 地址 「\x31\xd3\xff\xff」
    函數

  • 執行 20145325pwn1 ,成功注入 shellcode
    學習

  
  

Return-to-libc 攻擊實驗

  • 進入linux32的環境,將地址隨機化關閉,同時使用ln命令,讓 /bin/sh 指向另外一個shell程序(這裏是zsh)(由於原 /bin/bash 有保護措施,即便能調用一個shell,也不能在這個shell中保持root權限)

  • 編寫retlib文件並進行編譯(注意要使堆棧處於不可執行狀態),同時將其設爲 Set-UID 程序

  • 編寫讀取環境變量的程序並進行編譯

  • 編寫攻擊代碼

  • 使用編譯好的 讀取環境變量 程序,獲得/bin/sh的地址

  • 編譯攻擊程序,並經過調試該程序獲得 system 與 exit 的地址

  • 再將攻擊程序中的buf換爲剛剛得到的3個地址

  • 從新編譯攻擊程序

  • 先運行攻擊程序,再運行SET-UID程序,觀察是否成功得到root權限

 成功

  • 嘗試將/bin/sh 從新指向/bin/bash,觀察可否攻擊成功

 居然成功了

  • 又嘗試將/bin/sh 從新指向 /bin/dash ,觀察可否攻擊成功

 又成功了?

  • 按理來講,後2種從新指向後,應該是沒法得到root權限的,但這裏居然都成功了,難道實驗樓環境裏的 /bin/dash 與 /bin/bash尚未保護措施?

  

參考連接

逆向及Bof基礎實踐說明
Return-to-libc 攻擊實驗

相關文章
相關標籤/搜索