From b05ccae642dd908bf19d21e92b7a1b9a930f4025 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Fri, 6 Sep 2024 10:47:08 +0200 Subject: [PATCH] text, string formatter, and something still complains in the GH actions --- tools/mfc/card_only/staticnested_0nt.c | 23 ++++++++++++-- tools/mfc/card_only/staticnested_1nt.c | 31 ++++++++++++++----- tools/mfc/card_only/staticnested_2nt.c | 9 ++++-- .../mfc/card_only/staticnested_2x1nt_rf08s.c | 5 ++- .../card_only/staticnested_2x1nt_rf08s_1key.c | 4 +-- 5 files changed, 55 insertions(+), 17 deletions(-) diff --git a/tools/mfc/card_only/staticnested_0nt.c b/tools/mfc/card_only/staticnested_0nt.c index a0e121cf6..fd0b11df0 100644 --- a/tools/mfc/card_only/staticnested_0nt.c +++ b/tools/mfc/card_only/staticnested_0nt.c @@ -96,7 +96,7 @@ static bool search_match(const NtData *pND, const NtData *pND0, uint64_t key) { struct Crypto1State *s; s = crypto1_create(0); if (s == NULL) { - fprintf(stderr, "\nMalloc error in search_match!\n"); + fprintf(stderr, "\nCalloc error in search_match!\n"); return 0; } crypto1_init(s, key); @@ -167,7 +167,7 @@ static void *generate_and_intersect_keys(void *threadarg) { revstate = lfsr_recovery32(ks1, nt_probe); if (revstate == NULL) { - fprintf(stderr, "\nMalloc error in generate_and_intersect_keys!\n"); + fprintf(stderr, "\nCalloc error in generate_and_intersect_keys!\n"); pthread_exit(NULL); } @@ -367,6 +367,7 @@ static void analyze_keys(uint64_t **keys, uint32_t keyCounts[MAX_NR_NONCES], uin } int main(int argc, char *const argv[]) { + if (argc < 2) { int cmdlen = strlen(argv[0]); printf("Usage:\n %s ...\n", argv[0]); @@ -379,10 +380,12 @@ int main(int argc, char *const argv[]) { printf(" %*s +nt_par_err1 +nt_par_err2 +nt_par_err3\n", cmdlen, ""); return 1; } + if (argc < 1 + 2 * 3) { fprintf(stderr, "Too few nonces, abort. Need 2 nonces min.\n"); return 1; } + if (argc > 1 + MAX_NR_NONCES * 3) { fprintf(stderr, "Too many nonces, abort. Choose max %i nonces.\n", MAX_NR_NONCES); return 1; @@ -393,29 +396,37 @@ int main(int argc, char *const argv[]) { uint32_t keyCounts[MAX_NR_NONCES] = {0}; uint32_t authuid = hex_to_uint32(argv[1]); + // process all args. printf("Generating nonce candidates...\n"); + for (uint32_t i = 1; i < argc; i += 3) { + // uid + ntEnc + parEnc if (strcmp(argv[i], ".") != 0) { authuid = hex_to_uint32(argv[i]); } + uint32_t nt_enc = hex_to_uint32(argv[i + 1]); uint8_t nt_par_err_arr[4]; if (bin_to_uint8_arr(argv[i + 2], nt_par_err_arr, 4)) { return 1; } + uint8_t nt_par_enc = ((nt_par_err_arr[0] ^ oddparity8((nt_enc >> 24) & 0xFF)) << 3) | ((nt_par_err_arr[1] ^ oddparity8((nt_enc >> 16) & 0xFF)) << 2) | ((nt_par_err_arr[2] ^ oddparity8((nt_enc >> 8) & 0xFF)) << 1) | ((nt_par_err_arr[3] ^ oddparity8((nt_enc >> 0) & 0xFF)) << 0); + NtData *pNtData = &NKL.NtDataList[NKL.nr_nonces]; + // Try to recover the keystream1 uint32_t nttest = prng_successor(1, 16); // a first valid nonce pNtData->pNK = (NtpKs1 *)calloc(8192, sizeof(NtpKs1)); // 2**16 filtered with 3 parity bits => 2**13 if (pNtData->pNK == NULL) { return 1; } + uint32_t j = 0; for (uint16_t m = 1; m; m++) { uint32_t ks1 = nt_enc ^ nttest; @@ -426,6 +437,7 @@ int main(int argc, char *const argv[]) { } nttest = prng_successor(nttest, 1); } + printf("uid=%08x nt_enc=%08x nt_par_err=%i%i%i%i nt_par_enc=%i%i%i%i %u/%i: %u\n" , authuid , nt_enc @@ -448,12 +460,15 @@ int main(int argc, char *const argv[]) { printf("Finding key candidates...\n"); keys = unpredictable_nested(&NKL, keyCounts); + printf("\n\nFinding phase complete.\n"); - for (uint32_t k = 0; k < NKL.nr_nonces; k++) + for (uint32_t k = 0; k < NKL.nr_nonces; k++) { free(NKL.NtDataList[k].pNK); + } analyze_keys(keys, keyCounts, NKL.nr_nonces); + FILE *fptr; // opening the file in read mode fptr = fopen("keys.dic", "w"); @@ -469,11 +484,13 @@ int main(int argc, char *const argv[]) { } else { fprintf(stderr, "Warning: Cannot save keys in keys.dic\n"); } + for (uint32_t i = 1; i < NKL.nr_nonces; i++) { if (keys[i] != NULL) { free(keys[i]); } } + if (keys != NULL) { free(keys); } diff --git a/tools/mfc/card_only/staticnested_1nt.c b/tools/mfc/card_only/staticnested_1nt.c index e2dc13277..4b7b0fc68 100644 --- a/tools/mfc/card_only/staticnested_1nt.c +++ b/tools/mfc/card_only/staticnested_1nt.c @@ -54,7 +54,7 @@ static uint64_t *generate_keys(uint64_t authuid, uint32_t nt, uint32_t nt_enc, u uint64_t *result_keys = (uint64_t *)calloc(1, KEY_SPACE_SIZE * sizeof(uint64_t)); if (result_keys == NULL) { - fprintf(stderr, "\nMalloc error in generate_and_intersect_keys!\n"); + fprintf(stderr, "\nCalloc error in generate_and_intersect_keys!\n"); return NULL; } @@ -64,7 +64,7 @@ static uint64_t *generate_keys(uint64_t authuid, uint32_t nt, uint32_t nt_enc, u revstate = lfsr_recovery32(ks1, nt ^ authuid); if (revstate == NULL) { - fprintf(stderr, "\nMalloc error in generate_keys!\n"); + fprintf(stderr, "\nCalloc error in generate_keys!\n"); free(result_keys); return NULL; } @@ -73,7 +73,7 @@ static uint64_t *generate_keys(uint64_t authuid, uint32_t nt, uint32_t nt_enc, u s = crypto1_create(0); if (s == NULL) { - fprintf(stderr, "\nMalloc error in generate_keys!\n"); + fprintf(stderr, "\nCalloc error in generate_keys!\n"); free(result_keys); crypto1_destroy(revstate_start); return 0; @@ -109,6 +109,7 @@ static uint64_t *generate_keys(uint64_t authuid, uint32_t nt, uint32_t nt_enc, u } int main(int argc, char *const argv[]) { + if (argc != 6) { int cmdlen = strlen(argv[0]); printf("Usage:\n %s \n" @@ -120,6 +121,7 @@ int main(int argc, char *const argv[]) { argv[0], cmdlen, argv[0], cmdlen, ""); return 1; } + uint64_t *keys = NULL; uint32_t keyCount = 0; @@ -127,22 +129,36 @@ int main(int argc, char *const argv[]) { uint32_t sector = atoi(argv[2]); uint32_t nt = hex_to_uint32(argv[3]); uint32_t nt_enc = hex_to_uint32(argv[4]); + uint8_t nt_par_err_arr[4]; if (bin_to_uint8_arr(argv[5], nt_par_err_arr, 4)) { return 1; } + uint8_t nt_par_enc = ((nt_par_err_arr[0] ^ oddparity8((nt_enc >> 24) & 0xFF)) << 3) | ((nt_par_err_arr[1] ^ oddparity8((nt_enc >> 16) & 0xFF)) << 2) | ((nt_par_err_arr[2] ^ oddparity8((nt_enc >> 8) & 0xFF)) << 1) | ((nt_par_err_arr[3] ^ oddparity8((nt_enc >> 0) & 0xFF)) << 0); - printf("uid=%08x nt=%08x nt_enc=%08x nt_par_err=%i%i%i%i nt_par_enc=%i%i%i%i ks1=%08x\n", authuid, nt, nt_enc, - nt_par_err_arr[0], nt_par_err_arr[1], nt_par_err_arr[2], nt_par_err_arr[3], - (nt_par_enc >> 3) & 1, (nt_par_enc >> 2) & 1, (nt_par_enc >> 1) & 1, nt_par_enc & 1, - nt ^ nt_enc); + + printf("uid=%08x nt=%08x nt_enc=%08x nt_par_err=%u%u%u%u nt_par_enc=%u%u%u%u ks1=%08x\n" + , authuid + , nt + , nt_enc + , nt_par_err_arr[0] + , nt_par_err_arr[1] + , nt_par_err_arr[2] + , nt_par_err_arr[3] + , (nt_par_enc >> 3) & 1 + , (nt_par_enc >> 2) & 1 + , (nt_par_enc >> 1) & 1 + , nt_par_enc & 1 + , nt ^ nt_enc + ); printf("Finding key candidates...\n"); keys = generate_keys(authuid, nt, nt_enc, nt_par_enc, &keyCount); + printf("Finding phase complete, found %u keys\n", keyCount); FILE *fptr; @@ -160,6 +176,7 @@ int main(int argc, char *const argv[]) { } else { fprintf(stderr, "Warning: Cannot save keys in %s\n", filename); } + if (keys != NULL) { free(keys); } diff --git a/tools/mfc/card_only/staticnested_2nt.c b/tools/mfc/card_only/staticnested_2nt.c index 9d3a3b964..484c5cdf7 100644 --- a/tools/mfc/card_only/staticnested_2nt.c +++ b/tools/mfc/card_only/staticnested_2nt.c @@ -107,12 +107,14 @@ static void pm3_staticnested(uint32_t uid, uint32_t nt1, uint32_t ks1, uint32_t pthread_t thread_id[2]; // create and run worker threads - for (uint8_t i = 0; i < 2; i++) + for (uint8_t i = 0; i < 2; i++) { pthread_create(thread_id + i, NULL, nested_worker_thread, &statelists[i]); + } // wait for threads to terminate: - for (uint8_t i = 0; i < 2; i++) + for (uint8_t i = 0; i < 2; i++) { pthread_join(thread_id[i], (void *)&statelists[i].head.slhead); + } // the first 16 Bits of the cryptostate already contain part of our key. // Create the intersection of the two lists based on these 16 Bits and @@ -125,6 +127,7 @@ static void pm3_staticnested(uint32_t uid, uint32_t nt1, uint32_t ks1, uint32_t struct Crypto1State savestate; savestate = *p1; + while (compare16Bits(p1, &savestate) == 0 && p1 <= statelists[0].tail.sltail) { *p3 = *p1; lfsr_rollback_word(p3, statelists[0].nt_enc ^ statelists[0].uid, 0); @@ -132,6 +135,7 @@ static void pm3_staticnested(uint32_t uid, uint32_t nt1, uint32_t ks1, uint32_t p1++; } savestate = *p2; + while (compare16Bits(p2, &savestate) == 0 && p2 <= statelists[1].tail.sltail) { *p4 = *p2; lfsr_rollback_word(p4, statelists[1].nt_enc ^ statelists[1].uid, 0); @@ -219,6 +223,7 @@ int main(int argc, char *const argv[]) { uint32_t key_count = 0; uint64_t *keys = nested(pNK, 2, uid, &key_count); + if (key_count) { printf("Ultra Static nested --> Found " _YELLOW_("%u") " key candidates\n", key_count); for (uint32_t k = 0; k < key_count; k++) { diff --git a/tools/mfc/card_only/staticnested_2x1nt_rf08s.c b/tools/mfc/card_only/staticnested_2x1nt_rf08s.c index 3c24f79cd..2dd6ace23 100644 --- a/tools/mfc/card_only/staticnested_2x1nt_rf08s.c +++ b/tools/mfc/card_only/staticnested_2x1nt_rf08s.c @@ -78,14 +78,13 @@ int main(int argc, char *const argv[]) { uint32_t uid1, sector1, nt1, uid2, sector2, nt2; char *filename1 = argv[1], *filename2 = argv[2]; - int result; - result = sscanf(filename1, "keys_%8x_%2d_%8x.dic", &uid1, §or1, &nt1); + int result = sscanf(filename1, "keys_%8x_%2u_%8x.dic", &uid1, §or1, &nt1); if (result != 3) { fprintf(stderr, "Error: Failed to parse the filename %s.\n", filename1); return 1; } - result = sscanf(filename2, "keys_%8x_%2d_%8x.dic", &uid2, §or2, &nt2); + result = sscanf(filename2, "keys_%8x_%2u_%8x.dic", &uid2, §or2, &nt2); if (result != 3) { fprintf(stderr, "Error: Failed to parse the filename %s.\n", filename2); return 1; diff --git a/tools/mfc/card_only/staticnested_2x1nt_rf08s_1key.c b/tools/mfc/card_only/staticnested_2x1nt_rf08s_1key.c index c1ed1062b..66f0cecab 100644 --- a/tools/mfc/card_only/staticnested_2x1nt_rf08s_1key.c +++ b/tools/mfc/card_only/staticnested_2x1nt_rf08s_1key.c @@ -92,7 +92,7 @@ int main(int argc, char *const argv[]) { char *filename = argv[3]; uint32_t uid, sector, nt2; - int result = sscanf(filename, "keys_%8x_%2d_%8x.dic", &uid, §or, &nt2); + int result = sscanf(filename, "keys_%8x_%2u_%8x.dic", &uid, §or, &nt2); if (result != 3) { fprintf(stderr, "Error: Failed to parse the filename %s.\n", filename); return 1; @@ -116,7 +116,7 @@ int main(int argc, char *const argv[]) { keycount2++; } - keys2 = (uint64_t *)malloc(keycount2 * sizeof(uint64_t)); + keys2 = (uint64_t *)calloc(1, keycount2 * sizeof(uint64_t)); if (keys2 == NULL) { perror("Failed to allocate memory"); fclose(fptr);