20145316許心遠《網絡對抗》第一次實驗拓展:shellcode注入+return-to-libc

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\linux

    準備工做,設置環境

    構造要注入的payload

  • Linux下有兩種基本構造攻擊buf的方法:retaddr+nop+shellcode,nop+shellcode+retaddr。由於retaddr在緩衝區的位置是固定的,shellcode要不在它前面,要不在它後面。簡單說緩衝區小就把shellcode放後邊,緩衝區大就把shellcode放前邊。
  • 實踐證實nop+shellcode+retaddr對於pwn1不是成功的payload,但咱們依然決定往這個坑裏跳一下。手動微笑。shell

    payload結構爲nop+shellcode+retaddr

    1.編寫payload
  • 特別提醒:最後一個字符千萬不能是\x0a。\x0a至關於回車鍵,若回車了下面的操做就作不了了。bash

    2.打開一個新終端(終端2),將payload注入到pwn1中(此處有天坑!!!必定要仔細!!!)
  • 敲好(cat input_shellcode;cat) | ./pwn1後這裏有三種狀態,這三種狀態中只有一種才能讓接下來的實驗順利進行。


  • 答案就是第一種。我作實驗的時候被這裏坑住了好久,一切都正常但到後面查看寄存器的時候上翻了幾十行就是找不到shellcode,問題就出在這裏,你們在這裏千萬不要手滑多敲回車(到下面提示的地方再敲),要否則都得從新來過。
  • 保持終端2中程序的運行狀態。測試

    3.終端1中查詢pwn1進程的UID

    4.gdb調試,進入對應UID端口

    5.反彙編,設置斷點

  • 注意:continue執行的時候,在終端2敲一下回車,終端1中的continue暫停在斷點處。ui

    6.往上查詢找到shellcode,同時找到要覆蓋的地址

  • 要覆蓋的地址(返回地址)是0xffffd300命令行

    7.更改payload,測試,不成功

  • 0xffffd300替換0x01020304
    3d

    payload結構爲retaddr+nop+shellcode

  • 從新構造payload
  • 成功
    調試

    return-to-libc實驗

    配置32位linux環境

  • sudo apt-get update
  • sudo apt-get install lib32z1 libc6-dev-i386
  • sudo apt-get install lib32readline-gplv2-dev日誌

    添加新用戶

  • 由於咱們最後的是要經過看「是否取得root權限」來判斷成功與否的,因此攻擊對象不能是root用戶,要建立一個新用戶。
    code

    設置實驗背景

  • 進入32位環境,關閉地址隨機化,設置zsh程序代替/bin/bash

    在/tmp文件夾下編寫漏洞程序retlib

  • 在root用戶下編譯,關閉棧保護機制。設置SET-UID

    在/tmp文件夾下編寫getenvaddr和exploit

  • getenvaddr用來讀取環境變量
  • exploit用來攻擊
  • 一樣是在root用戶下編譯

    獲取地址並修改exploit

  • 獲取BIN_SH地址
  • 進入gdb設置斷點,調試運行獲取system和exit地址
  • 將上述三個地址修改入exploit.c文件
  • 刪除以前生成的exploit和badfile(個人exploit由於有權限沒法命令行刪除,索性直接在places下面的圖形化界面tmp文件夾裏手動刪除)

    攻擊,成功

  • 先運行exploit再運行retlib便可得到root權限,成功!

相關文章
相關標籤/搜索