char * дает разные результаты при изменении условия - PullRequest
0 голосов
/ 26 января 2019

Я создаю простую md5-подобную брутфорсу программу, использующую C. Единственная проблема, с которой я сталкиваюсь, заключается в том, что вывод Found String: полностью изменяется, если бы я должен был заменить часть оператора if.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdlib.h>
#include <assert.h>
#include <time.h>
#include <stdbool.h>
#if defined(__APPLE__)
#  define COMMON_DIGEST_FOR_OPENSSL
#  include <CommonCrypto/CommonDigest.h>
#  define SHA1 CC_SHA1
#else
#  include <openssl/md5.h>
#endif
char *str2md5(const char *str, int length) {
    int n;
    MD5_CTX c;
    unsigned char digest[16];
    char *out = (char*)malloc(33);

    MD5_Init(&c);

    while (length > 0) {
        if (length > 512) {
            MD5_Update(&c, str, 512);
        } else {
            MD5_Update(&c, str, length);
        }
        length -= 512;
        str += 512;
    }

    MD5_Final(digest, &c);

    for (n = 0; n < 16; ++n) {
        snprintf(&(out[n*2]), 16*2, "%02x", (unsigned int)digest[n]);
    }

    return out;
}
typedef struct md5data {
char* output;
char* strin;
} md5data;
md5data getrand() {
        for (int i = 0; i < 10; ++i)
        {
            rand();
            srand(rand());
        }
        unsigned char strin[50];
        for (int i = 0; i < 50; i++)
        {
        strin[i] = (rand()%94)+32;
        }
        strin[49] = '\0';
        char* string = &strin;
        char *output = str2md5(string, strlen(string));
        md5data out;
        out.output = output;
        out.strin = string;
        return out;
    }
bool starts_with(const char* a, const char* b)
{
   if(strncmp(a, b, strlen(b)) == 0) return 1;
   return 0;
}
int main() {
    char input;
    printf("%s","Enter Search String: ");
    scanf("%s",&input);
    srand(time(NULL));
    while(1 == 1) {
        md5data md5 = getrand();
        if(starts_with(md5.output,&input)) {
            printf("Found String: %s\nMD5: %s\n",md5.strin,md5.output);
            break;
        }
    }
    return 0;
}

Всякий раз, когда я компилирую и выполняю, первая строка вывода обычно выглядит примерно так: Found String: 0????

Однако, если я изменю starts_with(md5.output,&input) на что-то вроде 1==1 или что-то в этом роде, результат будет примерно таким: Found String: qM39$dcX_ZqFM9]?>jKhxSl@m2xrAxaL*

Что вызывает изменение выхода и почему это происходит?

Ответы [ 2 ]

0 голосов
/ 26 января 2019

Я решил эту проблему, добавив глобальную переменную, удалив md5data и используя strcpy, чтобы скопировать значение getrand в глобальную переменную. Код:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdlib.h>
#include <assert.h>
#include <time.h>
#include <stdbool.h>
#if defined(__APPLE__)
#  define COMMON_DIGEST_FOR_OPENSSL
#  include <CommonCrypto/CommonDigest.h>
#  define SHA1 CC_SHA1
#else
#  include <openssl/md5.h>
#endif
char *str2md5(const char *str, int length) {
    int n;
    MD5_CTX c;
    unsigned char digest[16];
    char *out = (char*)malloc(33);

    MD5_Init(&c);

    while (length > 0) {
        if (length > 512) {
            MD5_Update(&c, str, 512);
        } else {
            MD5_Update(&c, str, length);
        }
        length -= 512;
        str += 512;
    }

    MD5_Final(digest, &c);

    for (n = 0; n < 16; ++n) {
        snprintf(&(out[n*2]), 16*2, "%02x", (unsigned int)digest[n]);
    }

    return out;
}
unsigned char stringglobal[50];
char* outputglobal;
void getrand() {
        for (int i = 0; i < 10; ++i)
        {
            rand();
            srand(rand());
        }
        unsigned char strin[50] = {0};
        for (int i = 0; i < 50; i++)
        {
        strin[i] = (rand()%94)+32;
        }
        strin[49] = '\0';
        char* string = &strin[0];
        char *output = str2md5(string, strlen(string));
        outputglobal = output;
        strcpy(stringglobal,string);
    }
bool starts_with(const char* a, const char* b)
{
   if(strncmp(a, b, strlen(b)) == 0) return 1;
   return 0;
}
int main() {
    char input[256];
    printf("%s","Enter Search String: ");
    scanf("%s",&input);
    srand(time(NULL));
    while(1 == 1) {
        getrand();
        if(starts_with(outputglobal,&input)) {
            printf("Found! String: %s\nMD5: %s\n",stringglobal,outputglobal);
            break;
        }
    }
    return 0;
}
0 голосов
/ 26 января 2019

Проблема в строках:

char input; printf("%s","Enter Search String: "); scanf("%s",&input);

input должен быть массивом символов (буфером), а не одним символом. Например:

char input[256]; printf("%s","Enter Search String: "); scanf("%s",&input);

В текущем состоянии scanf приводит к переполнению буфера в вашем стеке, что приводит к неопределенным результатам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...