PDA

Просмотр полной версии : Циклический инкремент паролей


Pashkela
19.05.2010, 18:19
Только начал изучать С под Linux, просьба отнестись с пониманием)

Вот у меня такой код, для брута паролей по набору символов:

#include <stdio.h>
// Сам брут
int go(int ii,char *def_pass,int def_len,char *nabor,int len,char *current){
unsigned int i=0;
while (i < len) {
current[ii-1] = nabor[i]; // добавляем новый символ
printf("%s\r",current);// Выводим текущую комбинацию
if (ii >1 ){
go(ii-1,def_pass,def_len,nabor,len,current);// Рекурсивно вызываем сами себя для заполнения всех позиций
}else{
char *check=current; // Проверяем текущую комбинацию
if (strncmp(check,def_pass,def_len) == 0){ // Если совпало
printf("[+]Password found! => %s\n",check);
exit(1);
}
check="";// Очищаем переменную с текущим паролем
}
i++;
}
}
int main (int argc, char *argv[])
{
char *def_pass="013283";// Пароль, который надо найти
unsigned int def_len = strlen(def_pass);// Длина пароля
char *nabor="0123456789";// Набор символов, из которых будем генерить пароль
unsigned int len = strlen(nabor); // Длина набора
unsigned int i=1;// Минимальная длина пароля
char *buf;
while(i <= len){
printf("[-]Pass length:%d\n",i);
buf=calloc(sizeof(char),i+1); // Заполняем нулями по длине текущего пароля
go(i,def_pass,def_len,nabor,len,buf); // Отправляем на брут
i++;
}
}


Все работает, но очень медленно. Натолкнулся на такую статью:

http://www.xakep.ru/post/22587/default.asp

но там пример на С++, внимание вопрос:

как внедрить данную идею - "Циклический инкремент паролей" - в код выше. Просто раньше с ассемблерными вставками и вообще программированием на С под никсами не сталкивался. В идеале готовый пример. Спасибо.

d_x
19.05.2010, 22:22
Код будет практически мгновенно работать, если ты уберешь строчку

printf("%s\r",current);// Выводим текущую комбинацию

printf каждого пароля жрет приличное время.

Pashkela
19.05.2010, 23:15
это ми в курске, это просто демонстрация) Но если это переложить на брут MD5 - без всякий вообще выводов - скорость в 10 раз ниже, чем у PasswordsPro. Отсюда и сабж

Ins3t
19.05.2010, 23:25
но там пример на С++

То что они назвали си плюс плюс-ом на самом деле чистый С.

Pashkela
19.05.2010, 23:58
пробовал. Не комплится чото "тот чистый си". Мильон ошибок

Ins3t
20.05.2010, 00:13
Ясное дело, откуда же в линуксе взяться хедеру windows.h :)

И с ассемблерными вставками в линуксе не так как в винде, но об этом более конкретно сказать не могу )

Так то писать нужно было не:
но там пример на С++
а
нo там пример под Windows

;)

Pashkela
20.05.2010, 00:16
спасибо за ценную информацию

d_x
20.05.2010, 00:52
Pashkela, там реально пример на чистом СИ, и из windows.h там используется отсилы слово TRUE и ZeroMemory.

Этот код я переписал тебе под gcc:


#include "stdio.h"

int main(int argc, char* argv[])
{
static char szPassword[256];
static char szAlphabet[256];
static unsigned char bAlphabet[256];

memset(szPassword, 0, sizeof(szPassword));
strcpy(szAlphabet, "ABC");
memset(bAlphabet, 0, sizeof(bAlphabet));

int i = 0, k = 0;
while (1)
{
bAlphabet[k] = (unsigned char)szAlphabet[i];
if (!szAlphabet[i])
break;

k = (unsigned char)szAlphabet[i];
i++;
}

while (1)
{
__asm
(
".intel_syntax noprefix\n"
"pushad\n"
"L1:\n"
"movzx eax,byte ptr [edi]\n"
"xlat\n"
"test al,al\n"
"jz L3\n"
"mov [edi],al\n"
"jmp LL5\n"

"L3:\n"
"xlat\n"
"stosb\n"
"jmp L1\n"

"LL5:\n"
"popad\n"
".att_syntax\n"
:
: "D" (&szPassword), "b" (&bAlphabet)

);

printf("%s\n", szPassword);
}

return 0;
}

Pashkela
20.05.2010, 01:00
2 d_x:

йо, а вот это круто, вот это действительно работает, ты мозг, большое спасибо

ps: только ми не вогнал, как тут сработало без AT&T

http://www.ibiblio.org/gferg/ldp/GCC-Inline-Assembly-HOWTO.html

d_x
20.05.2010, 01:03
Док правильный нашел, там написано все. А чтобы вырубить at&t, используется директива .intel_syntax, можешь погуглить. Чтобы включить обратно - .att_syntax.

Pashkela
20.05.2010, 01:07
Еще раз огромное спасибо, информация просто бесценная, можно применить много где