我的 C 程序的 "for" 循环在 3 次迭代后停止

My C program's "for" loop is stalling after 3 iterations

我已经制作了一个简单的 C 程序用于逆向练习 - 但是,当我输入名称和密码时,它会在 for 循环中迭代三次然后停止并有一个旋转的光标,最后没有退出输出回 CLI。我已经对我的算法进行了更改并确保它是正确的(这里的函数 x 不是问题,因为即使在返回其静态值时也会发生这种冻结)。我在我的计划中哪里误入歧途了? (这是我C的第一天,IDEONE说我缓冲区溢出了。)

节目:

#include <stdio.h>
#include <string.h>

int x(char* s, int c) {
    return 65;
}

int main(void) {

    char N[16] = ""; // Entered name
    char p[16] = ""; // Entered password
    char r[16] = ""; // Result of applying keygen `x` to `N` (`p` should be this to be correct)

    char n;
    printf("Enter name: ");
    scanf("%s", N);
    printf("Entered name\n");
    printf("Enter password: ");
    scanf("%s", p);
    printf("Entered password\n");

    int j;
    for (j = 0; j < strlen(N); j++) {
        printf("Iterating, iteration %d\n", j);
        if (N[j] == 0) {
            break;
        }
        n = x(N, j);
        strcat(r, &n);
    }
    if (strcmp(r, p) == 0) {
        printf("Correct!\n");
    }
    else {
        printf("Incorrect!\n");
    }
    return 0;
}

CLI:

C:\MinGW\bin>gcc "\Mac\Home\Desktop\My Crackme.c" -o "\Mac\Home\Desktop\MyCrackme.exe"
C:\MinGW\bin>"\Mac\Home\Desktop\MyCrackme.exe"

Enter name: Jack
Entered name
Enter password: Not Jack
Entered password
Iterating, iteration 0
Iterating, iteration 1
Iterating, iteration 2

C:\MinGW\bin>

这似乎只有在我使用 MinGW 编译成 exe 时才会发生 - 在我的 Mac 上使用 gcc 编译成通用可执行文件会生成一个看似有效的程序。但是,我需要一个 exe 文件。感谢所有帮助!

问题出在 strcat(r, &n); 上,因为 *n 不是空终止字符串,而是单个字符。 strcat 复制到它遇到的第一个空值,这里不会。所以你的 r 会溢出,导致中止。

而不是 strcat 您必须手动附加字符,例如:

int len= strlen(r);
*(r+len  )= n;
*(r+len+1)= '[=10=]';

或(更好):

int len= strlen(r);
if (len<sizeof(r)-1) {
    *(r+len  )= n;
    *(r+len+1)= '[=11=]';
}