Сейчас на форуме: bezumchik, tyns777, Lohmaty (+7 невидимых)

 eXeL@B —› Вопросы новичков —› Crackme с hash
Посл.ответ Сообщение

Ранг: 14.3 (новичок), 5thx
Активность: 0.070
Статус: Участник

Создано: 05 июня 2019 05:48 · Поправил: RoKZaR
· Личное сообщение · #1

Доброго времени! Копаю крякми где пароль хэшируется и сравнивается с готовым значением. Можно ли как то получить пароль не полным перебором. Сразу говорю длина имени до 20 символов. Код и ссылки ниже. Мой метод перебора тоже.
Перебор:
Code:
  1. #define _CRT_SECURE_NO_WARNINGS
  2.  
  3. #include <iostream>
  4. #include <fstream>
  5. #include <windows.h>
  6. #include <string>
  7. #include <vector>
  8.  
  9.  
  10. using namespace std;
  11. string name;
  12. vector <char> bytename;
  13.  
  14. int sumBName = 0;
  15. int RESULT = 0;
  16. int Acc1 = 0;
  17. int Acc2 = 0;
  18. int Acc3 = 0;
  19. int Acc4 = 0;
  20. int namelen = 0;
  21. int WordNum = 0;
  22.  
  23.  
  24. int hashfunc(string name) {
  25.  
  26.          sumBName = 0;
  27.          RESULT = 0;
  28.          Acc1 = 0;
  29.          Acc2 = 0;
  30.          Acc3 = 0;
  31.          Acc4 = 0;
  32.          namelen = 0;
  33.  
  34.          vector<char>bytename(name.begin(), name.end());
  35.          namelen = name.size();
  36.          int Counter2 = 0;
  37.          int Counter = 0;
  38.          while (Counter < namelen) {
  39.                  sumBName = sumBName + bytename[Counter];
  40.                  Counter = Counter + 1;
  41.          }
  42.          Counter = 0;
  43.          while (Counter < namelen) {
  44.                  Acc1 = (Acc1 + bytename[Counter]) * sumBName ^ 0x9876;
  45.                  Counter = Counter + 1;
  46.          }
  47.          Counter = 0;
  48.          while (Counter < namelen) {
  49.                  Acc2 = (Acc2 + (bytename[Counter] ^ 0xffU) ^ Acc1) + 0xabcd123;
  50.                  Counter = Counter + 1;
  51.          }
  52.          RESULT = sumBName * 0x4d2;
  53.          Counter = 0;
  54.          while (Counter < sumBName) {
  55.                  Acc4 = Counter + Acc2 ^ sumBName ^ 0x4d200;
  56.                  RESULT = (Counter + 0x1234abU ^ RESULT + Counter ^ 0x50f00aa2) + Acc4 * Acc4 + -0xaaf;
  57.                  Counter2 = 0;
  58.                  while (Counter2 < namelen) {
  59.                         Acc3 = (RESULT * namelen - namelen ^ Counter2) - Acc1;
  60.                         RESULT = Acc3 * Acc3 ^ Acc1;
  61.                         Counter2 = Counter2 + 1;
  62.                  }
  63.                  Counter = Counter + 1;
  64.          }
  65.          return RESULT;
  66. }
  67.  
  68. inline void keep_window_open()
  69. {
  70.          cin.clear();
  71.          cout << "\nPlease enter a character to exit\n";
  72.          char ch;
  73.          cin >> ch;
  74.          return;
  75. }
  76.  
  77. int main()
  78. {
  79.          setlocale(LC_ALL, "Russian");
  80.          SetConsoleCP(1251);
  81.          SetConsoleOutputCP(1251);
  82.  
  83.          ifstream filepass("pass.txt");
  84.          while(!filepass.eof()){
  85.                  getline(filepass, name);
  86.                  hashfunc(name);
  87.                  WordNum += 1;
  88.                  if (RESULT == 0xcd65ab89 || RESULT ==0xa904a4ec || RESULT ==0xeca404a9 || RESULT == 0x89ab65cd) {
  89.                         cout << name << "=" << RESULT << "\n";
  90.                  }
  91.          }
  92.  
  93.          cout <<"BAD RESULT \n";
  94.          keep_window_open();
  95.          
  96. }


Ссылка на крякми: https://dropmefiles.com/yjP4R
Сильно не пинайте только постигаю азы программирования на плюсах и работаю с хэшами тоже




Ранг: 271.2 (наставник), 331thx
Активность: 0.321.49
Статус: Участник

Создано: 05 июня 2019 05:58
· Личное сообщение · #2

32 бита всего, пусть и с умножением, а на входе 63 в 20й степени (это если только английские символы и цифры). В чем проблема перебрать?

-----
2 оттенка серого




Ранг: 14.3 (новичок), 5thx
Активность: 0.070
Статус: Участник

Создано: 05 июня 2019 06:05
· Личное сообщение · #3

