()函式
問:請找出下面程式碼裡的問題:
- #include<stdio.h>
- int main(void) {
- char buff[10]; memset(buff,0,sizeof(buff));
- gets(buff);
- printf("n The buffer entered is [%s]n",buff);
- return 0;
- }
答:上面程式碼裡的問題在於函式gets()的使用,這個函式從stdin接收一個字串而不檢查它所複製的快取的容積,這可能會導致快取溢位。這裡推薦使用標準函式fgets()代替。
py()函式
問:下面是一個簡單的密碼保護功能,你能在不知道密碼的情況下將其破解嗎?
- #include<stdio.h>
- int main(int argc, char *argv[])
- { int flag = 0;
- char passwd[10];
- memset(passwd,0,sizeof(passwd));
- strcpy(passwd, argv[1]);
- if(0 == strcmp("LinuxGeek", passwd)) {
- flag = 1; }
- if(flag)
- { printf("n Password cracked n");
- } else
- { printf("n Incorrect passwd n");
- }
- return 0; }
答:破解上述加密的關鍵在於利用攻破strcpy()函式的漏洞。所以使用者在向“passwd”快取輸入隨機密碼的時候並沒有提前檢查 “passwd”的容量是否足夠。所以,如果使用者輸入一個足夠造成快取溢位並且重寫“flag”變數預設值所存在位置的記憶體的長“密碼”,即使這個密碼無法通過驗證,flag驗證位也變成了非零,