From e3a4e66a2eb30ae969877c09a764b7f510b31531 Mon Sep 17 00:00:00 2001
From: ChouTatsumi <choutatsumi@gmail.com>
Date: Sat, 25 May 2019 13:33:38 +1000
Subject: [PATCH] complete PWD4 crack

---
 .gitignore     |   3 +-
 crack.c        | 133 ++++++++++++++++++++++++++++---------------------
 found_pwds.txt |  10 ++++
 3 files changed, 88 insertions(+), 58 deletions(-)
 create mode 100644 found_pwds.txt

diff --git a/.gitignore b/.gitignore
index 3629767..c1e9f66 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,4 +1,5 @@
 **/.vscode
 **/test.*
 **/*.exe
-**/*.o
\ No newline at end of file
+**/*.o
+**/cheat
\ No newline at end of file
diff --git a/crack.c b/crack.c
index fe2dfb3..6619f5c 100644
--- a/crack.c
+++ b/crack.c
@@ -6,10 +6,11 @@
 #include "sha256.h"
 
 // constants
-#define BUFFERSIZE 256
+#define INPUTSIZE 10000
 
 #define PWD4_FILENAME "pwd4sha256"
 #define PWD6_FILENAME "pwd6sha256"
+#define OUTPUT_FILENAME "found_pwds.txt"
 #define PWD4_NUMBERS 10
 #define PWD_NUMBERS 30
 
@@ -23,9 +24,9 @@
 #define ASCII_LOWERCASE_TO 122
 
 // methods reference
-void check_guess(BYTE guess[],
-                 BYTE pwd[PWD_NUMBERS][SHA256_BLOCK_SIZE], int checked[]);
-void check_n_guess(BYTE guess[], BYTE pwd[][SHA256_BLOCK_SIZE], int n,
+void check_guess(char guess[], BYTE pwd[PWD_NUMBERS][SHA256_BLOCK_SIZE],
+                 int checked[]);
+void check_n_guess(char guess[], BYTE pwd[][SHA256_BLOCK_SIZE], int n,
                    int checked[]);
 void int_array_init(int array[], int n);
 
@@ -50,7 +51,7 @@ int main(int argc, char** argv) {
                 exit(0);
             }
 
-            strcpy((char*)&pwd[i], (char*)&buffer);
+            memcpy(pwd[i], buffer, SHA256_BLOCK_SIZE);
         }
         fclose(fp);
 
@@ -65,39 +66,60 @@ int main(int argc, char** argv) {
                 exit(0);
             }
 
-            strcpy((char*)&pwd[i], (char*)&buffer);
+            memcpy(pwd[i], buffer, SHA256_BLOCK_SIZE);
         }
         fclose(fp);
 
         // create guess and check it