Тогда как можно найти коллизию к этому хэшу? Если без приколов. Только начинаю и хочу разобраться




Ранг: 271.2 (наставник), 331thx
Активность: 0.321.49
Статус: Участник

Создано: 05 июня 2019 06:48 · Поправил: f13nd
· Личное сообщение · #4

RoKZaR пишет:
Тогда как можно найти коллизию к этому хэшу?

Искать и найти, полным перебором. У тебя многообразие на входе гораздо больше, чем на выходе, коллизий должен быть гориллион целый.

Немного оптимизировал твой алгоритм, правда за 10 минут ничего не нашлось:
Code:
  1. #include <stdlib.h>
  2. #include "stdafx.h"
  3.  
  4. unsigned int hashfunc(unsigned char *bytename){
  5.          unsigned int namelen=0,Acc1=0,Acc2=0,Acc3=0,Acc4=0,Counter2=0,Counter=0,sumBName=0,RESULT;
  6.          for (namelen=0;namelen<20;namelen++)if (bytename[namelen]==0)break;
  7.          while (Counter < namelen) {
  8.                  sumBName = sumBName + bytename[Counter];
  9.                  Counter = Counter + 1;
  10.          }
  11.          Counter = 0;
  12.          while (Counter < namelen) {
  13.                  Acc1 = (Acc1 + bytename[Counter]) * sumBName ^ 0x9876;
  14.                  Counter = Counter + 1;
  15.          }
  16.          Counter = 0;
  17.          while (Counter < namelen) {
  18.                  Acc2 = (Acc2 + (bytename[Counter] ^ 0xff) ^ Acc1) + 0xabcd123;
  19.                  Counter = Counter + 1;
  20.          }
  21.          RESULT = sumBName * 0x4d2;
  22.          Counter = 0;
  23.          while (Counter < sumBName) {
  24.                  Acc4 = Counter + Acc2 ^ sumBName ^ 0x4d200;
  25.                  RESULT = (Counter + 0x1234ab ^ RESULT + Counter ^ 0x50f00aa2) + Acc4 * Acc4 -0xaaf;
  26.                  Counter2 = 0;
  27.                  while (Counter2 < namelen) {
  28.                         Acc3 = (RESULT * namelen - namelen ^ Counter2) - Acc1;
  29.                         RESULT = Acc3 * Acc3 ^ Acc1;
  30.                         Counter2 = Counter2 + 1;
  31.                  }
  32.                  Counter = Counter + 1;
  33.          }
  34.          return RESULT;
  35. }
  36.  
  37. int _tmain(int argc, _TCHAR* argv[])
  38. {
  39.          unsigned int i,RESULT;
  40.          unsigned char pwd[] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
  41.          //pwd[0]='a';
  42.          //pwd[1]='q';
  43.          //pwd[2]='n';
  44.          //pwd[3]='L';
  45.          //pwd[4]='7';
  46.          //RESULT = hashfunc(pwd);
  47.          //printf("pwd=%s, RESULT=%.8X\r\n",pwd,RESULT);
  48.          while (true){
  49.                  RESULT = hashfunc(pwd);
  50.                  if (RESULT == 0xcd65ab89 || RESULT ==0xa904a4ec || RESULT ==0xeca404a9 || RESULT == 0x89ab65cd) {
  51.                         printf("pwd=%s, RESULT=%.8X\r\n",pwd,RESULT);
  52.                         break;
  53.                  }
  54.                  for (i=0;i<20;i++){
  55.                         if (pwd[i]==0){
  56.                               pwd[i]='a';break;
  57.                         } else if (pwd[i]>='a' && pwd[i]<'z'){
  58.                               pwd[i]++;break;
  59.                         } else if (pwd[i]=='z'){
  60.                               pwd[i]='A';break;
  61.                         } else if (pwd[i]>='A' && pwd[i]<'Z'){
  62.                               pwd[i]++;break;
  63.                         } else if (pwd[i]=='Z'){
  64.                               pwd[i]='0';break;
  65.                         } else if (pwd[i]>='0' && pwd[i]<'9'){
  66.                               pwd[i]++;break;
  67.                         } else if (pwd[i]=='9'){
  68.                               pwd[i]='a';
  69.                         }
  70.                  }
  71.                  if (i==20)break;
  72.          }
  73.          printf("done\r\n");
  74.          unsigned char s[32];
  75.          scanf("%s",&s);
  76.          return 0;

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

Добавлено спустя 1 час 59 минут
ЗЫ: подправил исходник на всякий случай. Коллизия aqnL7, фиг знает сколько считалось, можешь проверить. Кстати ты знаковый тип используешь, может быть поэтому не смог подобрать.

-----
2 оттенка серого


| Сообщение посчитали полезным: plutos, RoKZaR


Ранг: 622.6 (!), 521thx
Активность: 0.330.89
Статус: Участник
_Вечный_Студент_

Создано: 05 июня 2019 10:02
· Личное сообщение · #5

RoKZaR, f13nd

Поделитесь результатами: execution time, processor type, sample size и т.д.
Хотелось бы сравнить.

-----
Give me a HANDLE and I will move the Earth.





Ранг: 271.2 (наставник), 331thx
Активность: 0.321.49
Статус: Участник

Создано: 05 июня 2019 10:23
· Личное сообщение · #6

plutos, да я не засекал, запустил просто и своими делами занимался, через два часа заметил. Процессор заурядный i7-4790K, работало понятно одно ядро только, размер 6кб, собирал 2005й студией с дефолтными настройками. Совершенно точно можно если не на порядки, то в разы перебор ускорить, но для кастомного алгоритма, да еще из крякмиса, смысла нету.

-----
2 оттенка серого




Ранг: 14.3 (новичок), 5thx
Активность: 0.070
Статус: Участник

Создано: 05 июня 2019 11:23
· Личное сообщение · #7

f13nd пишет:
ЗЫ: подправил исходник на всякий случай. Коллизия aqnL7, фиг знает сколько считалось, можешь проверить. Кстати ты знаковый тип используешь, может быть поэтому не смог подобрать.

Тоже нашел эту коллизию. По времени примерно пару часов. А про тип это да, только познаю ещё. Скорее всего поэтому. Процессор мамы простой amd a4-4000.




Ранг: 271.2 (наставник), 331thx
Активность: 0.321.49
Статус: Участник

Создано: 05 июня 2019 11:49
· Личное сообщение · #8

dma
По-моему умением сделать хеловорлд в студии меньше всего кого-то можно удивить. Бывает нужна только потому что исходник легким движением руки под кейль переделывается, а отлаживать в студии проще.

-----
2 оттенка серого





Ранг: 324.3 (мудрец), 222thx
Активность: 0.480.37
Статус: Участник

Создано: 05 июня 2019 12:17
· Личное сообщение · #9

dma
Ты не уважаешь логику

-----
IZ.RU




Ранг: -12.6 (нарушитель), 11thx
Активность: 0.050.03
Статус: Участник

Создано: 05 июня 2019 12:17
· Личное сообщение · #10

f13nd пишет:
По-моему умением сделать хеловорлд в студии меньше всего кого-то можно удивить.


Ну так а я про что? ntldr вон тоже не видит разницы между хеловордом и каким-нибудь rootkits или bootkits.




Ранг: 622.6 (!), 521thx
Активность: 0.330.89
Статус: Участник
_Вечный_Студент_

Создано: 05 июня 2019 13:15 · Поправил: plutos
· Личное сообщение · #11

f13nd пишет:
для кастомного алгоритма, да еще из крякмиса


для ad hoc алгоритма очень даже неплохо.

-----
Give me a HANDLE and I will move the Earth.





Ранг: 271.2 (наставник), 331thx
Активность: 0.321.49
Статус: Участник

Создано: 05 июня 2019 13:33
· Личное сообщение · #12

plutos пишет:
полезно иметь под рукой

Не понял что полезно иметь под рукой. Алгоритм, который вероятно с точки зрения криптографии любительская поделка или брутфорсер к нему, который больше никогда не понадобится?

-----
2 оттенка серого




Ранг: -12.6 (нарушитель), 11thx
Активность: 0.050.03
Статус: Участник

Создано: 05 июня 2019 13:48 · Поправил: dma
· Личное сообщение · #13

DenCoder пишет:
dma
Ты не уважаешь логику


DenCoder, так очень неумных человеков, чаще всего и тянет к умным, так что с логикой тут, вроде, все в порядке.



Ранг: 3.5 (гость), 1thx
Активность: 0.030
Статус: Участник

Создано: 05 июня 2019 14:40
· Личное сообщение · #14

f13nd пишет:
Не понял что полезно иметь под рукой.


ну как же, вот такой козырный генератор!

for (i=0;i<20;i++){
&nbs
p; if (pwd[i]==0){
&nbs
p; pwd[i]='a';break;
&nbs
p; } else if (pwd[i]>='a' && pwd[i]<'z'){
&nbs
p; pwd[i]++;break;
&nbs
p; } else if (pwd[i]=='z'){
&nbs
p; pwd[i]='A';break;
&nbs
p; } else if (pwd[i]>='A' && pwd[i]<'Z'){
&nbs
p; pwd[i]++;break;
&nbs
p; } else if (pwd[i]=='Z'){
&nbs
p; pwd[i]='0';break;
&nbs
p; } else if (pwd[i]>='0' && pwd[i]<'9'){
&nbs
p; pwd[i]++;break;
&nbs
p; } else if (pwd[i]=='9'){
&nbs
p; pwd[i]='a';
&nbs
p; }
}
if (i==20)break;


 eXeL@B —› Вопросы новичков —› Crackme с hash
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати