前言
最近D盾更新了,在某司某圈也看到了不少免杀d盾免杀狗的一句话帖子
但是基本上只要放出来不到两天时间就加入查杀全家桶.最近一直在造各种车轮子
就想着其实可以写个脚本利用异或来fuzz出指定的字符
然后拼接出assert或者create_function等函数,来对抗waf的检测.
思路及实现
首先如何fuzz的问题
先讲一个离散数学中的概念叫可逆 ,异或的运算就是具有可逆性的.
具体什么意思呢,就是说若a^b=c,则有b^c=a
所以只要把需要拼凑出来的字符串a跟随机取出来的符号b异或,然后出来的结果c就是需要跟b异或的内容.
举个例子
我们来echo一下字符a跟符号*异或的结果
![20017676-ed68a4f597640c2d.png](https://i-blog.csdnimg.cn/blog_migrate/f4736901cf49410a6af980f12cc44379.png)
是大写字母K
![20017676-d44ed90e1b815c87.png](https://i-blog.csdnimg.cn/blog_migrate/54bd13eaa507b9c6e3d07d4a05ebf2fd.png)
然后把大写K跟*异或
![20017676-55e318f85e83daad.png](https://i-blog.csdnimg.cn/blog_migrate/5941c3e0eb424fc2cefed0d19b384190.png)
![20017676-74617bc0cf97a2a8.png](https://i-blog.csdnimg.cn/blog_migrate/e3fda26df68de6620f64814a0e6be97e.png)
就出来了我们想要的a
那么也就是
a=K^*
但是在写的过程中问题来了
很多时候异或出来的字符是不可见的小方块
![20017676-86cdcbed55c0d1b0.png](https://i-blog.csdnimg.cn/blog_migrate/09f598d1b1bf78c82a8551d3e8f939a7.png)
![20017676-b7a48483cf2e9e7c.png](https://i-blog.csdnimg.cn/blog_migrate/290801da9058075325a38038834f8d7a.png)
就需要把它编码
看了以前有一篇文章是用url编码
但是在实现过程中发现url编码也有一定概率出现不可表示的字符
那就开开心心上hex吧
最终成功拼接出来了assert
![20017676-3332023077a8445d.png](https://i-blog.csdnimg.cn/blog_migrate/91a11eceed82a692b74be66da260a8df.png)
接下来就是写个字符串池子,用来存特殊符号,然后随机取出来进行异或,拼接想要的字符.
![20017676-6f72510b86c4edc8.png](https://i-blog.csdnimg.cn/blog_migrate/c6260c41e0f2c6fb208303279072d36d.png)
把它封装成函数
可以设置需要异或的字符串长度
![20017676-863a453196893ab5.png](https://i-blog.csdnimg.cn/blog_migrate/66a6212c33cf190c5235c4be551085fd.png)
其实也可以用中文甚至emoji表情来异或,但是考虑到乱码还有不同系统对表情的支持不同,就算了.
取出拼接好的assert,把get的数据传进去,就成了下面这样
![20017676-dcbf205728bae37b.png](https://i-blog.csdnimg.cn/blog_migrate/400bf19fa16e3930f28a9f34bf28d191.png)
哈,看来可以使用啦
![20017676-49b9e529ba77e1fc.png](https://i-blog.csdnimg.cn/blog_migrate/1c174c584c85cb3164170dd46e12fabc.png)
接着是调用的问题,其实到了这个地步
不管你什么d盾安全狗已经认不出来函数里面写的什么意思了
但是他会根据函数的调用来检测拦截
如果这个时候直接调用的话会爆一级可疑函数.
![20017676-eb26d3aad48c029b.png](https://i-blog.csdnimg.cn/blog_migrate/48312db6f7603ba5324cb61526ba36a0.png)
既然做免杀肯定要0级了啦
放到类里面再调用就好了
![20017676-e152b210c8edd02b.png](https://i-blog.csdnimg.cn/blog_migrate/3882bf23c2dfe49f4dbb63dc5c59eeac.png)
![20017676-72971ba23aca95d4.png](https://i-blog.csdnimg.cn/blog_migrate/bcf56808e2c4eb1a8b1ab16939b90600.png)
接下来就是造轮子了
在脚本中为了增大waf识别的难度 类名方法名也随机化了.
使用方法
![20017676-4bf66e683bbfa7ec.png](https://i-blog.csdnimg.cn/blog_migrate/a3081f3bbb26a80c6be55000e9a3d4ca.png)
![20017676-6fd258c6406927c2.png](https://i-blog.csdnimg.cn/blog_migrate/4792f7589b51b781f58827536b791d2a.png)
右键查看生成的源码
![20017676-58c4ce1f9a321d91.png](https://i-blog.csdnimg.cn/blog_migrate/706d912bfd2f91e31554633a7716f125.png)
已经保存到同目录下1.php里面了
![20017676-e96b2c89ca7b50f3.png](https://i-blog.csdnimg.cn/blog_migrate/7856e0005756220a572edc5cadfca362.png)
生成了十几个
附上过D截图
![20017676-3684918bcbb3663f.png](https://i-blog.csdnimg.cn/blog_migrate/abde8d264bcfc781ed6fe5e0d870dfd3.png)
最后
脚本特点有三个
一利用特殊符号异或达到迷惑waf的目的,并且因为每一次的拼接都是随机生成的,所以单单一个文件进了特征库也不用担心
二是利用类调用,类名函数名随机化,杀软分析起来可能跟普通的文件没有什么区别
三是没有assert eval create_function 等这些关键字,更为隐蔽.
因为是随手写的,所以代码比较糙,不过不要在意这些细节……
只是提供了一个思路,其实大马也可以像这样写个免杀模版,下一篇文章再讲吧
虽然都是随机化,也没有assert eval 这种关键字,但是用的人多了当然脚本的免杀性也失效了,可以关注我的github:
以后更新的免杀脚本都会放在上面.