1.gets()函數(shù)
問:請找出下面代碼里的問題:
#include
int main(void)
{
char buff[10];
memset(buff,0,sizeof(buff));
gets(buff);
printf(" The buffer entered is [%s] ",buff);
return 0;
}
答:上面代碼里的問題在于函數(shù)gets()的使用,這個(gè)函數(shù)從stdin接收一個(gè)字符串而不檢查它所復(fù)制的緩存的容積,這可能會導(dǎo)致緩存溢出。這里推薦使用標(biāo)準(zhǔn)函數(shù)fgets()代替。
2.strcpy()函數(shù)
問:下面是一個(gè)簡單的密碼保護(hù)功能,你能在不知道密碼的情況下將其破解嗎?
#include
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(" Password cracked ");
}
else
{
printf(" Incorrect passwd ");
}
return 0;
}
答:破解上述加密的關(guān)鍵在于利用攻破strcpy()函數(shù)的漏洞。所以用戶在向“passwd”緩存輸入隨機(jī)密碼的時(shí)候并沒有提前檢查 “passwd”的容量是否足夠。所以,如果用戶輸入一個(gè)足夠造成緩存溢出并且重寫“flag”變量默認(rèn)值所存在位置的內(nèi)存的長“密碼”,即使這個(gè)密碼無法通過驗(yàn)證,flag驗(yàn)證位也變成了非零。