[英]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中的任何內容都沒有邊界檢查,除非
編譯器作者把它放在那里,或者
你把它放在那里。
很少有編譯器編寫者將邊界檢查合並到他們的產品中,因為它通常會導致生成的代碼更大更慢。 存在一些工具(例如Valgrind 、 Electric 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.