在這里稍加分析前些日子流傳很火的微軟漏洞。
微軟一直聲稱(chēng)Windows XP多么多么穩定可靠,但日前一位名為Masaru Tsuchiyama的外國編程愛(ài)好者刊出了一小段C語(yǔ)言代碼。這一只有9行的小程序如果在Windows XP/2000下運行,則可導致系統完全崩潰
#include
int main( void )
{
for(;{
printf( "hung up\t\t\b\b\b\b\b\b" );
print("hung up\t\t\b\b\b\b\b\b";
}
return 0;
}
如果去掉Print語(yǔ)句,此程序還會(huì )導致NT 4.0系統出現藍屏錯誤。
\b是退格
代碼是用退格符把console里的光標退成null,
然后顯示任一字符(除\t),即崩潰.
但是一般情況\b是不能退出規定的區域的,
而如\b的前一個(gè)字符是\t則可以退出規定的區域(bug?).
雙擊運行時(shí),系統將新建一個(gè)console,所以我們的顯示在console
的左上角,我們只需兩個(gè)\b就可退出屏幕(第一個(gè)吃掉\t).
原因是win32子系統意外中止導致系統崩潰.smss是windows系統建立的第一個(gè)用戶(hù)進(jìn)程,他的工作之一是建立csrss和winlogon進(jìn)程,然后一直等待這兩個(gè)進(jìn)程的句柄,如果這兩個(gè)進(jìn)程意外中止,
smss將導致系統崩潰.csrss進(jìn)程就是專(zhuān)門(mén)負責所有win32進(jìn)程和系統進(jìn)行通信的進(jìn)程.所有win32進(jìn)程的系統調用都會(huì )由csrss幫你完成,但是這樣做因為需要進(jìn)程切換所以效率太低.所以在windowsNT從3.51升級到4.0時(shí)將許多部分從用戶(hù)態(tài)移入內核態(tài),win32進(jìn)程的系統調用將直接進(jìn)行以減少進(jìn)程切換時(shí)間.但是仍有少量系統調用需要csrss進(jìn)程完成,據我所知createprocess
是這樣的函數,所有console上的顯示是這樣的函數(還有其他的).
當我們調用printf("\t\b\ba")最終將調用WriteFile API.
WriteFile((HANDLE)7,"\t\b\ba",NULL,NULL)等同于
printf("\t\b\ba"),7是console標準輸入的句柄.
WriteFile判斷句柄類(lèi)型,如是文件句柄將調用ntdll.dll中的
NtWriteFile函數.如是console句柄將調用WriteConsoleA函數.
WriteConsoleA函數將調用ntdll.dll中的csrClientCallServer
函數通知csrss進(jìn)程,然后調用NtRequestWaitReplyPort等待結果.
csrss進(jìn)程就是在這出錯退出了
出自
http://hi.baidu.com/yyzzhh911/blog/item/0fd5d9444731302ecffca3d0.html