-        // crazy test
-        BYTE guess[5] = {"aaaa"};
-        // guess[4] = '\0';
-        int checked[10];
-        int_array_init(checked, 10);
-
-
-        check_n_guess(guess, pwd, 10, checked);
-
-        // int first, second, third, fourth;
-        // for (first = ASCII_FROM; first <= ASCII_TO; first++) {
-        //     guess[0] = first;
-        //     for (second = ASCII_FROM; second <= ASCII_TO; second++) {
-        //         guess[1] = second;
-        //         for (third = ASCII_FROM; third <= ASCII_TO; third++) {
-        //             guess[2] = third;
-        //             for (fourth = ASCII_FROM; fourth <= ASCII_TO; fourth++) {
-        //                 guess[3] = fourth;
-        //                 check_n_guess(guess, pwd, 10, checked);
-        //             }
-        //         }
-        //     }
-        // }
+        SHA256_CTX ctx;
+        BYTE buf[SHA256_BLOCK_SIZE];
+
+        // open output file
+        fp = fopen(OUTPUT_FILENAME, "w");
+        
+        // violent crack PWD4
+        char guess[5];
+        guess[4] = '\0';
+        int checked[PWD4_NUMBERS];
+        int_array_init(checked, PWD4_NUMBERS);
+
+        int first, second, third, fourth;
+        for (first = ASCII_FROM; first <= ASCII_TO; first++) {
+            guess[0] = first;
+            for (second = ASCII_FROM; second <= ASCII_TO; second++) {
+                guess[1] = second;
+                for (third = ASCII_FROM; third <= ASCII_TO; third++) {
+                    guess[2] = third;
+                    for (fourth = ASCII_FROM; fourth <= ASCII_TO; fourth++) {
+                        guess[3] = fourth;
+                        
+                        // generate hash and check
+                        sha256_init(&ctx);
+                        sha256_update(&ctx, (BYTE*)guess, 4);
+                        sha256_final(&ctx, buf);
+
+                        for (int i = 0; i < PWD4_NUMBERS; i++) {
+                            if (!checked[i] && !memcmp(pwd[i], buf, SHA256_BLOCK_SIZE)) {
+                                checked[i] = 1;
+                                printf("%s %d\n", guess, i + 1);
+                                fprintf(fp, "%s %d\n", guess, i + 1);
+                            }
+                        }
+                    }
+                }
+            }
+        }
+
+        // crack PWD6
+
+
+        fclose(fp);
     } else if (argc == 2) {
         // This part for good guess
     } else if (argc == 3) {
         FILE* fp;
-        BYTE buffer[BUFFERSIZE];
+        FILE* wfp;
+        BYTE buffer[SHA256_BLOCK_SIZE];
 
         // read password file and store hashes passwords
         fp = fopen(argv[2], "rb");
@@ -108,6 +130,7 @@ int main(int argc, char** argv) {
 
         fseek(fp, 0, SEEK_END);
         pwdsize = ftell(fp);
+        fseek(fp, 0, SEEK_SET);
         pwdcount = pwdsize / SHA256_BLOCK_SIZE;
 
         if (pwdsize % SHA256_BLOCK_SIZE) {
@@ -134,32 +157,49 @@ int main(int argc, char** argv) {
 
         // read guess from file and check guess
         fp = fopen(argv[1], "r");
+        wfp = fopen(OUTPUT_FILENAME, "w");
+        char input[INPUTSIZE];
+        SHA256_CTX ctx;
+        BYTE buf[SHA256_BLOCK_SIZE];
 
         // create flag arrays to avoid repeat check
         int checked[pwdcount];
         int_array_init(checked, pwdcount);
 
-        while (fgets((char*)&buffer, BUFFERSIZE, fp) != NULL) {
+        while (fgets(input, INPUTSIZE, fp) != NULL) {
             // get rid of \n for buffer
-            buffer[strlen((char*)&buffer) - 1] = '\0';
-            check_n_guess(buffer, pwd, pwdcount, checked);
+            buffer[strlen(input) - 1] = '\0';
+
+            // generate hash and check
+            sha256_init(&ctx);
+            sha256_update(&ctx, (BYTE*)input, 4);
+            sha256_final(&ctx, buf);
+
+            for (int i = 0; i < pwdcount; i++) {
+                if (!checked[i] && !memcmp(pwd[i], buf, SHA256_BLOCK_SIZE)) {
+                    checked[i] = 1;
+                    printf("%s %d\n", input, i + 1);
+                    fprintf(wfp, "%s %d\n", input, i + 1);
+                }
+            }
         }
 
         fclose(fp);
+        fclose(wfp);
     }
 
     return 0;
 }
 
-void check_guess(BYTE guess[], BYTE pwd[PWD_NUMBERS][SHA256_BLOCK_SIZE],
+void check_guess(char guess[], BYTE pwd[PWD_NUMBERS][SHA256_BLOCK_SIZE],
                  int checked[]) {
     SHA256_CTX ctx;
     BYTE buf[SHA256_BLOCK_SIZE];
-    size_t guess_len = strlen((char*)&guess);
+    size_t guess_len = strlen(guess);
     int i;
 
     sha256_init(&ctx);
-    sha256_update(&ctx, guess, guess_len);
+    sha256_update(&ctx, (BYTE*)guess, guess_len);
     sha256_final(&ctx, buf);
 
     if (guess_len == 4) {
@@ -182,27 +222,6 @@ void check_guess(BYTE guess[], BYTE pwd[PWD_NUMBERS][SHA256_BLOCK_SIZE],
     }
 }
 
-void check_n_guess(BYTE guess[], BYTE pwd[][SHA256_BLOCK_SIZE], int n,
-                   int checked[]) {
-    SHA256_CTX ctx;
-    BYTE buf[SHA256_BLOCK_SIZE];
-    size_t guess_len = strlen((char*)&guess);
-    int i;
-
-    sha256_init(&ctx);
-    sha256_update(&ctx, guess, guess_len);
-    sha256_final(&ctx, buf);
-
-    
-    for (i = 0; i < n; i++) {
-        printf("%d %s %s\n", checked[i], buf, pwd[i]);
-        if (!checked[i] && !memcmp(pwd[i], buf, SHA256_BLOCK_SIZE)) {
-            checked[i] = 1;
-            printf("%s %d\n", guess, i + 1);
-        }
-    }
-}
-
 void int_array_init(int array[], int n) {
     for (int i = 0; i < n; i++) array[i] = 0;
 }
\ No newline at end of file
diff --git a/found_pwds.txt b/found_pwds.txt
new file mode 100644
index 0000000..9cb1702
--- /dev/null
+++ b/found_pwds.txt
@@ -0,0 +1,10 @@
+1472 6
+1482 7
+1995 2
+1gae 9
+2goo 10
+esit 3
+sp*t 1
+spOt 4
+spot 5
+xunz 8
-- 
GitLab