繁体   English   中英

此C代码中的漏洞是什么?

[英]What is the vulnerability in this C code?

我试图更好地理解缓冲区溢出攻击,这是出现的练习之一,它具有缓冲区溢出漏洞。 我想知道如何利用此代码中的漏洞。 我不确定如何搜索。

int
main(int argc, char **argv)
{
    (void) foo(argv[1]);
    exit(0);
}

int
foo(char *arg)
{
    return bar(arg);
}

int
bar(char *arg)
{
    char lbuf[1024];
    if (strlen(arg) >= 1024)
        return -1;

    memset(lbuf, 0, sizeof(lbuf));
    sprintf(lbuf, "%s", "Welcome: ");
    read(0, lbuf + strlen(lbuf), sizeof(lbuf) - strlen(lbuf) - 1);
    printf(lbuf);
    fflush(stdout);

    return 0;
}

那里根本没有缓冲区溢出。 但这并不意味着它是安全的。

您应该找到的问题是此行:

printf(lbuf);

每当您提供格式字符串时,请确保将其安全地控制在您的控制之下,并且仅询问您提供的那些参数。 访问未提供的参数或类型错误的参数会导致未定义的行为(可能会发生各种奇怪且潜在危险的事情)。 另外,可以使用%n戳一些内存,这显然很危险。
在这种情况下, lbuf包含Welcome:其后是任意不安全的用户输入。

另外,该程序无条件地读取argv[1] (假设argc > 0 ),并进一步假定将其传递给strlen()时,它指向一个字符串(假设argc > 1 strlen()

您的代码只是一个UB,没有任何可能的破解(如果我们仅考虑缓冲区溢出并将分析任何其他可能的破解)。

要使用的缓冲区溢出攻击技术必须覆盖程序稍后使用的某些数据。 可能是更改变量,或放置了一些代码(较不常见但可能)

一个例子:

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

int CheckPassword(void)
{
    char passwd[5];
    int passwordcorect = 0;

    printf("Enter password:");
    gets(passwd);

    if(!strcmp(passwd, "1234"))
    {
        passwordcorect = 1;
    }
    return passwordcorect;
}

int main()
{
    if(CheckPassword())
    {
        printf("\nSpecial priviledges granted!!\n");
    }
    else
    {
        printf("\nWrong!!\n");
    }
    return 0;
}

与mingw一起编译。 在此处输入图片说明

结果:

在此处输入图片说明 在此处输入图片说明

为什么会发生? 因为缓冲区已覆盖passwordcorrect变量。 它与系统,实现等相关,但黑客行为不是抽象的或可移植的:)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM