簡體   English   中英

對簡單C代碼中的安全工程缺乏了解

[英]Lack of understanding of security engineering in simple C code

我對 C 編程完全陌生。 目前我正在為我的新課程 IT 安全做准備。 在稍早的考試中,我發現了一項我無法解決的任務。 任務是德語的。 原則上,它是關於發現關鍵錯誤。

沒有寫傳遞參數的樣子。

1)我已經說到你不應該使用strcpy因為它沒有邊界檢查。

2) 如果要存儲 10 個字符 (\0),也不應使用char[10] 它應該是 char[11]。

是否可以通過 printf(argv[1]) 命令讀取地址或寫入某物?

我想再次提一下,您親自在這里幫助我,而不是幫助在大學里收集積分。

#include <stdio.h>

int main(int argc, char *argv[])
{
    char code[10];

    if(argc != 2) return 1;
    printf(argv[1]);

    strcpy(code, "9999999999");
    for(int i = 0; i < 10; ++i){
        code[i] -= argv[1][i] % 10;
    }

    printf(", %s\n", code);

    return 0;
}

相關

你不應該使用 strcpy() 因為它沒有邊界檢查

C中的任何內容都沒有邊界檢查,除非

  • 編譯器作者把它放在那里,或者

  • 你把它放在那里。

很少有編譯器編寫者將邊界檢查合並到他們的產品中,因為它通常會導致生成的代碼更大更慢。 存在一些工具(例如ValgrindElectric Fence )來提供與邊界檢查相關的調試幫助,但由於它們施加的限制,它們通常不被合並到交付的軟件中。

你絕對應該使用strcpy()如果

  • 你知道你的源是一個以 NUL 結尾的字符數組,也就是“一個字符串”,並且

  • 你知道你的目的地足夠大,可以容納所有的源數組,包括終止的 NUL

因為允許編譯器編寫者使用編譯器用戶無法使用的幕后技巧,以確保strcpy()具有最佳性能,同時仍提供標准所保證的行為。

如果要存儲 10 個字符 (\0),則不應使用 char[10]

正確的。
要存儲 10 個字符終止 NUL ( '\0' ),您必須至少有 11 個字符的可用空間。

是否可以通過 printf(argv[1]) 命令讀取地址或寫入某物?

原則上:也許。

printf()的第一個參數是一個格式字符串,由printf()解釋以確定進一步的 arguments 提供了什么。 如果格式字符串包含任何格式規范(例如"%d""%n" ),則printf()將嘗試檢索相應的 arguments。 如果它們實際上沒有傳遞給它,那么它會調用未定義的行為,這是不好的。 攻擊者可以運行你的程序,給它一個包含格式說明符的命令行參數,這將導致這樣的 UB。

使用printf()打印這樣的任意字符串的正確方法是printf("%s", argv[1]);

暫無
暫無

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

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