[PHP] Обфускация. Смотрим в корень

Сегодня подкинули обфусцированный РНР-скрипт.

<?php
#CrackMe #1 by Boolean
?>
<? $GLOBALS['_736243525_']=Array(base64_decode('YmFzZ' .'T' .'Y0X2RlY29kZQ' .'=='),base64_decode('YmFzZTY0X2RlY' .'29kZQ=='),base64_decode('YmFzZTY0X2RlY29' .'kZQ=='),base64_decode('YmFzZTY0X2' .'R' .'lY2' .'9kZQ' .'=='),base64_decode('Ym' .'F' .'zZT' .'Y0X2RlY' .'2' .'9k' .'ZQ=='),base64_decode('Ym' .'F' .'zZ' .'T' .'Y0' .'X2' .'RlY' .'29kZ' .'Q=='),base64_decode('YmFzZTY0X' .'2RlY' .'2' .'9k' .'ZQ=='),base64_decode('Y' .'m' .'F' .'zZ' .'TY0' .'X2' .'RlY29k' .'Z' .'Q=='),base64_decode('Ym' .'FzZ' .'TY0X2' .'RlY29k' .'ZQ=' .'='),base64_decode('YmFzZ' .'TY0X2' .'R' .'lY' .'29kZQ=='),base64_decode('' .'YmF' .'zZTY0X2RlY29kZ' .'Q=='),base64_decode('YmFzZTY0X2RlY29k' .'Z' .'Q=' .'='),base64_decode('' .'YmFzZ' .'T' .'Y0X' .'2R' .'lY' .'2' .'9' .'kZQ=='),base64_decode('YmFz' .'ZTY0X2R' .'lY' .'29' .'kZQ=='),base64_decode('cG9z'),base64_decode('dWFzb3J0'),base64_decode('YmFzZTY' .'0X2RlY29kZQ=' .'='),base64_decode('' .'cm91bmQ='),base64_decode('c' .'m91bmQ' .'='),base64_decode('cm' .'91bm' .'Q='),base64_decode('cm9' .'1b' .'mQ='),base64_decode('cm91b' .'mQ' .'='),base64_decode('cm91bmQ='),base64_decode('c' .'m91bm' .'Q='),base64_decode('c' .'m91' .'bmQ='),base64_decode('c3Ry' .'cG' .'9z'),base64_decode('Z' .'mdldHN' .'z'),base64_decode('cm91' .'bmQ='),base64_decode('c2' .'9ja2V0X2dl' .'dF' .'9z' .'d' .'GF' .'0dXM='),base64_decode('' .'b' .'X' .'Rfc' .'mFuZA=='),base64_decode('cm91bmQ='),base64_decode('cm' .'91b' .'m' .'Q=')); ?>
<? function _3381216($i){$a=Array('X' .'2NvZGl' .'uZ3' .'dv' .'cmxkXw=' .'=','' .'YzJWemM' .'ybHZib' .'Dl6ZEdGeQ' .'==','ZA==','QT09','Wg==','R1Z' .'t' .'YQ==','' .'VzV' .'s','WQ==','' .'bUZ6Wg=' .'=','' .'VFk=','M' .'Fg' .'=','Mg=' .'=','U' .'mxZMj' .'lr' .'Wl' .'E=','' .'PT0=','','WQ=' .'=','' .'bUZ' .'6','Wg==','VFk' .'=','MF' .'g' .'y' .'UmxZMjlr','WlE' .'9PQ==','W' .'TJ' .'o' .'eQ==','WTI=','aA=' .'=','eQ==','','WTJ' .'oeQ' .'==','' .'WTJoeQ==','WQ' .'==','M' .'mh5','WTJo' .'eQ==','','W' .'TJoe' .'Q' .'==','YzNS' .'e' .'WJH' .'VnU' .'=','WQ==','' .'M' .'mg=','' .'eQ==','','Y' .'jNKa' .'w==','Y0' .'dGemMzZH' .'Zj' .'bVE=','PQ' .'==','Y' .'0dGem' .'MzZHZjb' .'VE' .'9','WTJ' .'o' .'bFky','dHR' .'a','' .'U' .'T0' .'=','PQ==','' .'VUU=','ZG' .'9NR0pYZHl0UQ==','' .'UjJ' .'oc1dWZA==','Uks' .'=','MU' .'J' .'JV' .'W5Ca' .'1' .'Iz','a' .'H' .'NVR' .'3hDU1' .'Y=','' .'Vk' .'Q=','UWtS' .'a' .'mJVWnFZ','VA==','Q' .'XhiRW' .'xEVFhoSg==','Ug=' .'=','' .'MG8xU1V' .'WS' .'2RtSX' .'llR3ha' .'Vg==','elI=','elM=','VWQ=','T2Rs','cEhiSF' .'Zh','T' .'TJS','MlkyMT' .'Rhdw' .'==','M' .'EtURz' .'VL','TVZCR' .'E9U' .'Q' .'mg=','Vw' .'==','' .'Rk' .'p6','V2xRME8=','R' .'X' .'d5YQ=' .'=','R' .'3' .'h' .'a' .'VjFFclV' .'FZE' .'s=','ZGx' .'w','S' .'WF5dA' .'==','UV' .'IwN' .'Q' .'==','c1lt','N' .'VNiR05xT' .'kQ=','aGFiV' .'Gw1WWxOQw==','YUY=','a3o' .'=','' .'VW' .'4' .'=','Qml' .'Na' .'lE=','' .'NQ==','Uw==','V3A' .'z','TDFC' .'VA' .'==','V' .'W1a','Vk1' .'G','' .'WlRW','bXRX','' .'VQ==','d' .'zB' .'LVjN' .'sa1' .'Y=','Rg==','RXhTa3BW','U' .'mx' .'KbVZH','dEdUbEpU','WkdSSlJEZw==','cl' .'NXb' .'EN' .'kR' .'g' .'==','cA==','WVU=','bTlp','TQ==','' .'bA=' .'=','' .'RTU=','U1d4Q1VGV' .'Q==','' .'eFU=','' .'V2xRYW5od1ltN' .'UNN' .'V1JEU' .'WpCbFc=','' .'RUpzVQ=' .'=','' .'R' .'k' .'5L','ZDFs' .'WVRu','cGs=','' .'TWps' .'NVd' .'r','Tk' .'p' .'ad' .'zBLW' .'Q' .'==','bQ==','MUdkRnA=','VU1H' .'bGpS' .'MFo2WQ==','ek5' .'rZG1OdA==','VVdsSlN' .'G','c' .'G9Za2hXYg==','RkJ' .'U' .'U1dsU' .'WFua' .'HBZMmxCZGxCc' .'W' .'VI' .'Qmli' .'a' .'0l4Wg' .'==','RU' .'5' .'D','TUdW','WV' .'Fte' .'FFVMA==','cDZ' .'a','' .'RmRLZA==','' .'R0ZZVVdsSg==','' .'U0Y=','c' .'G' .'9Za' .'2hXY' .'kEwS1' .'U=','Rg=' .'=','TktSR' .'0ZIVm' .'1waA==','' .'ZV' .'Vrcl' .'VF','TTViV' .'0l6Uw' .'==','bg==','' .'Ug=' .'=','UWFuZ' .'D' .'JXVEp' .'XZFc=','' .'Ug' .'==','SFZubF' .'Fhb' .'mQyVw' .'==','VzA1YTJW' .'V' .'U5EaE1NbWd3W' .'Q==','bGQ' .'z' .'S3c9PQ=' .'=','VUVkbw==','TUdKW' .'A==','ZHl0' .'UVIyaHNXVmR' .'S','SzFCS' .'VVuQm' .'tSM2hzV' .'Ud4Qw==','U1ZW' .'R' .'FE=','a1' .'I' .'=','amJV','Wg' .'==','' .'cVlUQXhiRWw=','RA==','VFhoSlIwbzFTVVZL','ZG1J' .'eWU=','R3ha','' .'V' .'npSel' .'NVZE' .'9kbA==','cE' .'hi' .'SA==','' .'Vg=' .'=','YU0' .'yU' .'jI' .'=','WTI' .'xNGF3M' .'EtU' .'Rz' .'VLTVZCRA==','T1RCaFd' .'G' .'Sg==','eg=' .'=','V2w=','UTBP','RXc=','e' .'WFHeFo=','' .'VjE=','RXI=','VUVkS' .'2Q=','' .'bA==','cA==','S' .'WF5' .'d' .'FF' .'SMDVzWW0' .'1U2J' .'H','TnE=','TlZw','aU0' .'x','Vm' .'5Z' .'MjF' .'X','' .'YUdKRF' .'E=','bXBqY' .'lVa' .'cVlUS' .'l' .'dlVWxVZDNa','Wk0=','bFo=','MVp' .'FZ' .'Fdl' .'UT' .'B' .'LVUdwM2R' .'sbHRPV' .'3' .'Rs','' .'VkRR' .'NFRE' .'Sm8=','TU' .'c=','' .'SlhkeXM9','','WTJ' .'obFk' .'y' .'dHRaUT' .'09','WTNK','aFk' .'ydGxa' .'Q' .'0E2UkE9PQ==','X2' .'NvZ' .'GluZ3dv' .'c' .'m' .'x' .'kX' .'w=' .'=','X2' .'NvZGlu' .'Z' .'3dvcmxk' .'X' .'w=' .'=','X2Nv' .'ZGluZ' .'3dvcm' .'xk' .'Xw=' .'=','X2' .'NvZGluZ' .'3dvc' .'mxkXw==','X2N' .'vZ' .'GluZ' .'3dvcmxkXw=' .'=','X2Nv' .'ZGluZ3dvc' .'mxkXw==','X2N' .'vZGl' .'uZ3dv' .'cmxkXw==','X2' .'NvZGlu' .'Z3dvcmxkX' .'w==','X2NvZ' .'G' .'lu' .'Z' .'3dvcmxkXw==','X2N' .'v' .'ZGlu' .'Z3dvc' .'mxkXw==','X2NvZ' .'G' .'lu' .'Z3dv' .'cmxkXw' .'==','ZGZ' .'qaWF' .'3bG' .'t1a3' .'V1ZnM=','' .'bH' .'o=','X2NvZGluZ' .'3dvcmxkXw' .'==','X2' .'NvZGl' .'uZ3dvcmxkXw==','X2Nv' .'ZGl' .'uZ3d' .'vc' .'mxkX' .'w==','' .'aHVh' .'bw==');return base64_decode($a[$i]);} ?>
<? $GLOBALS[_3381216(0)]=Array($GLOBALS['_736243525_'][0](_3381216(1) ._3381216(2) ._3381216(3)),$GLOBALS['_736243525_'][1](_3381216(4) ._3381216(5) ._3381216(6)),$GLOBALS['_736243525_'][2](_3381216(7) ._3381216(8) ._3381216(9) ._3381216(10) ._3381216(11) ._3381216(12) ._3381216(13)),$GLOBALS['_736243525_'][3](_3381216(14) ._3381216(15) ._3381216(16) ._3381216(17) ._3381216(18) ._3381216(19) ._3381216(20)),$GLOBALS['_736243525_'][4](_3381216(21)),$GLOBALS['_736243525_'][5](_3381216(22) ._3381216(23) ._3381216(24)),$GLOBALS['_736243525_'][6](_3381216(25) ._3381216(26)),$GLOBALS['_736243525_'][7](_3381216(27)),$GLOBALS['_736243525_'][8](_3381216(28) ._3381216(29)),$GLOBALS['_736243525_'][9](_3381216(30)),$GLOBALS['_736243525_'][10](_3381216(31) ._3381216(32)),$GLOBALS['_736243525_'][11](_3381216(33)),$GLOBALS['_736243525_'][12](_3381216(34) ._3381216(35) ._3381216(36)),$GLOBALS['_736243525_'][13](_3381216(37) ._3381216(38)));while(round(0+1601+1601)-round(0+1601+1601))$GLOBALS['_736243525_'][14]($_0); ?>
<? function l__0($_1){$_2=Array(_3381216(39) ._3381216(40),_3381216(41),_3381216(42) ._3381216(43) ._3381216(44) ._3381216(45),_3381216(46) ._3381216(47) ._3381216(48) ._3381216(49) ._3381216(50) ._3381216(51) ._3381216(52) ._3381216(53) ._3381216(54) ._3381216(55) ._3381216(56) ._3381216(57) ._3381216(58) ._3381216(59) ._3381216(60) ._3381216(61) ._3381216(62) ._3381216(63) ._3381216(64) ._3381216(65) ._3381216(66) ._3381216(67) ._3381216(68) ._3381216(69) ._3381216(70) ._3381216(71) ._3381216(72) ._3381216(73) ._3381216(74) ._3381216(75) ._3381216(76) ._3381216(77) ._3381216(78) ._3381216(79) ._3381216(80) ._3381216(81) ._3381216(82) ._3381216(83) ._3381216(84) ._3381216(85) ._3381216(86) ._3381216(87) ._3381216(88) ._3381216(89) ._3381216(90) ._3381216(91) ._3381216(92) ._3381216(93) ._3381216(94) ._3381216(95) ._3381216(96) ._3381216(97) ._3381216(98) ._3381216(99) ._3381216(100) ._3381216(101) ._3381216(102) ._3381216(103) ._3381216(104) ._3381216(105) ._3381216(106) ._3381216(107) ._3381216(108) ._3381216(109) ._3381216(110) ._3381216(111) ._3381216(112) ._3381216(113) ._3381216(114) ._3381216(115) ._3381216(116) ._3381216(117) ._3381216(118) ._3381216(119) ._3381216(120) ._3381216(121) ._3381216(122) ._3381216(123) ._3381216(124) ._3381216(125) ._3381216(126) ._3381216(127) ._3381216(128) ._3381216(129) ._3381216(130) ._3381216(131) ._3381216(132) ._3381216(133) ._3381216(134) ._3381216(135) ._3381216(136) ._3381216(137) ._3381216(138),_3381216(139) ._3381216(140) ._3381216(141) ._3381216(142) ._3381216(143) ._3381216(144) ._3381216(145) ._3381216(146) ._3381216(147) ._3381216(148) ._3381216(149) ._3381216(150) ._3381216(151) ._3381216(152) ._3381216(153) ._3381216(154) ._3381216(155) ._3381216(156) ._3381216(157) ._3381216(158) ._3381216(159) ._3381216(160) ._3381216(161) ._3381216(162) ._3381216(163) ._3381216(164) ._3381216(165) ._3381216(166) ._3381216(167) ._3381216(168) ._3381216(169) ._3381216(170) ._3381216(171) ._3381216(172) ._3381216(173) ._3381216(174) ._3381216(175) ._3381216(176) ._3381216(177) ._3381216(178) ._3381216(179) ._3381216(180),_3381216(181),_3381216(182),_3381216(183) ._3381216(184));if((round(0+1477.5+1477.5)^round(0+985+985+985))&& $GLOBALS['_736243525_'][15]($_0,$_1,$_3,$_4,$GLOBALS))l__1($_3);return $GLOBALS['_736243525_'][16]($_2[$_1]);} ?>
<?php $GLOBALS[_3381216(185)][round(0)]();$GLOBALS[_3381216(186)][round(0+0.5+0.5)](M,$GLOBALS['_736243525_'][17](round(0)+round(0+7.5+7.5+7.5+7.5)+round(0+15+15)));if(isset($_POST[l__0(round(0))])){l__1($_POST[l__0(round(0+0.333333333333+0.333333333333+0.333333333333))]);}if(!isset($_SESSION[l__0(round(0+0.666666666667+0.666666666667+0.666666666667))])){$GLOBALS[_3381216(187)][round(0+0.4+0.4+0.4+0.4+0.4)](l__0(round(0+1+1+1)));}else{echo $GLOBALS[_3381216(188)][round(0+0.6+0.6+0.6+0.6+0.6)](l__0(round(0+1.33333333333+1.33333333333+1.33333333333)));}function l__1($_5){$_3=$GLOBALS[_3381216(189)][round(0+1.33333333333+1.33333333333+1.33333333333)](M) .$GLOBALS[_3381216(190)][round(0+1.66666666667+1.66666666667+1.66666666667)](M-$GLOBALS['_736243525_'][18](round(0)+round(0+0.5+0.5+0.5+0.5))) .$GLOBALS[_3381216(191)][round(0+6)](M+$GLOBALS['_736243525_'][19](round(0)+round(0+0.4+0.4+0.4+0.4+0.4))) .$GLOBALS[_3381216(192)][round(0+2.33333333333+2.33333333333+2.33333333333)](M-$GLOBALS['_736243525_'][20](round(0)+round(0+2))) .$GLOBALS[_3381216(193)][round(0+2.66666666667+2.66666666667+2.66666666667)]($GLOBALS['_736243525_'][21](round(0)+round(0+25+25))) .$GLOBALS[_3381216(194)][round(0+9)]($GLOBALS['_736243525_'][22](round(0)+round(0+17)+round(0+5.66666666667+5.66666666667+5.66666666667)+round(0+5.66666666667+5.66666666667+5.66666666667)+round(0+17)+round(0+5.66666666667+5.66666666667+5.66666666667)));while($GLOBALS['_736243525_'][23](round(0)+1090.75+1090.75+1090.75+1090.75)-$GLOBALS['_736243525_'][24](round(0)+872.6+872.6+872.6+872.6+872.6))$GLOBALS[_3381216(195)][round(0+3.33333333333+3.33333333333+3.33333333333)]($_5,$_4,$_5,$_SESSION);$_4=l__0(round(0+5));if($GLOBALS['_736243525_'][25](_3381216(196),_3381216(197))!==false)$GLOBALS['_736243525_'][26]($_0,$GLOBALS,$_4,$_4,$GLOBALS);$_0=$GLOBALS['_736243525_'][27](round(0)+1034.25+1034.25+1034.25+1034.25);(round(0+100.75+100.75+100.75+100.75)-round(0+201.5+201.5)+round(0+37+37+37+37+37)-round(0+46.25+46.25+46.25+46.25))?$GLOBALS['_736243525_'][28]($_3,$_6,$_0):$GLOBALS['_736243525_'][29](round(0+100.75+100.75+100.75+100.75),round(0+1158.75+1158.75+1158.75+1158.75));for($_6=$GLOBALS['_736243525_'][30](round(0)+round(0+0.2+0.2+0.2+0.2+0.2));$_6 <= $GLOBALS[_3381216(198)][round(0+2.2+2.2+2.2+2.2+2.2)]($_3)-$GLOBALS['_736243525_'][31](round(0)+0.2+0.2+0.2+0.2+0.2);$_6++){$_4.=$GLOBALS[_3381216(199)][round(0+6+6)]($GLOBALS[_3381216(200)][round(0+13)]($_3[$_6])-$_6);$_7=_3381216(201);}if($_5==$_4)$_SESSION[l__0(round(0+6))]=l__0(round(0+7));} ?>
<? # CODINGWORLD.RU
?>

