0day中的0表示zero,早期的0day表示在软件发行后的24小时内就出现破解版本,现在我们已经
引申了这个含义,只要是在软件或者其他东西发布后,在最短时间内出现相关破解的,都可以叫
0day。 0day是一个统称,所有的破解都可以叫0day。简而言之,0day就是代表还没有公开的漏
洞,nday就是代表已经公开了的漏洞。漏洞开发者在利用0day和Nday时,除了在逃过windos的
自身安全机制的基础上,不可避免的要接触到与杀软对抗的工作,就一般情况来看,如果针对特
定的目标杀软还是有很大可能可以绕过,难点是通用所有的杀软。
另外值得注意的一点,现今主流杀软很多,在通用的前提下,免杀工作往往占用很多时间。
2.1 构造POC
要想利用一个漏洞,首先得构造一个POC样本,构造好的POC,会遭遇杀软的第一层防护,
也就是经常说的静态查杀。
2.2 必要工具
MYCCL,VirTest。
2.3 0day构造
杀软容易检测的地方,比如:会被检测的堆喷代码或者0322中类似判断文件
存在的这类代码,漏洞触发的经典字节码。
重灾区:PE结构的嵌入。
杀软认为危险的函数名或者一些二进制中能看到的字符串。
2.4 Nday的构造
漏洞爆出来时所用的代码已经被“黑名单”。
一些杀软对二进制文件漏洞触发点检测很深入。
2.5 0day 过静态
宗旨:尽量让代码和二进制文件靠近“正常”或者“随机”。
方法:加密,混淆,随机数据,压缩。
2.6 Nday过静态
最理想:通过另外一种方法或者类似方法去重新构造一个样本。
一般时候:可通过前面提到的那些方法使杀软不认识这些文件或代码。
3.1 检测
构造好POC后,运行起来的POC样本能不能过掉杀软正确的触发漏洞走到攻击者的代码,
就是攻击者面临的杀软第二层保护。代表:EMET
3.2 涉及点
堆喷,GS栈保护,ROP,DEP,ASLR,HOOK
3.3 堆喷技术
有些时候攻击者不能预先知道自己的东西出现在什么地方的时候,就需要用到堆喷技术使
恶意代码出现在一定的地址范围内,比如CALL EAX。现在杀软对堆喷都有一定的检测,
所以在堆喷时必须注意一些地方。这里大概总结出了三个方面。
3.4 堆喷地址
杀软中的堆喷地址 。0x0c0c0c0c
堆喷内容的检测。0x41414141
堆喷方法的权衡。
GS栈的保护机制->栈溢出
原理图
性能影响很大,需要编译时设置,只针对一些开发者认为比较重要的模块。
3.5 系统流程
_security_init_cookie
save in _security_cookie
_security_check_cookie
3.6 Bypass GS栈保护
利用未被保护的内存突破GS 。
基于改写函数指针的攻击,如C++虚函数攻击。
针对异常处理机制的攻击。
堆溢出没有保护。
3.7 DEP
DEP(Data Execution Prevention),分为硬件DEP和软件DEP,这里主要讨论软件DEP,DEP
维基百科的解释:数据执行保护,简称“DEP”,英文全称为“Data Execution Prevention”,是
一组在存储器上运行额外检查的硬件和软件技术,有助于防止恶意程序码在系统上运行。”
对攻击者来说,自己的代码必然是通过外部的手段传进去的,所以经常用来放代码的方法,
比如string,数组,在内存中是不可执行的内存页,也就是数据页,必然的,我们在漏洞触发
后紧接着需要改变该内存的属性,这都是可以通过调用函数来实现的。
利用函数:
VirtualProtect,
VirtualAlloc,
NtSetInformationProcess。
杀软中的DEP
杀软在漏洞触发点对DEP的加固一般是通过hook相关函数来实现的,要绕过杀软保护一般情况下
可以直接跳过hook代码或者调用更加底层的函数来实现。
无杀软环境下:
诺顿360环境下:
3.8 ASLR
ASLR的定义:“位址空间配置随机加载(英语:Address space layout randomization (ASLR)),
又称为位址空间布局随机化,是指利用随机方式配置资料位址。一般现代操作系统中都加设这一
机制,以防范恶意程式对已知位址进行攻击。”
ASLR通俗的讲就是伪随机化模块加载地址,这项安全技术主要针对的是ROP,因为ROP是通
过人为的构造,如果要用到的代码在内存中的地址是随机的,那么ROP的部署将不再是那么容易的。
在杀软中的ASLR在win7中的ASLR在每次重启后,加载地址会有一定随机的变化,但是在杀软中加
载地址的随机性更高一些。
3.9 ROP
这里有必要对ROP进行简单介绍,ROP全称是返回导向编程,其字面概念比较晦涩,下面给
出一个图解释一下简单的ROP:
所以ROP是为了突破DEP+ASLR环境。
4.1 杀软
对于主流杀软来说,当漏洞已经成功触发走到攻击者的代码,也就是shellcode时,也许真正的
免杀工作才刚刚开始。
核心点
4.2 举例
现今杀软对于漏洞触发后的行为检测有一些参差不齐的水平。行为检测的比较好的杀软代表:
卡巴斯基(卡巴),比特梵德(bit)。卡巴和bit检测都是在驱动级上,如果想深入了解其行为检测
的细节,需要逆向其驱动。
4.3 行为查杀
这个是一项很笼统的概念,并没有明确规定孰是孰非,而且不同杀软行为查杀的能力也不同,但
是核心思想是扰乱行为和拆分行为,这里举一些例子来说明。
4.4 例1
文档类漏洞中查找文件handle,伪代码如下
add HANDLE,4
…push 0x2014
…CALL SetFilePointer//设置对应句柄读取位置为特定位置
…CALL ReadFile //读取我们设置好的标志。
正常代码中不会存在挨个打开handle去读其中内容的操作。
解决办法:拆分行为
4.5 例2
漏洞的一般流程:释放文件,执行文件
拆分行为,比如:省去其中一步;分开这些步骤(没有验证)
扰乱行为,比如:伪装调用失败;进入函数的方式;dll加载时…
5.1 EMET
返回进程空间是漏洞的最后一步,也就是经常所说的完美退出,一般情况下如果完美恢复堆栈
和寄存器,这步操作是不会受到杀软的阻挡的,但也有例外,比如覆盖异常。覆盖异常会碰到
一些针对该攻击的安全手段,SEHOP,SAFESEH。这个情况主要是针对EMET来说。
5.2 SAFESEH
SAFESEH由于需要编译支持,而且杀软上一般是没有相关设置,要想逃过这个机制只需要有可执行的
堆上的代码就可以绕过,就不阐述了。
5.3 SEHOP特点
SHE handler必须指向non-SafeSEH module
内存页必须可执行
SHE链表不应被篡改,并且位于链表末端的SHE结构必 须为特定值
(next SHE指针值为0xFFFFFFFF, SHE handler也必须为一特定值)
所有的SHE结构必须为4-byte对齐
最后一个SHE结构的handler必须正确指向ntdll中的ntdll!FinalExceptionHandler例程
所有SHE指针必须指向栈中。
5.4 Bypass SEHOP
如果遇到SEHOP,而又要必须用到覆盖异常攻击时,只有一条路可走,就是构造一个伪造的SHE异
常处理链表。
POC
http://baike.baidu.com/item/POC%E6%B5%8B%E8%AF%95
ASLR
http://baike.baidu.com/item/aslr
DEP
http://baike.baidu.com/item/DEP/7694630
Bypass
http://blog.csdn.net/apxar/article/details/10366649
shellcode
http://shell-storm.org/
EMET
https://www.microsoft.com/en-us/download/details.aspx?id=54265