簡體   English   中英

在C程序中找到漏洞

[英]Find the vulnerability in the C program

學習軟件安全考試並遇到此問題但找不到漏洞。 如果您輸入姓名“John Doe”和薪水 4000,那么程序將寫入字符串“John Doe: $4000”。 據我所知,程序占\0,沒有格式字符串錯誤,沒有緩沖區溢出。 不知道我錯過了什么。

編輯:忘記添加“名稱”參數可以假定為有效的以空字符結尾的字符串。

/* Calculates the number of letters (i.e. digits) that are needed to represent a decimal number as an ASCII string */
size_t count_digits(unsigned int number)
{
    unsigned int left = number;
    size_t n= 0;
    while(left != 0) {
        left = left / 10;
        n++;
    }
    return n;
}

void add_record(const char* name, unsigned int salary)
{
    char buffer[256];

    size_t len = strlen(name);
    size_t num_digits = count_digits(salary);

    /* 5 extra bytes required for colon and space after name + dollar sign, endline and NULL-terminator */
    if(len > SIZE_MAX - 5 || len + 5 > SIZE_MAX - num_digits) {
        printf("integer overflow");
        exit(1);
    }

    len = len + num_digits + 5;

    if (len > sizeof(buffer)) {
        printf("Too long string");
        exit(1);
    }

    /* Output formatted string to buffer (in the format string, %s denotes a string, and %u denotes an unsigned int that is printed as a decimal number) */
    sprintf(buffer, "%s: $%u\n", name, salary);

    // Write buffer to file
    fputs(buffer, global_file_handle);
}

count_digits錯誤地將零返回為零。 正確的結果是一。 工資為零的 251 個字符的名稱將需要 257 個字符(名稱為 251,工資為 1,顏色、空格、美元符號、換行符和 null 為 5),但len將被錯誤地計算為 256,並且len > sizeof(buffer)不會被觸發,所以代碼會溢出buffer

(另一個問題是當name不是以 null 結尾時strlen具有未定義的行為,但從問題陳述中並不清楚name的上下文。)

這不是一個答案,而是一個示例代碼可能應該避免 Erik Postpischil 描述的緩沖區溢出。

count_digits function 是錯誤的(在0的情況下),但也是不必要的。 可以使用snprintf將 output 限制為buffer

void add_record(const char* name, unsigned int salary)
{
    char buffer[256];
    int len;

    len = snprintf(buffer, sizeof buffer, "%s: $%u\n", name, salary);
    if (len >= sizeof(buffer)) {
        printf("Too long string");
        exit(1);
    }

    fputs(buffer, global_file_handle);
}

請注意,如果len正好等於sizeof buffer ,這將意味着生成的字符串已經被截斷。 事實上, len + 1buffer應該防止截斷的大小。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM