首页
社区
课程
招聘
[原创]一种反检测的Shellcode GetPC方法Flush GetPC
发表于: 2012-8-14 16:59 7922

[原创]一种反检测的Shellcode GetPC方法Flush GetPC

2012-8-14 16:59
7922

Flush GetPC是我们提出的一种新的获取当前指令地址的方法。相比FSTENV和SEH方法,Flush GetPC最主要的特点就是可以避免出现指定特征码。到此为止多态Shellcode中的GetPC、Decoder和Encoded三个部分均能实现特征码的避免,从而导致了特征匹配检测方法在面对新型多态shellcode时彻底失效。
Flush GetPC的原理是利用堆栈栈顶位于Shellcode位置之上(内存低地址)的特点,从栈顶ESP开始向下泛洪,不断写入NOP,并同时调整ESI记录当前泛洪位置,最后Flush GetPC泛洪至自身,结束循环而往下执行。最后ESI为mov byte ptr ds:[esi],0x90指令地址。下图显示了泛洪前后的Flush GetPC代码,泛洪至XOR EAX,EAX后,两条指令被类NOP指令取代(对DH进行ROL操作对Flush GetPC没有影响),继而JE跳转失败而结束循环。

泛洪前:
00012481      8BF4            mov esi,esp
00012483      33C0            xor eax,eax
00012485      C606 90         mov byte ptr ds:[esi],0x90
00012488      46              inc esi
00012489      40              inc eax
0001248A      83F8 01         cmp eax,0x1
0001248D      74 F4           je Test.00012483

泛洪后:
00012481      8BF4            mov esi,esp
00012483      90              nop
00012484      C0C6 06         rol dh,0x6
00012487      90              nop
00012488      46              inc esi
00012489      40              inc eax
0001248A      83F8 01         cmp eax,0x1
0001248D      74 F4           je Test.00012483

Flush GetPC总长14字节,中间没有出现字符串结尾符0x00。


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 6
支持
分享
最新回复 (15)
雪    币: 411
活跃值: (252)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
2
思路不错,不过我认为call+pop一样可以避免出现指定特征码.
比如:
00000000 call 00000007
00000006 nop
00000007 inc eax
00000008 pop ecx

变化有n多种,总不可能发现有call后面有pop就报吧.
2012-8-14 18:20
0
雪    币: 411
活跃值: (252)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
3
如果你要说只是检测的e8 00 00 xx xx这类的短call,那么我还完全可以结合sc特征搜索或是具体漏洞写个自已补丁出来的
e8 00 00 xx xx
2012-8-14 18:33
0
雪    币: 54
活跃值: (40)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
4
call下个地址,然后pop出来,这个特征还是比较明显的,而且E8无法避免,这个的检测已经有人做过了,见中国科学 E辑:  信息科学   2008年 第38卷 第10期 : 《基于动态模拟的多态Shellcode建模与网络层检测》。
2012-8-14 20:31
0
雪    币: 411
活跃值: (252)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
5
麻烦楼上把《基于动态模拟的多态Shellcode建模与网络层检测》发来学习下哩...
2012-8-14 22:17
0
雪    币: 54
活跃值: (40)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
6
呵呵,传到附件了,共同学习。。话说我发现Flush GetPC方法是有问题的,因为“间隔字节数为4的倍数”好像也不能保证,因为栈顶ESP可能不是DWORD对齐的(当然这个好改),主要是Flush GetPC代码第一个字节也不能保证是DWORD对齐。这样泛洪下来可能覆盖的不对。哎,不知道咋整啊
上传的附件:
2012-8-14 23:32
0
雪    币: 54
活跃值: (40)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
7
另外,大家觉得shellcode检测与反检测这块从学术角度到技术角度都有什么可做的呢?老实说现在我觉得反检测很占优,而几乎没有什么好的检测手段。本来想写一篇检测shellcode的论文,写着写着写成了反检测了,各种反检测、多态、反仿真,秒杀各种anormaly detection,APE,Virtual Machine..
2012-8-14 23:38
0
雪    币: 54
活跃值: (40)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
8
改进了一下,改成了按Byte flush了,搞不清当初为啥要按DWORD flush,范2了。22Bytes -> 19Bytes,这个没有对齐限制了吧

00012481      8BF4            mov esi,esp
00012483      33C0            xor eax,eax
00012485      C606 90         mov byte ptr ds:[esi],0x90
00012488      83C6 01         add esi,0x1
0001248B      40              inc eax
0001248C      83F8 01         cmp eax,0x1
0001248F      74 F2           je Xcalc.00012483
00012491      83C6 0F         add esi,0xF
2012-8-15 00:24
0
雪    币: 822
活跃值: (380)
能力值: ( LV12,RANK:310 )
在线值:
发帖
回帖
粉丝
9
好多漏洞shellcode运行时都不是在栈上的
2012-8-15 07:05
0
雪    币: 79
活跃值: (40)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
10
good job 让我想起了SMC
2012-8-15 10:17
0
雪    币: 334
活跃值: (78)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
11
一招秒杀你们: 禁止数据执行
2012-8-16 13:28
0
雪    币: 589
活跃值: (119)
能力值: ( LV11,RANK:190 )
在线值:
发帖
回帖
粉丝
12
正解
2012-8-21 13:24
0
雪    币: 589
活跃值: (119)
能力值: ( LV11,RANK:190 )
在线值:
发帖
回帖
粉丝
13
在栈上的shellcode可以做到尽可能的特殊,也就是说没有通用性,用任何检测方法都是无法检测的,可参考realplayer漏洞的shellcode,另外你的Flush GetPC已经是比较好检测的了,shellcode检测只能针对通用的shellcode
2012-8-21 13:29
0
雪    币: 146
活跃值: (182)
能力值: ( LV13,RANK:220 )
在线值:
发帖
回帖
粉丝
14
lz可以把你写的shellcode发我检测检测

跪求各种神奇shellcode 跪求blackwhite大牛的shellcode
2012-8-30 14:48
0
雪    币: 54
活跃值: (40)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
15
我不知道你说的rp漏洞shellcode是不是就是这篇文章
http://bbs.pediy.com/showthread.php?t=113227
如果是的话,我看了一下,他也是用的Call方法进行的GetPC。
Shellcode检测确实是个很难的问题,即使我不提出这种方法。现在有些论文就是从GetPC入手的,我提出这个方法可以说是把问题变得更难了一些。只有用VM遍历执行才可能检测,但是这是不可能的
2012-9-2 16:56
0
雪    币: 589
活跃值: (119)
能力值: ( LV11,RANK:190 )
在线值:
发帖
回帖
粉丝
16
是特殊的SEH GETPC不是CALL
2012-9-5 11:00
0
游客
登录 | 注册 方可回帖
返回
//