Shellcode入門shell
1、shellcode基礎知識編程
Shellcode實際是一段代碼(也能夠是填充數據),是用來發送到服務器利用特定漏洞的代碼,通常能夠獲取權限。另外,Shellcode通常是做爲數據發送給受攻擊服務器的。 Shellcode是溢出程序和蠕蟲病毒的核心,提到它天然就會和漏洞聯想在一塊兒,畢竟Shellcode只對沒有打補丁的主機有用武之地。網絡上數以萬計帶着漏洞頑強運行着的服務器給hacker和Vxer豐盛的晚餐。漏洞利用中最關鍵的是Shellcode的編寫。因爲漏洞發現者在漏洞發現之初並不會給出完整Shellcode,所以掌握Shellcode編寫技術就顯得尤其重要。數組
Shellcode本質上可使用任何編程語言,但咱們須要的是提取其中的機器碼。Shellcode使用彙編語言編寫是最具可控性的,由於咱們徹底能夠經過指令控制代碼生成,缺點就是須要大量的時間,並且還要你深刻了解彙編。若是你想追求速度,C是不錯的選擇。C語言編寫起來較爲省力,但Shellcode提取較爲複雜,不過,一旦寫好模板,就省事許多。服務器
2、用C語言編寫獲取shellcode網絡
1.用於獲取shellcode的C語言代碼編程語言
2.編譯與執行函數
execve(執行文件)在父進程中fork一個子進程,在子進程中調用exec函數啓動新的程序。execve()用來執行第一參數字符串所表明的文件路徑,第二個參數是利用指針數組來傳遞給執行文件,而且須要以空指針(NULL)結束,最後一個參數則爲傳遞給執行文件的新環境變量數組。從圖中能夠,若是經過C語言調用execve來返回shell的話,首先須要引入相應的頭文件,而後在主函數中調用系統調用函數execve;同時傳入三個參數。spa
編譯以後運行結果以下圖3d
爲了以後可以看到反彙編的結果,此次採用的靜態編譯。正常返回shell。指針
3.objdump反彙編
那麼要想提取其中的shellcode就須要經過反彙編來獲取相應的彙編代碼或是二進制代碼。
注:(1)個人這個實踐中scode.c是xxyshellcode.c的副本,二者內容一致
(2)編譯時必需要有64位到32位的轉換:-m32,否則後續位數不匹配容易出問題
4.採用gdb查看主函數main、execve的反彙編結果
從反彙編結果來看,execve函數執行的前一部分首先將向寄存器ebx,ecx,edx中賦值。以後調用了(*0x80e8a90)處的代碼,該處就是_dl_sysinfo_int80,反彙編後發現實際上是經過中斷指令int 0x80進入ring0。也就是說exceve函數是經過調用軟中斷int 0x80進入ring0。
5.驗證int 0x80調用
Shellcode的提取就是要獲取exceve函數調用時的參數及軟中斷調用。經過軟終端加載相應的系統調用號及參數來執行相應的任務。
查看四個寄存器。
前面咱們已經提過了execve系統調用的參數部分。看看上圖的寄存器賦值,第1個參數ebx,恰好是"/bin/sh";第2個參數ecx是一個指針數組,第一個元素是第一個參數地址,第二個元素爲空;第3個參數是edx爲空。最後execve的系統調用號就放在了寄存器eax中=0xb。
而經過查找系統的execve函數調用號就是11(0xb)
6.Shellcode的提取
由上面能夠看出若是想要獲得shellcode就須要將部分指令代碼拼接。組成execve的系統調用以下圖所示。(兩塊紅色區域機器碼拼接)
儘管這樣能夠實現shell返回的shellcode,可是裏面包含裏不少\x00空字符,只要在單獨拷貝shellcode就頗有可能致使shellcode階段而不能正常執行shellcode,須要進行進一步加工,過於麻煩這裏不詳述。
3、用匯編語言形式寫出shellcode
1.編寫彙編源碼,下圖是一個返回shell的彙編源碼
2.編譯、連接、執行
連接過程當中出現問題i386 architecture模式與i386:x86-64模式不匹配,須要多輸入"-m elf_i386"轉換一下
執行以後成功返回shell
3.彙編代碼分析
根據以前int 0x80中斷指令調用形式,要求eax存放系統調用號;ebx、ecx、edx分別存放參數部分。
彙編源碼中,首先是第4行eax清零;以後第5行壓棧;而後第6行,第7行字符串壓棧,這樣在棧中就構造了以"\x00"結尾的字符串"/bin//sh"。注意這裏的"/bin//sh"與"/bin/sh"一樣效果。
此時的ESP指針指向了這個字符串首地址,第8行將該首地址賦給ebx,這樣就有了int 0x80中斷指令的第一個參數ebx;第9行中eax入棧,此時eax值仍是0;第10行ebx入棧也就是把字符串"/bin//sh"地址入棧,兩次壓棧,此時棧中就有了字符串地址和一個0,恰好構成了一個指針數組;第11行將該指針數組的地址也就是esp賦給ecx,系統調用的第2個參數ecx中就保持了指針數組的地址;第12行edx清零,恰好是系統調用的第3個參數爲零。第13行將系統調用號0xB賦給al,這樣能夠避免出現壞字符。最後調用軟中斷指令執行。
棧空間的模型:
4.shellcode的提取
紅框中的機器碼就是該shellcode對應的指令代碼,中間沒有\x00壞字符,這樣在拷貝時也就不會有截斷問題。
5.shellcode有效性的驗證
經過一小段C語言代碼來進行驗證,代碼以下(由上面提取到的shellcode指令代碼而來)
調試運行,發現"segmentation fault"了
編譯時對該程序啓動棧空間可執行權限,問題解除。