Shellcode入門

Shellcode入門shell

1、shellcode基礎知識編程

  Shellcode實際是一段代碼(也能夠是填充數據),是用來發送到服務器利用特定漏洞的代碼,通常能夠獲取權限。另外,Shellcode通常是做爲數據發送給受攻擊服務器的。 Shellcode是溢出程序和蠕蟲病毒的核心,提到它天然就會和漏洞聯想在一塊兒,畢竟Shellcode只對沒有打補丁的主機有用武之地。網絡上數以萬計帶着漏洞頑強運行着的服務器給hackerVxer豐盛的晚餐。漏洞利用中最關鍵的是Shellcode的編寫。因爲漏洞發現者在漏洞發現之初並不會給出完整Shellcode,所以掌握Shellcode編寫技術就顯得尤其重要。數組

  Shellcode本質上可使用任何編程語言,但咱們須要的是提取其中的機器碼。Shellcode使用彙編語言編寫是最具可控性的,由於咱們徹底能夠經過指令控制代碼生成,缺點就是須要大量的時間,並且還要你深刻了解彙編。若是你想追求速度,C是不錯的選擇。C語言編寫起來較爲省力,但Shellcode提取較爲複雜,不過,一旦寫好模板,就省事許多。服務器

2、用C語言編寫獲取shellcode網絡

1.用於獲取shellcodeC語言代碼編程語言

2.編譯與執行函數

execve(執行文件)在父進程中fork一個子進程,在子進程中調用exec函數啓動新的程序。execve()用來執行第一參數字符串所表明的文件路徑,第二個參數是利用指針數組來傳遞給執行文件,而且須要以空指針(NULL)結束,最後一個參數則爲傳遞給執行文件的新環境變量數組。從圖中能夠,若是經過C語言調用execve來返回shell的話,首先須要引入相應的頭文件,而後在主函數中調用系統調用函數execve;同時傳入三個參數。spa

編譯以後運行結果以下圖3d

爲了以後可以看到反彙編的結果,此次採用的靜態編譯。正常返回shell指針

3.objdump反彙編

那麼要想提取其中的shellcode就須要經過反彙編來獲取相應的彙編代碼或是二進制代碼。

  注:(1)個人這個實踐中scode.cxxyshellcode.c的副本,二者內容一致

      2)編譯時必需要有64位到32位的轉換:-m32,否則後續位數不匹配容易出問題

  

 4.採用gdb查看主函數mainexecve的反彙編結果

 

從反彙編結果來看,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函數調用號就是110xb

  6Shellcode的提取

由上面能夠看出若是想要獲得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存放系統調用號;ebxecxedx分別存放參數部分。

彙編源碼中,首先是第4eax清零;以後第5行壓棧;而後第6行,第7行字符串壓棧,這樣在棧中就構造了以"\x00"結尾的字符串"/bin//sh"。注意這裏的"/bin//sh""/bin/sh"一樣效果。

 此時的ESP指針指向了這個字符串首地址,第8行將該首地址賦給ebx,這樣就有了int 0x80中斷指令的第一個參數ebx;第9行中eax入棧,此時eax值仍是0;第10ebx入棧也就是把字符串"/bin//sh"地址入棧,兩次壓棧,此時棧中就有了字符串地址和一個0,恰好構成了一個指針數組;第11行將該指針數組的地址也就是esp賦給ecx,系統調用的第2個參數ecx中就保持了指針數組的地址;第12edx清零,恰好是系統調用的第3個參數爲零。第13行將系統調用號0xB賦給al,這樣能夠避免出現壞字符。最後調用軟中斷指令執行。

  棧空間的模型:

  

4.shellcode的提取

  

紅框中的機器碼就是該shellcode對應的指令代碼,中間沒有\x00壞字符,這樣在拷貝時也就不會有截斷問題

5.shellcode有效性的驗證

  經過一小段C語言代碼來進行驗證,代碼以下(由上面提取到的shellcode指令代碼而來)

 

  

  調試運行,發現"segmentation fault"

  

  編譯時對該程序啓動棧空間可執行權限,問題解除。

  

相關文章
相關標籤/搜索