Такой формат обфускации мне уже приходилось встречать, посему, если б не личная невнимательность, задача была бы решена довольно быстро. На первый взгляд кажется, что быстро это разобрать невозможно. Но это не так. Первое, что необходимо сделать, это отделить описание переменных и функций от вызывающих и условных конструкций. Вот вызывающая часть:

$GLOBALS[_3381216(185)][round(0)]();
$GLOBALS[_3381216(186)][round(0+0.5+0.5)](M,$GLOBALS['_736243525_'][17](round(0)+round(0+7.5+7.5+7.5+7.5)+round(0+15+15)));
if(isset($_POST[l__0(round(0))])){
	l__1($_POST[l__0(round(0+0.333333333333+0.333333333333+0.333333333333))]);
}
if(!isset($_SESSION[l__0(round(0+0.666666666667+0.666666666667+0.666666666667))])){
	$GLOBALS[_3381216(187)][round(0+0.4+0.4+0.4+0.4+0.4)](l__0(round(0+1+1+1)));
}
else{
	echo $GLOBALS[_3381216(188)][round(0+0.6+0.6+0.6+0.6+0.6)](l__0(round(0+1.33333333333+1.33333333333+1.33333333333)));

Всего несколько строк кода… Но понятного тут мало. А что если заменить это на более привычные вещи? Ведь есть же в массиве $GLOBALS индекс, который есть результатом выполнения функции _3381216(185)? Есть. Значит, можно заменить

$GLOBALS[_3381216(185)][round(0)]();

на

echo($GLOBALS[_3381216(185)][round(0)]);

и мы увидим на экране session_start. Ну теперь уже немного понятнее. Заменив таким образом все, что можно, мы получим

session_start();
define('M', round(60));
 
if(isset($_POST['password'])) {
	l__1($_POST['password']);
}
if(!isset($_SESSION['checkme'])) {
	echo('<html><head><title>PHP CrackMe #1 by Boolean, codingworld.ru</title></head><body><center><form action="'.$_SERVER['SCRIPT_NAME'].'" method="POST"><input type="password" name="password" value=""><br /><input type="submit" value="Check"></form></center></body></html>');
}
else {
	echo '<html><head><title>PHP CrackMe #1 by Boolean, codingworld.ru</title></head><body><center>You real cracker!</center></body></html>';
}

Видим, что данные из формы передаются в функцию l__1. Значит надо разобрать ее код, потому что ответ там.

function l__1($_5){$_3=$GLOBALS[_3381216(189)][round(0+1.33333333333+1.33333333333+1.33333333333)](M) .$GLOBALS[_3381216(190)][round(0+1.66666666667+1.66666666667+1.66666666667)](M-$GLOBALS['_736243525_'][18](round(0)+round(0+0.5+0.5+0.5+0.5))) .$GLOBALS[_3381216(191)][round(0+6)](M+$GLOBALS['_736243525_'][19](round(0)+round(0+0.4+0.4+0.4+0.4+0.4))) .$GLOBALS[_3381216(192)][round(0+2.33333333333+2.33333333333+2.33333333333)](M-$GLOBALS['_736243525_'][20](round(0)+round(0+2))) .$GLOBALS[_3381216(193)][round(0+2.66666666667+2.66666666667+2.66666666667)]($GLOBALS['_736243525_'][21](round(0)+round(0+25+25))) .$GLOBALS[_3381216(194)][round(0+9)]($GLOBALS['_736243525_'][22](round(0)+round(0+17)+round(0+5.66666666667+5.66666666667+5.66666666667)+round(0+5.66666666667+5.66666666667+5.66666666667)+round(0+17)+round(0+5.66666666667+5.66666666667+5.66666666667)));while($GLOBALS['_736243525_'][23](round(0)+1090.75+1090.75+1090.75+1090.75)-$GLOBALS['_736243525_'][24](round(0)+872.6+872.6+872.6+872.6+872.6))$GLOBALS[_3381216(195)][round(0+3.33333333333+3.33333333333+3.33333333333)]($_5,$_4,$_5,$_SESSION);$_4=l__0(round(0+5));if($GLOBALS['_736243525_'][25](_3381216(196),_3381216(197))!==false)$GLOBALS['_736243525_'][26]($_0,$GLOBALS,$_4,$_4,$GLOBALS);$_0=$GLOBALS['_736243525_'][27](round(0)+1034.25+1034.25+1034.25+1034.25);(round(0+100.75+100.75+100.75+100.75)-round(0+201.5+201.5)+round(0+37+37+37+37+37)-round(0+46.25+46.25+46.25+46.25))?$GLOBALS['_736243525_'][28]($_3,$_6,$_0):$GLOBALS['_736243525_'][29](round(0+100.75+100.75+100.75+100.75),round(0+1158.75+1158.75+1158.75+1158.75));for($_6=$GLOBALS['_736243525_'][30](round(0)+round(0+0.2+0.2+0.2+0.2+0.2));$_6 <= $GLOBALS[_3381216(198)][round(0+2.2+2.2+2.2+2.2+2.2)]($_3)-$GLOBALS['_736243525_'][31](round(0)+0.2+0.2+0.2+0.2+0.2);$_6++){$_4.=$GLOBALS[_3381216(199)][round(0+6+6)]($GLOBALS[_3381216(200)][round(0+13)]($_3[$_6])-$_6);$_7=_3381216(201);}if($_5==$_4)$_SESSION[l__0(round(0+6))]=l__0(round(0+7));}

Почти все тело функции — это подсчеты. Но в самом конце есть сравнение if($_5==$_4). $_5 — это то, что мы ввели в поле формы, а вот $_4 — это какая-то величина, с которой сравнивается введенное значение. Перед сравнением ставим echo($_4); и мы получаем наш ключ! Вот и все. Это оказалось не таким страшным 🙂

,

3 комментария
  1. xhugo сказал(а):

    э!
    Кронус гад))
    Не мог протянуть немного чтоб люди головой подумали..

  2. Boolean сказал(а):

    Зачотно! 🙂

  3. KronuS сказал(а):

    Я узнавал, было ли это задание частью какого-то квеста.
    Мне сказали, что нет. Потому и выложил.

Оставить комментарий

Top ↑ | Main page | Back