|
|
|
| Ответ 010 на задачу N 5.
С условиями задачи можно ознакомится по ссылке.
<html>
<body>
<form method=post enctype=multipart/form-data >
Words checked:
<br /><input type=checkbox name=conv[0] value=STYLE_AS_IS /> as is in dictionary
<br /><input type=checkbox name=conv[1] value=STYLE_LOWER checked /> lowercase style
<br /><input type=checkbox name=conv[2] value=STYLE_UPPER checked /> UPPERCASE style
<br /><input type=checkbox name=conv[3] value=STYLE_NAME /> Name style
<br />
<br /> Your dictionary file if need (if ommited /usr/share/dict/linux.words will be processed)
<br /> You also may to prepend file name by ':' to load it from server side script directory
<br /> i.e. <b>linux.words</b> - upload your client dictionary file linux.words )
<br /> i.e. <b>:linux.words</b> - load linux.words from dir where this script located)
<br /> Dictionary file <input type=file name=dict />
<br /> Md5 hashes list:
<textarea cols=35 rows=5 name=hashlist /
>fb28e9240e83a5264566de844cc45523
437233c74e25fe505293cd2e8ecc2696
06b2d4b91b5c9eaa8c20a1c270f95b3c
e206a54e97690cce50cc872dd70ee896
fbfa6902f089e5a0fa2424bd460ecfd0
cbdb7e2b1ed566ceb796af2df07205a3
67dd612c2e96ae789ee22fffe6e751bd
</textarea>
<br /> Postfix list:
<textarea cols=5 rows=5 name=postfixlist />
5
007
</textarea>
<br /> Time limit: <input name=limit value=60 /> seconds
<br><input type=submit /> </form>
<?php
//---------------------------------------------------------------------- by Trianon ---
// поиск паролей для известных md5-хешей
// метод: подбор по словарю + указанный набор окончаний
// со следующими стилевыми вариациями слов:
define("STYLE_AS_IS", 1); // сЛоВо как написано в словаре
define("STYLE_LOWER", 2); // слово сточными буквами
define("STYLE_UPPER", 4); // слово заглавными буквами
define("STYLE_NAME", 8); // Слово как имя: строчными с первой заглавной
//----------------------------------------------------------------------
global $hashlist, $tries, $start_time;
//----------------------------------------------------------------------
// result($hash, $res) заносит в отчет успешно найденный пароль $res,
// выносит хеш $hash из ключей массива $hashlist
// Возвращается число еще не найденных ключей
// глобальные параметры:
// $hashlist - массив искомый хешей (в ключах)
// $tries - счетчик попыток
// $start_time - время начала перебора (для статистики)
function result($hash, $res)
{
global $hashlist, $tries;
global $start_time;
unset($hashlist[$hash]);
$elapsed = sprintf('%.3f', mytime() - $start_time);
echo("<tr><td>$hash</td><td>$res</td><td>$tries</td><td>$elapsed</td></tr>
");
return count($hashlist);
}
function mytime() //обложка для вещественного time
{ //(ибо get_as_float работает лишь с 5 версии PHP)
list($usec, $sec) = explode(" ", microtime());
return ((float)$usec + (float)$sec);
}
//-----------------------------------------------------------------------
// 1. Вводим исходные данные
if(!isset($_REQUEST) ||!count($_REQUEST) ||!isset($_FILES) ||!count($_FILES))
exit; // если вообще есть что вводить
// 1.1. Стили слов (conv)
$conv = 0;
if( !isset($_REQUEST['conv']) || !is_array($_REQUEST['conv']) )
{
$conv = STYLE_LOWER; // по умолчанию один стиль слов - строчные буквы
echo 'defaulting STYLE_LOWER only selected,<br />';
}
else foreach($_REQUEST['conv'] as $k => $v)
{
echo "$v word style selected,<br />";
$conv |= constant($v); // соберем все стили слов в один битовый набор
}
// 1.2. Набор проверяемых хешей (hashlist)
if(isset($_REQUEST['hashlist']))
{
$list = explode(" ", trim($_REQUEST['hashlist']));
$hashlist = array(); // переносим строки хешей в ключи массива $haslist
foreach($list as $v) $hashlist[trim($v)] = 0;
}
else exit('no hashes in job');
// 1.3. Набор перебираемых окончаний (postfixlist)
$postfixes = array("");
if(isset($_REQUEST['postfixlist']))
{
$list = explode(" ", trim($_REQUEST['postfixlist'])); // переносим строки
foreach($list as $v) $postfixes[]=trim($v); //окончаний в массив $postfixes
}
// 1.4. Файл со словарем (dict)
// если имя начинается с двоеточия - файл берется с сервера
// в противном случае загружается браузером клиента
if(isset($_FILES['dict'])
&& $_FILES['dict']['name'] != '') // если задан файл словаря
{
$dict = $_FILES['dict'];
if($dict['name']{0} == ':') // словарь берется с сервера
{
$dict = substr($dict['name'], 1);
if($dict{0} != '/')
{ // случай относительного пути - путь от каталога со скриптом
$path = $_SERVER['PATH_TRANSLATED'];
$path = substr($path, 0, 1+strrpos($path, '/'));
$dict = $path.$dict;
echo "server version dictionary from file $dict<br />";
}
} else
{
echo "client version dictionary from file {$dict['name']} <br />";
$dict = $dict['tmp_name']; // словарь загружен с клиентской машины
}
}
else
$dict = "/usr/share/dict/linux.words";
// 1.5. Ограничение по времени работы скрипта
if(isset($_REQUEST['limit']))
set_time_limit($_REQUEST['limit']);
// ----------------------------------------------------------------
// 2. подготовка словаря
// 2.1 загрузка из файла
echo "<br />Attempt to load dictionary file $dict1 - ";
$dict1 = @file($dict); $dict2 = array();
if($dict1 == FALSE)
exit('failed ');
echo "success, ". count($dict1). " words loaded <br />";
//----------------------------------------------------------------------
//// словарь сформирован, можно запускать подбор
//----------------------------------------------------------------------
// формируем заголовок отчета
echo("<table><tr><td>hash</td><td>res</td><td>tries</td><td>elapsed</td></tr>
");
$tries = 0; // сбрасываем счетчик
$start_time = mytime(); // засекаем время, необходимое на подбор хешей,
foreach($dict1 as $dv)
{
$v1 = trim($dv);
$s = array();
foreach($postfixes as $pv)
{ // проход учета постфиксов и стилевых вариаций
$v = $v1.$pv;
if($conv & STYLE_LOWER)
$s[strtolower($v)] = 0;
if($conv & STYLE_NAME)
$s[ucfirst(strtolower($v))] = 0;
if($conv & STYLE_AS_IS)
$s[$v] = 0;
if($conv & STYLE_UPPER)
$s[strtoupper($v)] = 0;
}
foreach($s as $k => $sv)
{
++$tries; // проверка всех хешей параллельно
if(isset($hashlist[$rm5=md5($k)]))
if(result($rm5, $k) == 0)
break(2);
}
}
$delta_time = mytime() - $start_time; // потраченное на подбор время
//---------------------------------------считаем статистику
$elapsed = sprintf('%.3f', $delta_time);
$pwd_per_sec = $tries/$delta_time;
$speed = sprintf('%.1f', $tries/$elapsed);
// завершаем отчет
echo("</table>
Total passwords checked: $tries<br>"
."Time elapsed: $elapsed s<br>Check speed: $speed pwd/sec <br>");
if(count($hashlist)) // если найдены не все
{ // выводим оставшиеся хеши
echo( "Unable to detect plaintext "
." with md5 hashes:<br>");
foreach($hashlist as $k => $v) echo( " '$k'<br>");
}
?>
</body>
</html>
|
http://www.softtime.ru/info/task.php?id_article=75 | |
|
|
|
|
|
|
|
для: SoftTime
(10.02.2006 в 17:14)
| | Очень громоздко и хитро, я даже не сразу понял как интерфейсом пользоваться, код производит гнетущее впечатление - тяжело читать и разбираться. Откровенно хакерский стиль :))) | |
|
|
|
|
|
|
|
для: cheops
(13.02.2006 в 00:29)
| | Просто я решал задачу, считая её боевой, а не учебной.
В реальной ситуации типичный учебный скрипт просто ничего не найдет. И никто не подскажет, что пароль [не]строчными буквами набит.
И словарь может потребоваться вовсе не английский линуксовый. И цифирки после слов и вправду могут быть добавлены. И не только цифирки.
С одной стороны стороны, Вы имеете полное право не оценивать ответ, если он тяжелый и непонятный.
С другой, зачем ставить по 2 балла за читабельность и примененные тонкости кода, если Вы его не прочли? Надо ставить 0 0. Оценка времени наверное тоже взята из запуска с умалчиваемыми значениями, да?
К слову сказать, я не хакер. До задачи N4 мне задач подобной тематики решать не приходилось ни разу. Так что стиль не мой. Стиль тоже соответствует задаче. | |
|
|
|
|
|
|
|
для: Trianon
(13.02.2006 в 11:52)
| | Баллы выставляются по числу усилий, которые нужно приложить чтобы прочесть - если сильно понадобится, можно разобрать любой код, вопрос только времени.
Хакерский стиль - это был комплимент :))), это то, что вы называете "боевое" решение. Стиль не отражает личность, программист может использовать различные стили, минималистский, промышленый, обучающий, хакерский - в зависимости от задач, которые должен решать скрипт. Вы для решения выбрали хакерский - закрученный код с интерфейсом. Это не самое плохое решение, хотя если над кодом будет работать команда - это может создавать неудобства. | |
|
|
|