Показать сообщение отдельно

  #3  
Старый 13.11.2007, 14:21
DWORD
Участник форума
Регистрация: 24.07.2007
Сообщений: 138
Провел на форуме:
165671

Репутация: 215
По умолчанию

Ну смотри. У тебя там есть такая функция, расшифровывающая пароль:
Код:
function crypting($str,$pas){
	if(strlen($str) % 3==0){
		$intp=0;
		$new_str='';
		$sum_pas=0;
		for($i=0;$i<strlen($pas);$i++)$sum_pas+=ord($pas[$i]);
		for($i=0;$i<(strlen($str)/3);$i++){
			$old_str[$i]=substr($str,3*$i,3);
			if($old_str[$i][0]==='0')$old_str[$i]=substr($old_str[$i],1,2);
			$old_str[$i]=chr($old_str[$i]-(($sum_pas+ord($pas[$intp]))%255));
			$new_str.=$old_str[$i];
			if($intp===strlen($pas)-1)$intp=0;
			else $intp++;
		}
		return $new_str;
	}
}
Согласно твоему алгоритму, в исходном тексте есть две предопределенные последовательности.
Вначале это: "?>" или с большой вероятностью "?><? ", "?><?php " и пр. похожие варианты.
Вконце это: "<?php " или с большой долей вероятности "?> <?php ", "php?> <?php " и пр. похожие варианты.

Вот так можно попробовать восстановить пароль:

Внимание на строку в дешифрующей функции:
Код:
$old_str[$i]=chr($old_str[$i]-(($sum_pas+ord($pas[$intp]))%255));
Нам известны несколько символов исходного текста в начале строки, допустим их 7 ("?><?php"). Назовем код iого символа этой строки бувой С (old_str[$i] из левой части), old_str[$i] из правой части тоже известно (это кусочек шифротеста), назовем его А, $summ_pass это сумма кодов всех символов пароля, назовем ее Х, а ord($pas[$intp]))%255 назовем Y. Из этой строки можно получить такое уравнение:
255*n + С = А - Х - У
группируем известные и неизвестные:
Х + У + 255*n = Q

Где Q = A - C - известно
Это уравнение с тремя неизвестными, каждое неизвестное является целым числом.

Аналогичное уравнение можно получить для каждого из 7и начальных символов шифротекста:

X + Y1 + 255*n1 = Q1
X + Y2 + 255*n2 = Q2
X + Y3 + 255*n3 = Q3
...
X + Y7 + 255*n7 = Q7

В действительности n1...n7 могут принимать только до двух различных значений - n или m (потому что добавление кода одного символа к числу может варьировать целочисленное частное этого числа от деления на 0xFF только лишь в пределах двух значений), количество возможных вариантов матрицы такой системы 2^7.

На самом деле Х это сумма всех Yi где i = 1..Длина_пароля.

С учетом этих замечаний, можно сделать вывод, что пароль длиной не больше 5 символов однозначно восстанавливается из этой системы, т.к. все n1..n7 сводятся к n и m, в итоге получается система из 7 уравнений не больше чем при 7 неизвестных (как решать такие системы, недавно обсуждалось в разделе "написания программ на "С/С++, C#, Delphi, .NET, Asm"). Верность подобранного пароля длиной 5 символов проверяется на последних символах шифротекста, соответствующих так же известным символам исходного текста. Верность пароля длиной меньше 5 символов автоматически проверяется при решении СЛАУ.

Если пароль больше 5 символов, то нужно сделать следущее:
1) Задаться длиной пароля (в цикле она будет перебираться)
2) Пройтись по шифротексту и определить какие по номеру символы пароля участвовали в конце шифротекста при его шифровании (интересуют символы предопределенной конечной последовательности). Включить в СЛАУ эти символы
3) Решить СЛАУ, получив набор независимых решений
4) Устроить перебор независимых решений, получая на их основе зависимые. Анализ дешифрованного текста при этом можно проводить на соответствие печатным символам и на поиск ключевых слов языка PHP.

Вот такой вот небольшой "криптоанализ" позволяет расшифровывать файлы, полученные твоим скриптом!

Последний раз редактировалось DWORD; 13.11.2007 в 14:52..
 
Ответить с цитированием