1

我在网上找到了一个有趣的练习,它指出特定的输入可能会溢出缓冲区,从而将“秘密”打印到标准输出。

我试图自己弄清楚,但我做得不好。

这是代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void get_name(char *name, char *pr) {
    char local[20];
    printf("%s:",pr);
    gets(local);// BUG
    strncat(name,local,20);
}
int foo () {
    char name[28]="Hello..";
    char secret[12]="TOP SECRET";
    char buf[24];
    char n1[]="Enter your name";
    char n2[]="Enter Secret code"; 
    get_name(name,n1);
    memset(buf, 0, sizeof(buf));
    // Lets ONLY use strncpy for better control!!! 
    strncpy(buf, name, sizeof(buf));//BUG 
    printf("%s\n", buf); 
    memset(name,0,sizeof(name));
    get_name(name, n2);
    if (strncmp(secret,name,10)==0)
        printf("Welcome and %s\n",buf);
    else {printf("Wrong code, better try again..\n");}
    return 0;
}


int main(int argc, char **argv)
{
    foo();
    printf("Bye\n");
    return 0;
}
4

1 回答 1

1

没有办法知道这种缓冲区溢出的结果会怎样。您无法知道或假设它们将覆盖哪些内存。它们很可能只会导致某种运行时崩溃。任何漏洞利用都必须考虑到一个非常具体的系统。这意味着在不了解给定系统的详细信息的情况下,没有人能够回答您的问题。

您的“随机互联网人”的目标可能是Hello..用一些垃圾覆盖 null 终止,以便"TOP SECRET"字符串将与它一起打印。但是,您不能假设这两个字符串是相邻分配的。您可以尝试输入 28 个字母长的输入,gets然后看看会发生什么……不能保证任何给定的行为。在我的电脑上,除了打印一些垃圾之外,它并没有什么令人兴奋的事情。我的二进制文件的逆向工程表明这是因为数组确实没有相邻分配。

此外,您的评论strncpy是误导性的,strncpy是危险的,应该避免,看这个

于 2016-10-13T09:52:29.953 回答