From 767ad440b2ed64bd02018184e965c87b9d4eaa1c Mon Sep 17 00:00:00 2001 From: jsteube Date: Sat, 17 Dec 2016 14:09:58 +0100 Subject: [PATCH] Fixed custom char parsing code in maskfiles in --increment mode: Custom charset wasn't used --- docs/changes.txt | 3 +- src/mpsp.c | 132 +++++++++++++++++++++++++++++++++++++---------- 2 files changed, 106 insertions(+), 29 deletions(-) diff --git a/docs/changes.txt b/docs/changes.txt index 6b27a03e7..b43243b6e 100644 --- a/docs/changes.txt +++ b/docs/changes.txt @@ -13,7 +13,8 @@ - Fixed infinite loop when using --loopback in case all hashes have been cracked - Fixed double fclose() using AMDGPU-Pro on sysfs compatible platform: Leading to segfault -- Fixed kernel loops in leading to slower performance in --increment mode +- Fixed kernel loops in --increment mode leading to slower performance +- Fixed custom char parsing code in maskfiles in --increment mode: Custom charset wasn't used - Removed access to readlink() on FreeBSD: Causes problem building hashcat ## diff --git a/src/mpsp.c b/src/mpsp.c index 8c63177c1..8ca9751de 100644 --- a/src/mpsp.c +++ b/src/mpsp.c @@ -927,7 +927,7 @@ static int mask_append_final (hashcat_ctx_t *hashcat_ctx, const char *mask) return 0; } -static int mask_append (hashcat_ctx_t *hashcat_ctx, const char *mask) +static int mask_append (hashcat_ctx_t *hashcat_ctx, const char *mask, const char *prepend) { hashconfig_t *hashconfig = hashcat_ctx->hashconfig; user_options_t *user_options = hashcat_ctx->user_options; @@ -950,7 +950,16 @@ static int mask_append (hashcat_ctx_t *hashcat_ctx, const char *mask) { char *mask_truncated = (char *) hcmalloc (256); - const int rc_truncated_mask = mp_get_truncated_mask (hashcat_ctx, mask, strlen (mask), increment_len, mask_truncated); + char *mask_truncated_next = mask_truncated; + + if (prepend) + { + // this happens with maskfiles only + + mask_truncated_next += snprintf (mask_truncated, 256, "%s,", prepend); + } + + const int rc_truncated_mask = mp_get_truncated_mask (hashcat_ctx, mask, strlen (mask), increment_len, mask_truncated_next); if (rc_truncated_mask == -1) break; @@ -985,6 +994,34 @@ u32 mp_get_length (const char *mask) return len; } +static char *mask_ctx_parse_maskfile_find_mask (char *line_buf, int line_len) +{ + char *mask_buf = line_buf; + + bool escaped = false; + + for (int i = 0; i < line_len; i++) + { + if (escaped == true) + { + escaped = false; + } + else + { + if (line_buf[i] == '\\') + { + escaped = true; + } + else if (line_buf[i] == ',') + { + mask_buf = line_buf + i + 1; + } + } + } + + return mask_buf; +} + int mask_ctx_update_loop (hashcat_ctx_t *hashcat_ctx) { combinator_ctx_t *combinator_ctx = hashcat_ctx->combinator_ctx; @@ -1188,7 +1225,7 @@ int mask_ctx_init (hashcat_ctx_t *hashcat_ctx) if (hc_stat (arg, &file_stat) == -1) { - const int rc = mask_append (hashcat_ctx, arg); + const int rc = mask_append (hashcat_ctx, arg, NULL); if (rc == -1) return -1; } @@ -1228,7 +1265,20 @@ int mask_ctx_init (hashcat_ctx_t *hashcat_ctx) if (line_buf[0] == '#') continue; - const int rc = mask_append (hashcat_ctx, line_buf); + char *mask_buf = mask_ctx_parse_maskfile_find_mask (line_buf, line_len); + + char *prepend_buf = NULL; + + if (line_buf != mask_buf) + { + // if we have custom charsets + + prepend_buf = line_buf; + + mask_buf[-1] = 0; + } + + const int rc = mask_append (hashcat_ctx, mask_buf, prepend_buf); if (rc == -1) { @@ -1255,7 +1305,7 @@ int mask_ctx_init (hashcat_ctx_t *hashcat_ctx) { const char *mask = DEF_MASK; - const int rc = mask_append (hashcat_ctx, mask); + const int rc = mask_append (hashcat_ctx, mask, NULL); if (rc == -1) return -1; } @@ -1264,7 +1314,7 @@ int mask_ctx_init (hashcat_ctx_t *hashcat_ctx) { const char *mask = hashconfig_benchmark_mask (hashcat_ctx); - const int rc = mask_append (hashcat_ctx, mask); + const int rc = mask_append (hashcat_ctx, mask, NULL); if (rc == -1) return -1; } @@ -1281,7 +1331,7 @@ int mask_ctx_init (hashcat_ctx_t *hashcat_ctx) if (hc_stat (arg, &file_stat) == -1) { - const int rc = mask_append (hashcat_ctx, arg); + const int rc = mask_append (hashcat_ctx, arg, NULL); if (rc == -1) return -1; } @@ -1310,7 +1360,20 @@ int mask_ctx_init (hashcat_ctx_t *hashcat_ctx) if (line_buf[0] == '#') continue; - const int rc = mask_append (hashcat_ctx, line_buf); + char *mask_buf = mask_ctx_parse_maskfile_find_mask (line_buf, line_len); + + char *prepend_buf = NULL; + + if (line_buf != mask_buf) + { + // if we have custom charsets + + prepend_buf = line_buf; + + mask_buf[-1] = 0; + } + + const int rc = mask_append (hashcat_ctx, mask_buf, prepend_buf); if (rc == -1) { @@ -1344,7 +1407,7 @@ int mask_ctx_init (hashcat_ctx_t *hashcat_ctx) if (hc_stat (arg, &file_stat) == -1) { - const int rc = mask_append (hashcat_ctx, arg); + const int rc = mask_append (hashcat_ctx, arg, NULL); if (rc == -1) return -1; } @@ -1373,7 +1436,20 @@ int mask_ctx_init (hashcat_ctx_t *hashcat_ctx) if (line_buf[0] == '#') continue; - const int rc = mask_append (hashcat_ctx, line_buf); + char *mask_buf = mask_ctx_parse_maskfile_find_mask (line_buf, line_len); + + char *prepend_buf = NULL; + + if (line_buf != mask_buf) + { + // if we have custom charsets + + prepend_buf = line_buf; + + mask_buf[-1] = 0; + } + + const int rc = mask_append (hashcat_ctx, mask_buf, prepend_buf); if (rc == -1) { @@ -1443,13 +1519,15 @@ int mask_ctx_parse_maskfile (hashcat_ctx_t *hashcat_ctx) if (mask_ctx->mask_from_file == false) return 0; - mf_t *mfs = mask_ctx->mfs; + mf_t *mfs_buf = mask_ctx->mfs; + + mfs_buf[0].mf_len = 0; + mfs_buf[1].mf_len = 0; + mfs_buf[2].mf_len = 0; + mfs_buf[3].mf_len = 0; + mfs_buf[4].mf_len = 0; - mfs[0].mf_len = 0; - mfs[1].mf_len = 0; - mfs[2].mf_len = 0; - mfs[3].mf_len = 0; - mfs[4].mf_len = 0; + int mfs_cnt = 0; char *mask_buf = mask_ctx->mask; @@ -1457,11 +1535,9 @@ int mask_ctx_parse_maskfile (hashcat_ctx_t *hashcat_ctx) bool escaped = false; - int mf_cnt = 0; - for (int i = 0; i < mask_len; i++) { - mf_t *mf = mfs + mf_cnt; + mf_t *mf = mfs_buf + mfs_cnt; if (escaped == true) { @@ -1481,9 +1557,9 @@ int mask_ctx_parse_maskfile (hashcat_ctx_t *hashcat_ctx) { mf->mf_buf[mf->mf_len] = 0; - mf_cnt++; + mfs_cnt++; - if (mf_cnt >= MAX_MFS) + if (mfs_cnt == MAX_MFS) { event_log_error (hashcat_ctx, "Invalid line '%s' in maskfile", mask_buf); @@ -1499,41 +1575,41 @@ int mask_ctx_parse_maskfile (hashcat_ctx_t *hashcat_ctx) } } - mf_t *mf = mfs + mf_cnt; + mf_t *mf = mfs_buf + mfs_cnt; mf->mf_buf[mf->mf_len] = 0; - for (int i = 0; i < mf_cnt; i++) + for (int i = 0; i < mfs_cnt; i++) { switch (i) { case 0: - user_options->custom_charset_1 = mfs[0].mf_buf; + user_options->custom_charset_1 = mfs_buf[0].mf_buf; mp_reset_usr (mask_ctx->mp_usr, 0); mp_setup_usr (hashcat_ctx, mask_ctx->mp_sys, mask_ctx->mp_usr, user_options->custom_charset_1, 0); break; case 1: - user_options->custom_charset_2 = mfs[1].mf_buf; + user_options->custom_charset_2 = mfs_buf[1].mf_buf; mp_reset_usr (mask_ctx->mp_usr, 1); mp_setup_usr (hashcat_ctx, mask_ctx->mp_sys, mask_ctx->mp_usr, user_options->custom_charset_2, 1); break; case 2: - user_options->custom_charset_3 = mfs[2].mf_buf; + user_options->custom_charset_3 = mfs_buf[2].mf_buf; mp_reset_usr (mask_ctx->mp_usr, 2); mp_setup_usr (hashcat_ctx, mask_ctx->mp_sys, mask_ctx->mp_usr, user_options->custom_charset_3, 2); break; case 3: - user_options->custom_charset_4 = mfs[3].mf_buf; + user_options->custom_charset_4 = mfs_buf[3].mf_buf; mp_reset_usr (mask_ctx->mp_usr, 3); mp_setup_usr (hashcat_ctx, mask_ctx->mp_sys, mask_ctx->mp_usr, user_options->custom_charset_4, 3); break; } } - mask_ctx->mask = mfs[mf_cnt].mf_buf; + mask_ctx->mask = mfs_buf[mfs_cnt].mf_buf; return 0; }