diff --git a/docs/changes.txt b/docs/changes.txt index 02a9eb5ca..3afbad882 100644 --- a/docs/changes.txt +++ b/docs/changes.txt @@ -62,6 +62,7 @@ - OpenCL Kernels: Vectorized tons of slow kernels to improve CPU cracking speed - OpenCL Runtime: Updated AMD ROCm driver version check, warn if version < 1.1 - Startup: Show some attack-specific optimizer constraints on start, eg: minimum and maximum support password- and salt-length +- Startup: Check and abort session if outfile and wordlist point to the same file - WPA cracking: Improved nonce-error-corrections mode to use a both positive and negative corrections ## diff --git a/include/shared.h b/include/shared.h index 11012f419..c2ef98e3a 100644 --- a/include/shared.h +++ b/include/shared.h @@ -63,4 +63,6 @@ hc_time_t hc_time (hc_time_t *t); struct tm *hc_gmtime (const hc_time_t *t, MAYBE_UNUSED struct tm *result); char *hc_ctime (const hc_time_t *t, char *buf, MAYBE_UNUSED const size_t buf_size); +bool hc_same_files (char *file1, char *file2); + #endif // _SHARED_H diff --git a/src/shared.c b/src/shared.c index 40b87e683..9041c70ad 100644 --- a/src/shared.c +++ b/src/shared.c @@ -462,3 +462,90 @@ char *hc_ctime (const hc_time_t *t, char *buf, MAYBE_UNUSED const size_t buf_siz return etc; } + +bool hc_same_files (char *file1, char *file2) +{ + if ((file1 != NULL) && (file2 != NULL)) + { + hc_stat_t tmpstat_file1; + hc_stat_t tmpstat_file2; + + int do_check = 0; + + FILE *fp; + + fp = fopen (file1, "r"); + + if (fp) + { + if (hc_fstat (fileno (fp), &tmpstat_file1)) + { + fclose (fp); + + return false; + } + + fclose (fp); + + do_check++; + } + + fp = fopen (file2, "r"); + + if (fp) + { + if (hc_fstat (fileno (fp), &tmpstat_file2)) + { + fclose (fp); + + return false; + } + + fclose (fp); + + do_check++; + } + + if (do_check == 2) + { + tmpstat_file1.st_mode = 0; + tmpstat_file1.st_nlink = 0; + tmpstat_file1.st_uid = 0; + tmpstat_file1.st_gid = 0; + tmpstat_file1.st_rdev = 0; + tmpstat_file1.st_atime = 0; + + #if defined (STAT_NANOSECONDS_ACCESS_TIME) + tmpstat_file1.STAT_NANOSECONDS_ACCESS_TIME = 0; + #endif + + #if defined (_POSIX) + tmpstat_file1.st_blksize = 0; + tmpstat_file1.st_blocks = 0; + #endif + + tmpstat_file2.st_mode = 0; + tmpstat_file2.st_nlink = 0; + tmpstat_file2.st_uid = 0; + tmpstat_file2.st_gid = 0; + tmpstat_file2.st_rdev = 0; + tmpstat_file2.st_atime = 0; + + #if defined (STAT_NANOSECONDS_ACCESS_TIME) + tmpstat_file2.STAT_NANOSECONDS_ACCESS_TIME = 0; + #endif + + #if defined (_POSIX) + tmpstat_file2.st_blksize = 0; + tmpstat_file2.st_blocks = 0; + #endif + + if (memcmp (&tmpstat_file1, &tmpstat_file2, sizeof (hc_stat_t)) == 0) + { + return true; + } + } + } + + return false; +} diff --git a/src/user_options.c b/src/user_options.c index acac1f5e6..5e64b6079 100644 --- a/src/user_options.c +++ b/src/user_options.c @@ -1916,81 +1916,76 @@ int user_options_check_files (hashcat_ctx_t *hashcat_ctx) } } - // check for hashfile vs outfile (should not point to the same physical file) + // check for outfile vs. hashfile - if ((user_options_extra->hc_hash != NULL) && (outfile_ctx->filename != NULL)) + if (hc_same_files (outfile_ctx->filename, user_options_extra->hc_hash) == true) { - char *hashfile = user_options_extra->hc_hash; + event_log_error (hashcat_ctx, "Outfile and hashfile cannot point to the same file."); - char *outfile = outfile_ctx->filename; + return -1; + } - hc_stat_t tmpstat_outfile; - hc_stat_t tmpstat_hashfile; + // check for outfile vs. cached wordlists - memset (&tmpstat_outfile, 0, sizeof (tmpstat_outfile)); - memset (&tmpstat_hashfile, 0, sizeof (tmpstat_hashfile)); - - int do_check = 0; - - FILE *tmp_outfile_fp = fopen (outfile, "r"); - - if (tmp_outfile_fp) + if (user_options->attack_mode == ATTACK_MODE_STRAIGHT) + { + for (int i = 0; i < user_options_extra->hc_workc; i++) { - if (hc_fstat (fileno (tmp_outfile_fp), &tmpstat_outfile)) + char *wlfile = user_options_extra->hc_workv[i]; + + if (hc_same_files (outfile_ctx->filename, wlfile) == true) { - fclose (tmp_outfile_fp); + event_log_error (hashcat_ctx, "Outfile and wordlist cannot point to the same file."); + + return -1; + } + } + } + else if (user_options->attack_mode == ATTACK_MODE_COMBI) + { + if (user_options_extra->hc_workc == 2) + { + char *dictfile1 = user_options_extra->hc_workv[0]; + char *dictfile2 = user_options_extra->hc_workv[1]; + + if (hc_same_files (outfile_ctx->filename, dictfile1) == true) + { + event_log_error (hashcat_ctx, "Outfile and wordlist cannot point to the same file."); return -1; } - fclose (tmp_outfile_fp); - - do_check++; - } - - FILE *tmp_hashfile_fp = fopen (hashfile, "r"); - - if (tmp_hashfile_fp) - { - if (hc_fstat (fileno (tmp_hashfile_fp), &tmpstat_hashfile)) + if (hc_same_files (outfile_ctx->filename, dictfile2) == true) { - fclose (tmp_hashfile_fp); + event_log_error (hashcat_ctx, "Outfile and wordlist cannot point to the same file."); return -1; } - - fclose (tmp_hashfile_fp); - - do_check++; } - - if (do_check == 2) + } + else if (user_options->attack_mode == ATTACK_MODE_HYBRID1) + { + if (user_options_extra->hc_workc == 2) { - tmpstat_outfile.st_mode = 0; - tmpstat_outfile.st_nlink = 0; - tmpstat_outfile.st_uid = 0; - tmpstat_outfile.st_gid = 0; - tmpstat_outfile.st_rdev = 0; - tmpstat_outfile.st_atime = 0; + char *wlfile = user_options_extra->hc_workv[0]; - tmpstat_hashfile.st_mode = 0; - tmpstat_hashfile.st_nlink = 0; - tmpstat_hashfile.st_uid = 0; - tmpstat_hashfile.st_gid = 0; - tmpstat_hashfile.st_rdev = 0; - tmpstat_hashfile.st_atime = 0; - - #if defined (_POSIX) - tmpstat_outfile.st_blksize = 0; - tmpstat_outfile.st_blocks = 0; - - tmpstat_hashfile.st_blksize = 0; - tmpstat_hashfile.st_blocks = 0; - #endif - - if (memcmp (&tmpstat_outfile, &tmpstat_hashfile, sizeof (hc_stat_t)) == 0) + if (hc_same_files (outfile_ctx->filename, wlfile) == true) { - event_log_error (hashcat_ctx, "Hashfile and outfile cannot point to the same file."); + event_log_error (hashcat_ctx, "Outfile and wordlist cannot point to the same file."); + + return -1; + } + } + } + else if (user_options->attack_mode == ATTACK_MODE_HYBRID2) + { + if (user_options_extra->hc_workc == 2) + { + char *wlfile = user_options_extra->hc_workv[1]; + + if (hc_same_files (outfile_ctx->filename, wlfile) == true) + { + event_log_error (hashcat_ctx, "Outfile and wordlist cannot point to the same file."); return -1; }