As you can see by the algo, it xors every char into eax and multiplies the same with 0x1000193.
Don't forget that EAX is initialized as 0x811C9DC5.
We're back to 004010CA. Xors final eax with 0xA7BA8755, NEGs it, substract with borrow
and then increases eax. Looks pretty tough to be solved by pen & paper huh? ;)
.DATA
MYLOOP dd 0 ;you maybe ask why a variable? our registers are not safe :(
PREFIX db "%8X", 0
BUFFER db 9 dup(0) ;buffer contained of 8 chars and one terminator
The following comments are owned by whomever posted them. This site is not responsible for what they say.
Bruteforcing Zeph's crackme
Authored by:
bluffer on
Tuesday, April 19 2005 @ 07:02 PM CEST
ah thanks for mention Boro :)
hope i could add a few comments to this tut as you know i was loooking for a sppedier way that eliminates the twenty minutes :)
i removed the wsprintf and coded an inline convertor which reduced the time to about 10 minutes and i came to #win32asm on efnet to bug some of them to find some more improvements :)
parabytes there suggested some improvements in the convertor like stosd instead of stosb which were marginal improvemnts
then scali took an interest in the code and
coded a c++ and applied pentium optimization switches and it drastically reduced the time to about
one minute :) iam pasting below the c++ code that was from scali :)
#include <stdio.h>
int main(void)
{
char* table = "0123456789ABCDEF";
char key[] = "F000FFF0";
for (unsigned int a = 0; a < 16; a++)
{
key[0] = table[a];
for (unsigned int b = 0; b < 16; b++)
{
key[1] = table[b];
for (unsigned int c = 0; c < 16; c++)
{
key[2] = table[c];
for (unsigned int d = 0; d < 16; d++)
{
key[3] = table[d];
for (unsigned int e = 0; e < 16; e++)
{
key[4] = table[e];
for (unsigned int f = 0; f < 16; f++)
{
key[5] = table[f];
for (unsigned int g = 0; g < 16; g++)
{
key[6] = table[g];
for (unsigned int h = 0; h < 16; h++)
{
key[7] = table[h];
unsigned int hash = 0x811C9DC5;
for (unsigned int i = 0; i < 8; i++)
{
hash ^= (unsigned char)key[i];
hash *= 0x1000193;
}
if (hash == 0xA7BA8755)
goto end;
}
}
}
}
}
}
}
}
end:
printf( "%s\n", key );
return 0;
}
commadline for gpp g++ -Wall -O3 bruter.c -o bruter
[bluffer@]$ ./bruter
F000FFF0
Bruting time ->69sec
it was fun doing the brute and speed optimizing it :)
and hey detten nice site layout :)
greets to all
ah thanks for mention Boro :)
hope i could add a few comments to this tut as you know i was loooking for a sppedier way that eliminates the twenty minutes :)
i removed the wsprintf and coded an inline convertor which reduced the time to about 10 minutesand i came to #win32asm on efnet to bug some of them to find some more improvements :) parabytes there suggested some improvements in the convertor like stosd instead of stosb which were marginal improvemnts then scali took an interest in the code and coded a c++ and applied pentium optimization switches and it drastically reduced the time to about one minute :) iam pasting below the c++ code that was from scali :) commadline for gpp
g++ -Wall -O3 bruter.c -o bruter
[bluffer@]$ ./bruter F000FFF0 Bruting time ->69sec
it was fun doing the brute and speed optimizing it :)
and hey detten nice site layout :)
greets to all