C++/CLI是對的一個擴展,其對所有類型,包括標准C++類,都添加了對屬性、事件、垃圾回收、及泛型的支持。
Visual C++ 2005擴展了對使用C++/CLI(通用語言基礎結構)開發運行於帶有垃圾回收的虛擬機上的控件及應用程序的支持,而C++/CLI是對C++編程語言的一個擴展,其對所有類型,包括標准C++類,都添加了如屬性、事件、垃圾回收、及泛型等特性。
Visual C++ 2005支持.NET Framework通用語言運行時庫(CLR),其是垃圾回收虛擬機Microsoft的實現。Visual C++ 2005對.NET編程的C++語法支持是從Visual C++ .NET 2003中引入的托管擴展C++演化而來的,托管擴展C++仍然被支持,但在傾向於新語法的情況下已不贊成使用。Visual C++ 2005同時也對本地編程添加了新的特性,包括64位處理器架構支持,及提高了安全性的新庫函數。
在本文中,將主要講解在以最小代價把現有老移植到使用CLR的新環境中來時,所要面臨的問題,目的是為了確定這些程序是否仍然易受折磨C/C++程序多年的緩沖區溢出的影響。
例1會要求用戶輸入用戶名及密碼,除去用戶名之外,程序只接受"NCC-1701"為有效的密碼。如果用戶輸入了錯誤的密碼,程序將退出。(這個程序只是作為C++/CLI代碼的漏洞測試,而不是演示如何處理密碼。) 例1:
1. #include <stdlib.h>
2. #include <stdio.h>
3. #include <windows.h>
4. char buff[1028];
5. struct user {
6. char *name;
7. size_t len;
8. int uid;
9. };
10. bool checkpassword() {
11. char password[10];
12. puts("Enter 8 character password:");
13. gets(password);
14. if (strcmp(password, "NCC-1701") == 0) {
15. return true;
16. }
17. else {
18. return false;
19. }
20. }
21. int main(int argc, char *argv[]) {
22. struct user *userP = (struct user *)0xcdcdcdcd;
23. size_t userNameLen = 0xdeadbeef;
24. userP = (struct user *)malloc(sizeof(user));
25. puts("Enter user name:");
26. gets(buff);
27. if (!checkpassword()) {
28. userNameLen = strlen(buff) + 1;
29. userP->len = userNameLen;
30. userP->name = (char *)malloc(userNameLen);
31. strcpy(userP->name, buff); // log failed login attempt
32. exit(-1);
33. }
34. }
程序從21行的main()開始執行,在25及26行使用了一對puts()和gets()來提示輸入用戶名,導致了一個從標准輸入到緩沖區字符數組(聲明在第4行)的不受控制的字符串復制,程序中的這兩處地方都有可能會導致一個緩沖區溢出的漏洞。checkpassword()函數由main()中的27行調用,並在12及13行中提示用戶輸入密碼,這也是使用了一對puts()/gets()。對gets()的第二次調用也會導致一個定義在堆棧上的密碼字符數組緩沖區溢出。