Използвам вградено асемблиране, за да конструирам набор от пароли, които ще използвам за груба сила срещу даден хеш. Използвах този уебсайт като справка за изграждането на паролите.
Това работи безупречно в среда с една нишка. Той произвежда безкрайно количество увеличаващи се пароли.
Тъй като имам само основни познания за asm, разбирам идеята. Gcc използва ATT, така че компилирам с -masm=intel
По време на опита за многонишкова програма осъзнавам, че този подход може да не работи.
Следният код използва 2 глобални C променливи и предполагам, че това може да е проблемът.
__asm__("pushad\n\t"
"mov edi, offset plaintext\n\t" <---- global variable
"mov ebx, offset charsetTable\n\t" <---- again
"L1: movzx eax, byte ptr [edi]\n\t"
" movzx eax, byte ptr [charsetTable+eax]\n\t"
" cmp al, 0\n\t"
" je L2\n\t"
" mov [edi],al\n\t"
" jmp L3\n\t"
"L2: xlat\n\t"
" mov [edi],al\n\t"
" inc edi\n\t"
" jmp L1\n\t"
"L3: popad\n\t");
Той произвежда недетерминиран резултат в променливата за обикновен текст.
Как мога да създам заобиколно решение, така че всяка нишка да има достъп до собствената си променлива в обикновен текст? (Ако това е проблемът...).
Опитах се да модифицирам този код, за да използвам разширен асембли, но всеки път се провалях. Вероятно поради факта, че всички уроци използват ATT синтаксис.
Наистина ще съм благодарен за всякаква помощ, тъй като съм блокиран вече няколко часа :(
Редактиране: Изпълнението на програмата с 2 нишки и отпечатването на съдържанието на обикновен текст веднага след asm инструкцията, произвежда:b
b
d
d
f
f
...
Редактиране 2:
pthread_create(&thread[i], NULL, crack, (void *) &args[i]))
[...]
void *crack(void *arg) {
struct threadArgs *param = arg;
struct crypt_data crypt; // storage for reentrant version of crypt(3)
char *tmpHash = NULL;
size_t len = strlen(param->methodAndSalt);
size_t cipherlen = strlen(param->cipher);
crypt.initialized = 0;
for(int i = 0; i <= LIMIT; i++) {
// intel syntax
__asm__ ("pushad\n\t"
//mov edi, offset %0\n\t"
"mov edi, offset plaintext\n\t"
"mov ebx, offset charsetTable\n\t"
"L1: movzx eax, byte ptr [edi]\n\t"
" movzx eax, byte ptr [charsetTable+eax]\n\t"
" cmp al, 0\n\t"
" je L2\n\t"
" mov [edi],al\n\t"
" jmp L3\n\t"
"L2: xlat\n\t"
" mov [edi],al\n\t"
" inc edi\n\t"
" jmp L1\n\t"
"L3: popad\n\t");
tmpHash = crypt_r(plaintext, param->methodAndSalt, &crypt);
if(0 == memcmp(tmpHash+len, param->cipher, cipherlen)) {
printf("success: %s\n", plaintext);
break;
}
}
return 0;
}
plaintext
иcharsetTable
променливи, ако две или повече нишки имат достъп до тях. Трудно е да се каже от това, което сте публикували, дали това наистина е проблемът. Можете ли да ни покажете кода за нишки? - person Tony The Lion   schedule 18.09.2011asm
катоvolatile
, тъй като в противен случай GCC може да го премести. Освен това трябва да иматеmemory
в списъка за изтриване. Вижте тук. - person user786653   schedule 18.09.2011xlat
(която може би е била най-бързият начин преди 20 години) трябва да се избягва. - person Gunther Piez   schedule 19.08.2012