Skip to content

Instantly share code, notes, and snippets.

@fgiobergia
Created December 18, 2014 15:35
Show Gist options
  • Save fgiobergia/3f844aea02985593dd76 to your computer and use it in GitHub Desktop.
Save fgiobergia/3f844aea02985593dd76 to your computer and use it in GitHub Desktop.
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#define f(x,y,z) ((x&y)|(~x&z))
#define g(x,y,z) ((x&z)|(y&~z))
#define h(x,y,z) (x^y^z)
#define i(x,y,z) (y^(x|~z))
#define ror(x,c) ((x<<c)|(x>>(32-c)))
int md5 (char *str, int len, int *hash) {
unsigned int k;
unsigned int a = 0x67452301; // A
unsigned int b = 0xefcdab89; // B
unsigned int c = 0x98badcfe; // C
unsigned int d = 0x10325476; // D
unsigned int aa,bb,cc,dd;
unsigned int *x;
str[len] = 0x80;
str[56] = len<<3;
x=(unsigned int*)str;
aa = a;
bb = b;
cc = c;
dd = d;
k=(a + f(b,c,d) + x[0] + 0xd76aa478); a = b + ror(k,7);
k=(d + f(a,b,c) + x[1] + 0xe8c7b756); d = a + ror(k,12);
k=(c + f(d,a,b) + x[2] + 0x242070db); c = d + ror(k,17);
k=(b + f(c,d,a) + x[3] + 0xc1bdceee); b = c + ror(k,22);
k=(a + f(b,c,d) + x[4] + 0xf57c0faf); a = b + ror(k,7);
k=(d + f(a,b,c) + x[5] + 0x4787c62a); d = a + ror(k,12);
k=(c + f(d,a,b) + x[6] + 0xa8304613); c = d + ror(k,17);
k=(b + f(c,d,a) + x[7] + 0xfd469501); b = c + ror(k,22);
k=(a + f(b,c,d) + x[8] + 0x698098d8); a = b + ror(k,7);
k=(d + f(a,b,c) + x[9] + 0x8b44f7af); d = a + ror(k,12);
k=(c + f(d,a,b) + x[10] + 0xffff5bb1); c = d + ror(k,17);
k=(b + f(c,d,a) + x[11] + 0x895cd7be); b = c + ror(k,22);
k=(a + f(b,c,d) + x[12] + 0x6b901122); a = b + ror(k,7);
k=(d + f(a,b,c) + x[13] + 0xfd987193); d = a + ror(k,12);
k=(c + f(d,a,b) + x[14] + 0xa679438e); c = d + ror(k,17);
k=(b + f(c,d,a) + x[15] + 0x49b40821); b = c + ror(k,22);
k=(a + g(b,c,d) + x[1] + 0xf61e2562); a = b + ror(k,5);
k=(d + g(a,b,c) + x[6] + 0xc040b340); d = a + ror(k,9);
k=(c + g(d,a,b) + x[11] + 0x265e5a51); c = d + ror(k,14);
k=(b + g(c,d,a) + x[0] + 0xe9b6c7aa); b = c + ror(k,20);
k=(a + g(b,c,d) + x[5] + 0xd62f105d); a = b + ror(k,5);
k=(d + g(a,b,c) + x[10] + 0x02441453); d = a + ror(k,9);
k=(c + g(d,a,b) + x[15] + 0xd8a1e681); c = d + ror(k,14);
k=(b + g(c,d,a) + x[4] + 0xe7d3fbc8); b = c + ror(k,20);
k=(a + g(b,c,d) + x[9] + 0x21e1cde6); a = b + ror(k,5);
k=(d + g(a,b,c) + x[14] + 0xc33707d6); d = a + ror(k,9);
k=(c + g(d,a,b) + x[3] + 0xf4d50d87); c = d + ror(k,14);
k=(b + g(c,d,a) + x[8] + 0x455a14ed); b = c + ror(k,20);
k=(a + g(b,c,d) + x[13] + 0xa9e3e905); a = b + ror(k,5);
k=(d + g(a,b,c) + x[2] + 0xfcefa3f8); d = a + ror(k,9);
k=(c + g(d,a,b) + x[7] + 0x676f02d9); c = d + ror(k,14);
k=(b + g(c,d,a) + x[12] + 0x8d2a4c8a); b = c + ror(k,20);
k=(a + h(b,c,d) + x[5] + 0xfffa3942); a = b + ror(k,4);
k=(d + h(a,b,c) + x[8] + 0x8771f681); d = a + ror(k,11);
k=(c + h(d,a,b) + x[11] + 0x6d9d6122); c = d + ror(k,16);
k=(b + h(c,d,a) + x[14] + 0xfde5380c); b = c + ror(k,23);
k=(a + h(b,c,d) + x[1] + 0xa4beea44); a = b + ror(k,4);
k=(d + h(a,b,c) + x[4] + 0x4bdecfa9); d = a + ror(k,11);
k=(c + h(d,a,b) + x[7] + 0xf6bb4b60); c = d + ror(k,16);
k=(b + h(c,d,a) + x[10] + 0xbebfbc70); b = c + ror(k,23);
k=(a + h(b,c,d) + x[13] + 0x289b7ec6); a = b + ror(k,4);
k=(d + h(a,b,c) + x[0] + 0xeaa127fa); d = a + ror(k,11);
k=(c + h(d,a,b) + x[3] + 0xd4ef3085); c = d + ror(k,16);
k=(b + h(c,d,a) + x[6] + 0x04881d05); b = c + ror(k,23);
k=(a + h(b,c,d) + x[9] + 0xd9d4d039); a = b + ror(k,4);
k=(d + h(a,b,c) + x[12] + 0xe6db99e5); d = a + ror(k,11);
k=(c + h(d,a,b) + x[15] + 0x1fa27cf8); c = d + ror(k,16);
k=(b + h(c,d,a) + x[2] + 0xc4ac5665); b = c + ror(k,23);
k=(a + i(b,c,d) + x[0] + 0xf4292244); a = b + ror(k,6);
k=(d + i(a,b,c) + x[7] + 0x432aff97); d = a + ror(k,10);
k=(c + i(d,a,b) + x[14] + 0xab9423a7); c = d + ror(k,15);
k=(b + i(c,d,a) + x[5] + 0xfc93a039); b = c + ror(k,21);
k=(a + i(b,c,d) + x[12] + 0x655b59c3); a = b + ror(k,6);
k=(d + i(a,b,c) + x[3] + 0x8f0ccc92); d = a + ror(k,10);
k=(c + i(d,a,b) + x[10] + 0xffeff47d); c = d + ror(k,15);
k=(b + i(c,d,a) + x[1] + 0x85845dd1); b = c + ror(k,21);
k=(a + i(b,c,d) + x[8] + 0x6fa87e4f); a = b + ror(k,6);
k=(d + i(a,b,c) + x[15] + 0xfe2ce6e0); d = a + ror(k,10);
k=(c + i(d,a,b) + x[6] + 0xa3014314); c = d + ror(k,15);
k=(b + i(c,d,a) + x[13] + 0x4e0811a1); b = c + ror(k,21);
k=(a + i(b,c,d) + x[4] + 0xf7537e82); a = b + ror(k,6);
k=(d + i(a,b,c) + x[11] + 0xbd3af235); d = a + ror(k,10);
k=(c + i(d,a,b) + x[2] + 0x2ad7d2bb); c = d + ror(k,15);
k=(b + i(c,d,a) + x[9] + 0xeb86d391); b = c + ror(k,21);
aa += a;
bb += b;
cc += c;
dd += d;
str[len]=0;
if (aa==hash[0]&&bb==hash[1]&&cc==hash[2]&&dd==hash[3]) {
return 1;
}
return 0;
}
void gen (char *prev, int pos, int len, char *set, int slen, int *hash) {
int i;
if (pos>=len) {
return ;
}
for (i=0;i<slen;i++) {
prev[pos]=set[i];
if (md5 (prev,pos+1,hash)) {
printf ("[+] Hash found: %s\n",prev);
exit(0);
}
gen (prev,pos+1,len,set,slen,hash);
}
}
int main (int argc, char *argv[]) {
char *str=malloc(64);
unsigned int hash[4],a,b,c,d,i;
if (argc!=3) {
printf ("[?] Usage: %s <md5 hash> <max length>\n",argv[0]);
printf ("[?] Default charset: [a-z0-9]\n");
return 0;
}
for (i=0;i<4;i++) {
sscanf (argv[1]+(i<<3),"%2x%2x%2x%2x",&a,&b,&c,&d);
hash[i] = (d<<24)|(c<<16)|(b<<8)|a;
}
memset (str,0,64);
gen(str,0,atoi(argv[2]),"abcdefghijklmnopqrstuvwxyz0123456789",36,hash);
printf ("[!] No luck with this one\n");
return 0;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment