()函數
問:請找出下面代碼裏的問題:
- #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驗證位也變成了非零,