Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Ответ 010 на задачу N 5
 
 автор: SoftTime   (10.02.2006 в 17:14)   письмо автору
 
 

Ответ 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($path01+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

   
 
 автор: cheops   (13.02.2006 в 00:29)   письмо автору
 
   для: SoftTime   (10.02.2006 в 17:14)
 

Очень громоздко и хитро, я даже не сразу понял как интерфейсом пользоваться, код производит гнетущее впечатление - тяжело читать и разбираться. Откровенно хакерский стиль :)))

   
 
 автор: Trianon   (13.02.2006 в 11:52)   письмо автору
 
   для: cheops   (13.02.2006 в 00:29)
 

Просто я решал задачу, считая её боевой, а не учебной.
В реальной ситуации типичный учебный скрипт просто ничего не найдет. И никто не подскажет, что пароль [не]строчными буквами набит.
И словарь может потребоваться вовсе не английский линуксовый. И цифирки после слов и вправду могут быть добавлены. И не только цифирки.

С одной стороны стороны, Вы имеете полное право не оценивать ответ, если он тяжелый и непонятный.
С другой, зачем ставить по 2 балла за читабельность и примененные тонкости кода, если Вы его не прочли? Надо ставить 0 0. Оценка времени наверное тоже взята из запуска с умалчиваемыми значениями, да?

К слову сказать, я не хакер. До задачи N4 мне задач подобной тематики решать не приходилось ни разу. Так что стиль не мой. Стиль тоже соответствует задаче.

   
 
 автор: cheops   (13.02.2006 в 14:03)   письмо автору
 
   для: Trianon   (13.02.2006 в 11:52)
 

Баллы выставляются по числу усилий, которые нужно приложить чтобы прочесть - если сильно понадобится, можно разобрать любой код, вопрос только времени.
Хакерский стиль - это был комплимент :))), это то, что вы называете "боевое" решение. Стиль не отражает личность, программист может использовать различные стили, минималистский, промышленый, обучающий, хакерский - в зависимости от задач, которые должен решать скрипт. Вы для решения выбрали хакерский - закрученный код с интерфейсом. Это не самое плохое решение, хотя если над кодом будет работать команда - это может создавать неудобства.

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования