Уважаемые коллеги.
Нашел свои старые пробы реверса, к сожалению не последняя версия.

Уже не очень точно помню все детали, эксперимент проводился в 2012 году, но по мере копания в коде они всплывают всё чётче.

Предупреждение: Дальнейший код вырван из контекста, описание его работы сделано по памяти и может содержать ошибки, приведен только в познавательных целях.


Вот так готовились данные для обучения и тестирования нейросети. Сначала генерировались строки такого вида, они представляют собой искомый результат:

spins : 0; server code word : 74b0dc5166334873643c9869327b23c6
spins : 1; server code word : 46e87ccd238e1f29625558ec2ae8944a
spins : 2; server code word : 79e2a9e341b71efb2eb141f2507ed7ab
spins : 3; server code word : 4db127f8122008545bd062c2515f007c
spins : 4; server code word : 140e0f7666ef438d1190cde71f16e9e8


Затем примерно так из них получались хэши для обучения нейронной сети.

FILE *fp;
sha256_context stx;
int ss,zz,yy,ii,jj,zzi;
unsigned long int pdata;
fp = fopen("data_src", "rb");
    if(!fp) return 1; // bail out if file not found
  while(fgets(str,sizeof(str),fp) != NULL)
  {
zz=0;
    // strip trailing '\n' if it exists
      int len = strlen(str)-1;
      if(str[len] == '\n') 
	str[len] = 0;
sha256_starts( &stx );
sha256_update( &stx, (uint8 *) str, strlen( str ) );
sha256_finish( &stx, sha256sum );
zz=stx.zzz;

Что давало на выходе примерно следующее:

d34453f3c04552ee19cb6734ab71ad124710cfc98401570f73f65cb8cfa2a64d
6cc8ca5b918d1a22d5141494ad08b76a6c67cd5f649744f80d2fad4916b2b6d9
f89e9fd9609099b22924a77a5c8122c06118608c4287fca1cdafe5827249bce7
35280fd1e2289488828004682679452a070ccd90c12072fcb904529ab18e3f9d
1112c4cffb617c835874446f13c4d7d29fa091ba7ac996b776998f89dedffcc1
02e0521aae2d4ecdeb4482bda545bb222e1280ec1f580d5d23e29fb719252f70

Потом всё это разворачивалось побитно:


// printf("\n\n\nSUM=");
// делаем строку обработанную sha256 двоичным кодом
printf ("%d 512 512",zz);
zf(str1);
for( j = 0; j < 32; j++ )
	{
	  sprintf(str1,"%s%s",str1, ui2bin(sha256sum[j]));
	}
//дополняем строку до 512 бит
while(strlen(str1)<512) { sprintf(str1,"%s%s",str1,"0"); }
//printf("%s\n",str1);        
jj=0; ii=0; // делаем строку обработанную sha256 двоичным кодом с пробелами
while(str2[jj]=str1[ii])
{ 
  ii++; 
  jj=jj+2; 
  str2[jj-1]=*" ";
} 
printf("%s",str2);
// str2 - результат sha2 побитно через пробел
//
printf("\n");
//

Результат работы в таких:

855 1408 1408 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 1 1 0 0 1 1 1 0 0 0 1 0 1 1 1 1 0 0 0 1 1 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 1 1 0 0 1 1 1 0 0 0 1 0 1 1 1 1 0 0 0 1 1 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 1 0 1 0 0 0 1 1 1 1 1 0 1 1 1 1 0 0 1 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 1 0 1 0 0 0 1 1 1 1 1 0 1 1 1 1 0 0 1 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 1 1 0 1 0 1 1 0 0 1 1 1 1 0 1 0 0 1 1 0 1 1 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 1 1 0 1 0 1 1 0 0 1 1 1 1 0 1 0 0 1 1 0 1 1 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 1 1 1 1 0 0 0 0 1 1 0 1 1 1 1 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 [...]

файлах скармливались нейронной сети как обучающая и тестовая выборки.
использовалась библиотека FANN, пробовал разные нейронки.
Результат безусловно был, но был неоднозначным. Полностью восстановить оригинальный текст не удалось.
Однако иногда проскакивали фрагменты части сторок довольно точно восстановленные.
Думаю у этой задачи есть решение, только для его нахождения нужно еще прикладывать усилия.
Например, имеет смысл подавать на вход сети при обучении все внутренние переменные алгоритма хэширования. Имеет также смысл запустить конкурентные сети и научить еще одну сеть распознавать результат работы консилиума.
Эти любопытные эксперименты можно провести сейчас гораздо проще, чем 2012 году.
С появлением таких инструментов как Python c Tensorflow, sklearn numpy, scipy и сокровищницей репозитория всё это стало гораздо проще проверять.

Комментарии (23)


  1. j_wayne
    20.09.2018 08:47
    +2

    Прошу прощения, но это больше похоже на какой то gist. На статью не тянет, увы.


    1. digger3d Автор
      20.09.2018 11:39

      Если интересно — будет и статья. Зацепилась тема просто.


    1. digger3d Автор
      21.09.2018 00:07

      как теперь?


  1. OKyJIucT
    20.09.2018 10:00
    +1

    Напомнило «Купите подписку, чтобы посмотреть полную версию.» с Дождя))


    1. digger3d Автор
      20.09.2018 11:38

      Да, смешно. Но 20% аудитории интересно. Результаты эксперимента всегда интересны. А навеяло коммкентариями пользователей в теме.


      1. fedorro
        20.09.2018 12:00

        Сдается что результаты эксперимента показали что работает такая сеть не лучше чем генератор случайных чисел. А так да — продолжайте, я бы не отказался от сеточки, которая восстанавливает файлы по хэшам torrent-файлов)


        1. digger3d Автор
          20.09.2018 12:32

          если таких файлов много, файл меньше 256 байт и в нем есть известный и достаточно большой, повторяющийся кусок — то есть вероятность, что можно восстановить =)


          1. fedorro
            20.09.2018 13:24

            Не, мелкие не интересно, вот если бы Убунту, например) А ещё есть вероятность получить другой файл с таким же хэшем.


            1. digger3d Автор
              20.09.2018 13:31

              =) убунту проще скачать, а коллизия да. только я не слышал чтобы в sha256 коллизии находили.


              1. fedorro
                20.09.2018 13:39

                Ну это пока легче, да и вещи побольше бывают, и без раздающих, а ещё можно иметь архив-коллекцию всех версий Убунту на одной флэшке. А коллизии неизбежны при любом объеме файла большего 256 бит (а не байт), для SHA256, причем их количество быстро возрастает с увеличением объема файла.


                1. digger3d Автор
                  20.09.2018 13:46

                  Да, конечно бит, руки быстрее головы =)
                  И да, хеши если больших файлов — коллизий не избежать. Задача совсем не про файлы изначально ;)


          1. saipr
            21.09.2018 15:17

            Т.е. любой пароль восстановите и тем более PIN-код смарт-карты?


    1. digger3d Автор
      20.09.2018 23:45

      исправил


    1. digger3d Автор
      20.09.2018 23:46

      теперь лучше? осталось только ссылку на гитхаб дать


  1. usdglander
    20.09.2018 11:37

    Реверс хэша с помощью нейронной сети? Оригинально!
    К сожалению лавинный эффект делает абсолютно бессмысленным такой подход.


    1. digger3d Автор
      20.09.2018 11:40

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


      1. usdglander
        20.09.2018 12:22

        «Некоторые ограниченные условия» — это радужные таблицы. :)


        1. digger3d Автор
          20.09.2018 12:33

          примерно так, входные ограничения описал в ответе fedorro


  1. digger3d Автор
    20.09.2018 13:34

    Ой, простите, снес комментарий про хэши в вордпресс случайно. В вордпрессе и так дыр достаточно, там проще найти другие уязвимости.


  1. digger3d Автор
    20.09.2018 13:53
    -1

    Что-то мне в карму минусов насовали, не понятно за что.


    1. KaneUA
      20.09.2018 20:28

      Отмазка: Дальнейший текст может содержать ошибки, никаких гарантий его работоспособности и безопасности я не даю.


      1. digger3d Автор
        20.09.2018 22:42

        формат такой, про взлом sha256 как еще можно написать? ну ладно, могу попробовать быть поакадемичнее…


        1. KaneUA
          21.09.2018 04:20

          Нашел свои старые пробы реверса, к сожалению не последняя версия.

          Причём тут академичность? У вас первые три абзаца о том, что «что-то наковырял у себя из 2012, код вне контекста, не обязан работать, и вообще не помню местами о чём там». Тут дело в вашем безразличии. Какое отношение должно быть у сообщества на пост, который прямо говорит обо всём этом? Это всё интересно, но не в этом случае. Не видно приложенных усилий, здесь просто «я накопал старое своё, вот смотрите».