簡體   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